第一章 开始
WINDEF.H 基本型态定义。
WINNT.H 支持Unicode的型态定义。
WINBASE.H Kernel函数。
WINUSER.H 使用者接口函数。
WINGDI.H 图形设备接口函数。
第二章 UNICODE简介
VC在TCHAR.H中通过_UNICODE来区分UNICODE和DBCS,定义了下列标识符:
TCHAR、__T、_T、_TEXT。
Windows在WINNT.H中能过UNICODE来区分,定义了如下标识符:
TCHAR、TEXT、__TEXT。
所以我们的EVC程序在工程设置里包含了_UNICODE和UNICODE的定义。
第三章 窗口和消息
typedef
struct
...
{
UINT style ;
WNDPROC lpfnWndProc ;
int cbClsExtra ;
int cbWndExtra ;
HINSTANCE hInstance ;
HICON hIcon ;
HCURSOR hCursor ;
HBRUSH hbrBackground ;
LPCTSTR lpszMenuName ;
LPCTSTR lpszClassName ;
}
WNDCLASS,
*
PWNDCLASS ;
要创建窗口,必须注册窗口类或使用预定义的窗口类(如EDIT)。SetClassLong可用来更改用户注册的窗口类,参数表示要更新的项,正数表示cbClsExtra字段,一些定义成负数的宏对应其它字段。
CS_PARENTDC属性使此窗口使用父窗口的DC及其设置,可以改善程序效率。
CS_OWNDC使窗口拥有自己的DC,对DC的更改将一直有效。
UpdateWindow强制刷新。
PAINTSTRUCT ps ;
hdc
=
BeginPaint (hwnd,
&
ps) ;
EndPaint (hwnd,
&
ps) ;
Paint消息的处理都应该放在这两者之间,BeginPaint处理准备绘图环境,根据窗口无效区设置绘制区域并将窗口无效区设为有效等一系列操作,WM_ERASEBKGND消息也是这时发出的,若不调用这个函数,系统认为窗口需要重画,会继续发Paint消息,导致CPU占用率100%,CPaintDC的构造函数会自动调用BeginPaint,析构函数会调用EndPaint,是MFC下的替代品。
PostQuitMessage (0) 将导致程序退出消息循环。
第四章 输出文本
ScrollWindow可滚动窗口。
GetDC后必须调用ReleaseDC。
第五章 图形基础
SaveDC 和RestoreDC可快速还原被改动的DC环境。
SetBkMode设置背景模式,透明或用背景色填充。
SetROP2设置画笔和目标的颜色结合方式。
SetPolyFillMode设置多边形填充方式。
SetMapMode设置映射方式。关于各种映射方式本书讲得比较清楚。
第六章 键盘
WINDOWS设置了两个消息队列,系统消息队列是单独的消息队列,用来初步保存键盘和鼠标消息,应用程序消息队列中保存的消息带有窗口句柄,只能被特定窗口处理。设置了系统消息队列才能让按键传到正确的窗口。
按键消息中WPARAM参数为键码,LPARAM是环境参数,基本不用。
GetKeyState返回按键当时的换档键状态,小于0表示按下。GetAsyncKeyState返回当前换档键状态。
一个键被按下时,先收到KEYDOWN消息,在TranslateMessage函数中得到相应的CHAR消息,所以按一下键有三个消息:依次为KEYDOWN、CHAR、KEYUP。
按键消息只能被拥有焦点的控件收到,但MFC中对话框可以通过PreTranslateMessage函数接收按键消息。
主要有五个插入符号函数:
CreateCaret 建立与窗口有关的插入符号
SetCaretPos
在窗口中设定插入符号的位置
ShowCaret
显示插入符号
HideCaret
隐藏插入符号
DestroyCaret
撤消插入符号
一个消息队列只能支持一个插入符。HideCaret有累积效果。
第七章 鼠标
鼠标消息中WPARAM参数指示鼠标键和CTRL及SHIFT键的状态,LPARAM为坐标,低字是X坐标,高字为Y坐标。
非客户区鼠标消息中WPARAM参数为点击区域(HT开头的标识符),LPARAM为屏幕坐标。
命中测试消息WM_NCHITTEST是第一个鼠标消息。这个消息中再根据点击位置给出其它消息。
窗口类风格中必须包含CS_DBLCLKS才能收到双击消息。双击消息之前必然有一个单击消息,设计双击功能时需要注意这点。
ShowCursor函数可显示或隐藏鼠标光标。
SetCapture用来捕获鼠标,窗口中存在拖动逻辑时通常要用到这个。
鼠标滚轮消息:WM_MOUSEWHEEL,lParam为鼠标的屏幕位置,另外,wParam的低字组包含一系列的旗标,用于表示鼠标按键、Shift与Ctrl键的状态。新的信息保存在wParam的高字组。其中有一个「delta」值,该值目前可以是120或-120,这取决于滑轮的向前转动还是向后转动。
第八章 计时器
WIN98下计时器的分辨率为55毫秒,WINNT下为10毫秒。WM_TIMER消息跟WM_PAINT消息一样,消息队列中只维持一个,不能精确计时。
设置计时器的三种方式:
SetTimer (hwnd, iTimerID, iMsecInterval, NULL) ;
SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;
iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ;
第三种方式较少使用。
GetLocalTime取得本地时间,GetSystemTime取得国际时间。
第九章 控件
GetDialogBaseUnits返回字符的宽高,低字为宽,高字为高。
最初子控件通过WM_COMMAND消息通知父窗口。WPARAM的低字为控件ID,高字为通知码,LPARAM为控件句柄。父窗口则通过特定消息控制子控件。
只有包含BS_NOTIFY风格的按钮才能向父窗口发送BN_SETFOCUS和BN_KILLFOCUS通知,通知码BN_DOUBLECLICKED只对BS_RADIOBUTTON、BS_AUTORADIOBUTTON和BS_OWNERDRAW按钮发送,或者当按钮样式中包括BS_NOTIFY时,也为其它按钮发送。
作用于多个控件的功能是对话框管理器的作用。
GetSysColor用来取得系统颜色,要使用系统颜色作背景画刷,使用wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;即可。
EVC中的CBitmapButton是用自绘制按钮实现的,而不是系统自带的BS_BITMAP风格按钮。
LB_DIR可让列表框列出文件。
第十章 菜单及其他资源
IDI_ICON ICON DISCARDABLE "icondemo.ico"
DISCARDABLE关键词指出,必要时Windows可以从内存中丢弃图标,以获得额外的空间。之后不需要程序任何特定的操作,Windows就能够重新加载图示。DISCARDABLE属性是内定的,不需要指定。只有在名称和目录路径包含空格时,Developer Studio才将文件名加上引号。
资源标识符可以使用字符串。
hResource = LoadResource (hInstance, FindResource (hInstance, TEXT ("BINTYPE"),
MAKEINTRESOURCE (IDR_BINTYPE1))) ;
pData = LockResource (hResource) ;
FreeResource (hResource) ;
菜单消息跟控件通知消息类似,但没有通知码和控件句柄。WM_INITMENU消息中可更新菜单,但MFC中一般在UPDATE_COMMAND中处理。
While (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateAccelerator (hwnd, hAccel, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
加速键在消息循环中处理,不管焦点在哪,都可以起作用。
如果要在程序结束之前要求使用者的确认,必须处理WM_CLOSE和WM_QUERYENDSESSION这两个消息。当使用者要关闭Windows时,Windows开始向每个窗口消息处理程序发送一个WM_QUERYENDSESSION消息。如果有任何一个窗口消息处理程序处理这个消息后传回0,那么Windows将不会结束。
第十一章 对话框
对话框资源使用特殊的坐标系统,该系统只用于对话框模板。数字依据对话框使用字体的大小而定:x坐标和宽度的单位是字符平均宽度的1/4;y坐标和高度的单位是字符高度的1/8。
对话框过程不是窗口过程,它是对话框管理器调用的回调函数,它不接收WM_CREAT消息,而是在特殊的WM_INITDIALOG消息处理期间执行初始化操作。这个消息处理过程如果传回TRUE,那么Windows将输入焦点设定给对话框中第一个具有WS_TABSTOP样式的控件。也可以自己设置焦点,然后返回FALSE。
模式对话框有自己的消息循环,但还是可以向它的父窗口发送消息。
资源文件中对话框描述中使用CLASS "class-name"可以指定自己的对话框窗口过程。使用CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight可以插入自定义控件。
Windows使用DialogBox或带参数的DialogBoxParam函数来启动模式对话框,EVC下的MFC则自定义了一个消息循坏。
对话框管理器使用WS_TABSTOP风格来定位TAB键的处理,使用WS_GROUP风格来定位方向键的处理。一组单选框内第一个按钮具有WS_GROUP风格,标识了一组按钮的开始,静态文本和图标则默认含有WS_GROUP风格,可以表示一组按钮的结束,若紧接着的是另一组按钮或GroupBox等则需手工加上WS_GROUP风格。用方向键改变当前选项时,WS_TABSTOP风格跟着移动。使用GetNextDlgTabItem函数和GetNextDlgGroupItem函数可以找到下一个控件。
第十二章 剪贴板
hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLength + 1) ;
pGlobal = GlobalLock (hGlobal) ;
for (i = 0 ; i < wLength ; i++)
*pGlobal++ = *pString++ ;
GlobalUnlock (hGlobal) ;
OpenClipboard (hwnd) ;
EmptyClipboard () ;
SetClipboardData (CF_TEXT, hGlobal) ;
CloseClipboard () ;
第十三章 使用打印机
略
第十四章 位图和Bitblt
第十五章 与设备无关的位图
第十六章 调色板管理器
第十七章 文字和字体
第十八章 元文件
第十九章 多文档界面
第二十章 多任务和多线程
第二十一章 动态链接库
第二十二章 声音与音乐
第二十三章 领略Internet