一、Windows模态对话框—在对话框上画图
ABOUT2还完成了一些相对说来很特别的事情,亦即在对话框上画图。让我们来看一看它是怎样做的。在ABOUT2.RC的对话框模板内,使用位置和大小为我们想要画图的区域定义了一块空白文字控件:
LTEXT "" IDC_PAINT, 114, 67, 72, 72
这个区域为18个字符宽和9个字符高。由于这个控件没有文字,所以窗口消息处理程序为「静态」类别所做的工作,只是在必须重绘这个子窗口控件时清除其背景。
在目前颜色或图形选择发生改变,或者对话框自身获得一个WM_PAINT消息时,对话框过程调用PaintTheBlock,这个函数在ABOUT2.C中:
PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
在AboutDlgProc中,窗口句柄hCtrlBlock已经在处理WM_INITDIALOG消息时被设定:
hCtrlBlock = GetDlgItem (hDlg, IDD_PAINT) ;
下面是PaintTheBlock函数:
void PaintTheBlock (HWND hCtrl, int iColor, int iFigure) { InvalidateRect (hCtrl, NULL, TRUE) ; UpdateWindow (hCtrl) ; PaintWindow (hCtrl, iColor, iFigure) ; }
这个函数使得子窗口控件无效,并为控件窗口消息处理程序产生一个WM_PAINT消息,然后呼叫ABOUT2中的另一个函数PaintWindow 。
PaintWindow函数取得一个设备内容句柄,并将其放到hCtrl中,画出所选图形,根据所选颜色用一个着色画刷填入图形。子窗口控件的大小从GetClientRect获得。尽管对话框模板以字符为单位定义了控件的大小,但GetClientRect取得以图素为单位的尺寸。您也可以使用函数MapDialogRect将对话框中的字符坐标转换为显示区域中的图素坐标。
我们并非真的绘制了对话框的显示区域,实际绘制的是子窗口控件的显示区域。每当对话框得到一个WM_PAINT消息时,就令子窗口控件的显示区域失效,并更新它,使它确信现在其显示区域又有效了,然后在其上画图。