1.客户区(Client Area):整个应用程序窗口中未被标题栏,窗口边框以及可选的菜单栏,工具栏,状态栏和滚动条占据的部分。
2.WM_PAINT消息产生:
(1)在用户移动窗口或显示窗口时,窗口中先前隐藏的区域重新可见;
(2)用户改变窗口的大小。
(3)程序使用ScrollWindow或ScrollDC函数滚动客户区的一部分;
(4)程序使用InvalidateRect或InvalidateRgn函数显式产生WM_PAINT消息
(5)覆盖了部分窗口的对话框或消息框被移开;
(6)菜单下拉出来,然后被释放;
(7)显示工具提示;
Windows为每个窗口保存一个绘图信息结构体:PAINTSTRUCT,
无效矩形:包围无效区域的最小矩形
两个函数:
(1)InvalidateRect:使客户区的矩形区域无效
BOOL InvalidateRect(
HWND hWnd, // handle of window with changed update region
CONST RECT *lpRect,
// address of rectangle coordinates
BOOL bErase // erase-background flag
);
如:InvalidateRect(hwnd,NULL,TRUE);//使整个客户区变为无效,并擦除背景
(2)ValidateRect:使客户区内的任意矩形区域变为有效.
BOOL ValidateRect(
HWND hWnd, // handle of window
CONST RECT *lpRect
// address of validation rectangle coordinates
);
如:ValidateRect(hwnd,NULL); //使整个客户区有效
3.设备描述表(Device Context)
(1)DC是GDI内部保存的数据结构,与特定的显示设备相关.
(2)程序绘图前,必须先获取设备描述表句柄
(3)程序绘图完后,必须释放设备描述表句柄.句柄释放后不再有效.
(4)获得DC的方法
方法一:在处理WM_PAINT消息时,使用BeginPaint和EndPaint两个函数
HDC hdc;
hdc=BeginPaint(hwnd,&ps);
[GDI functions]
EndPaint(hwnd,&ps);
注:
①BeginPaint函数一般在准备绘制时导致无效区域的背景被擦除,使无效区域变为有效,从而整个客户区变为有效.
②BeginPaint和EndPaint必须成对调用.
③若窗口过程函数不处理WM_PAINT消息,则应传递给DefWindowProc处理.
方法二:在处理非WM_PAINT消息时,使用GetDC和ReleaseDC函数
hdc=GetDC(hwnd);
[GDI functions]
ReleaseDC(hwnd,hdc);
注:
①GetDC不会使无效区域变为有效.
②GetDC和ReleaseDC必须成对调用.
★总结:BeginPaint和GetDC的异同
相同:
①都返回设备描述表句柄hdc
②都必须成对使用.
③BeginPaint在处理WM_PAINT消息时使用,GetDC在处理非WM_PAINT消息时使用.
不同:
①BeginPaint会导致无效区域变为有效,而GetDC不会.
②BeginPaint获得的hdc,默认的剪取区域为无效区域,而GetDC获得的hdc,默认的剪取区域为整个客户区.
4.输出文本
方法一:DrawText
useage:
int DrawText(
HDC hDC, // handle to device context
LPCTSTR lpString, // pointer to string to draw
int nCount, // string length, in characters
LPRECT lpRect, // pointer to struct with formatting dimensions
UINT uFormat // text-drawing flags
);
注:If nCount is –1, then the lpString parameter is assumed to be a pointer to a null-terminated string and DrawText computes the character count automatically.
例:
HDC hdc;
RECT rect;
GetClientRect(hwnd,&rect);
DrawText(hdc,TEXT("Hello,Beijing!"),-1,&rect,DT_SINGLELINE|DT_CENTER |DT_VCENTER);
方法二:TextOut
useage:
BOOL TextOut(
HDC hdc, // handle to device context
int nXStart, // x-coordinate of starting position
int nYStart, // y-coordinate of starting position
LPCTSTR lpString, // pointer to string
int cbString // number of characters in string
);
例:
TCHAR szbuffer[100];
TextOut(hdc,200,200,szbuffer,wsprintf(szbuffer,"Hello,Beijing!"));
注:sprintf(在<stdio.h>中定义)/wsprintf:将指定字符串存储到szbuffer中,返回字符串长度