4.1绘制和更新
以下情况下窗口消息处理程序会接收到一个WM_PAINT消息:
1.在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。
2.使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。
3.程序使用ScrollWindow或ScrollDC函数滚动显示区域的一部分。
4.程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息。
以下情况下,Windows可能发送WM_PAINT消息
1.Windows擦除覆盖了部分窗口的对话框或消息框。
2.菜单下拉出来,然后被释放。
3.显示工具提示消息。
有效矩形和无效矩形:
窗口消息处理程序一旦接收到WM_PAINT消息之后,就准备更新整个显示区域,但它经常只需要更新一个较小的区域。只有在显示区域的某一部分失效时,窗口才会接受WM_PAINT消息。
无效矩形:包含了包围无效区域的最小矩形的坐标以及其它信息。窗口消息处理程序可以通过呼叫InvalidateRect使显示区域内的矩形无效。GetUpdateRect:可以在任何时候取得无效矩形的坐标。
在处理WM_PAINT消息处理期间,窗口消息处理程序在呼叫了BeginPaint之后,整个显示区域即变为有效。程序也可以通过呼叫ValidateRect函数使显示区域内的任意矩形区域变为有效。如果这呼叫具有令整个无效区域变为有效的效果,则目前队列中的任何WM_PAINT消息都将被删除。
4.2GDI 简介
要在窗口的显示区域绘图,可以使用Windows的图形设备接口(GDI)函数。TextOut (hdc, x, y, psText, iLength) ;//最为普遍的文字输出函数。每个GDI函数都需要将设备内容句柄作为函数的第一个参数。设备内容句柄是GDI函数的窗口。
取得设备内容句柄:方法一
在处理WM_PAINT消息时,使用BeginPaint和EndPaint两个函数,这两个函数需要窗口句柄(作为参数传给窗口消息处理程序)和PAINTSTRUCT结构的变量(在WINUSER.H表头文件中定义)的地址为参数。
绘图信息结构
typedef struct tagPAINTSTRUCT
{
HDC hdc ;//设备内容句柄
BOOL fErase ;//FALSE(0),意味着Windows已经擦除了无效矩形的背景
RECT rcPaint ;//rcPaint矩形不仅是无效矩形,它还是一个「剪取」矩形
BOOL fRestore ;
BOOL fIncUpdate ;
BYTE rgbReserved[32] ;
} PAINTSTRUCT ;
取得设备内容句柄:方法二
hdc = GetDC (hwnd) ;
ReleaseDC (hwnd, hdc) ;
得到窗口显示区域的设备内容句柄,可以呼叫GetDC来取得句柄,在使用完后呼叫ReleaseDC.与从BeginPaint传回设备内容句柄不同,GetDC传回的设备内容句柄具有一个剪取矩形,它等于整个显示区域.与BeginPaint不同,GetDC不会使任何无效区域变为有效。一般可以呼叫GetDC和ReleaseDC来对键盘消息(如在字处理程序中)和鼠标消息(如在画图程序中)作出反应。此时,程序可以立刻根据使用者的键盘或鼠标输入来更新显示区域,而不需要考虑为了窗口的无效区域而使用WM_PAINT消息。
GetDC传回用于写入窗口显示区域的设备内容句柄,而GetWindowDC传回写入整个窗口的设备内容句柄。例如,可以使用从GetWindowDC传回的设备内容句柄在窗口的标题列上写入文字。
TextOut:细节:
TextOut (hdc,//设备内容句柄
x, y, //,x是水平位置,y是垂直位置.显示区域内字符串的开始位置
psText,//指向字符串的指针
iLength) ;//是字符串中字符的个数.如果psText指向Unicode字符串,则字符串中的字节数就是iLength值的两倍
系统字体:
内定字体为「系统字体」,或用Windows表头文件中的标识符,即SYSTEM_FONT。Windows启动后,系统字体的大小就不会发生改变。
字符大小:
GetTextMetrics取得字体大小。要使用GetTextMetrics函数,需要先定义一个结构变量
TEXTMETRIC tm ;//TEXTMETRIC结构提供了关于目前设备内容中选用的字体的丰富信息
static int cxChar, cyChar ;//来保存平均字符宽度(cxChar)和总的字符高度(cyChar)
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC(hwnd, hdc);
GetSystemMetrics函数以取使用者接口上各类视觉组件大小的信息。它在程序中完成与设备无关图形输出的重要函数。
4.3滚动条:
需要在CreateWindow的第三个参数中包括窗口样式(WS)标识符WS_VSCROLL(垂直卷动)和/或WS_HSCROLL(水平卷动)即可。
SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw);参数iBar为SB_VERT或者SB_HORZ,iMin和iMax分别是范围的最小值和最大值。如果想要Windows根据新范围重画滚动条,则设置bRedraw为TRUE。iPos是新位置,它必须在iMin至iMax的范围内。
Windows提供了类似的函数(GetScrollRange和GetScrollPos)来取得滚动条的目前范围和位置。SetScrollPos来改变卷动方块的位置。
在用鼠标单击滚动条或者拖动卷动方块时,Windows给窗口消息处理程序发送WM_VSCROLL(供上下移动)和WM_HSCROLL(供左右移动)消息。在滚动条上的每个鼠标动作都至少产生两个消息,一条在按下鼠标按钮时产生,一条在释放按钮时产生。当释放鼠标键后,程序会收到一个带有SB_ENDSCROLL通知码的消息。当把鼠标的光标放在卷动方块上并按住鼠标键时,就产生了带有SB_THUMBTRACK和SB_THUMBPOSITION通知码的滚动条消息。
SYSMETS.h
SYSMETS1.cpp