|
[VC++学习]《精通MFC》——第三章(II) 读书笔记
|
如果将CWnd对象依附到一个已有的窗体,那么一定要在操作完窗体后,将 CWnd对象和窗体句柄分离,否则在CWnd对象销毁时会销毁窗体。
如果希望销毁窗体时,清理掉附属的MFC对象,可重载CWnd的OnNcDestroy 成员:
Void CWzdWnd::OnNcDestroy()
{
CWnd::OnNcDestroy();
delete this;
}
定位窗体
CWnd提供了一组成员函数负责管理窗体的位置和大小。最主要的成员函数是MoveWindow和SetWindowPos
Void MoveWindow(
Int x,
Int y,
Int nWidth,
Int nHeight,
BOOL bRepaint = TRUE
);
Void MoveWindow(
LPCRECT lpRect,
BOOL bRepaint = TRUE
);
bRepaint为TRUE,使窗体移动后会向窗体发送一个WM_PAINT消息,从而重新绘制窗体内容。
下面的代码演示了如何将一个编辑框控件移动到静态文本框所在的位置:
演示代码: P80
BOOL SetWindowPos(
Const CWnd* pWndInsertAfter,
Int x,
Int y,
Int cx,
Int cy,
UINT nFlags
);
PwndInsertAfter表示窗口的Z序,它可以为下面几个值:
wndBotton:将窗口放入Z序的底部。
wndTop:将窗口放在Z序的顶部。
wndTopMost:将窗口放在所有非顶部窗口的顶部。即使该窗体处于非活动状态。
wndNoTopMost:将窗口放在所有非顶部的窗口的顶部,如果窗体是非顶部的窗体,则其Z序不变。
SWP_NOZORDER:此时将忽略pWndInsertAfter参数,维持窗体的Z序不变。
SWP_NOMOVE:此时将忽略x、y参数而维持窗口的坐标不变。
SWP_NOSIZE:此时将忽略cx、cy参数而维持窗口的大小不变。
SWP_NOREDRAW:不重绘窗口。
SWP_HIDEWINDOW:隐藏窗口。
SWP_SHOWWINDOW:显示窗口。
SWP_NOOWNERZORDER:不改变属于主窗口的Z序。
当MoveWindow()函数移动和/或重置窗口大小的时候发生时,CWnd的下列虚方法将被依次调用:
OnWindowPosChanging:用以通知窗口的X,Y甚至Z坐标将要改变。
OnGetMinMaxInfo:允许派生类设置窗口大小的限制。
OnNcCalcSize():给派生类机会以改变窗口客户区的大小。
OnWindowPosChanged:用于通知隐藏的窗口被显示并且将要发送WM_SIZE和WM_MOVE消息。
OnSize:通知窗口大小正在改变。
OnMove:通知窗口正在移动。
绘图
窗体是通过响应WM_PAINT消息进行绘图的。当窗口的可见区域发生了变化时,系统就发送该消息以通知窗体需要绘制。用户通过调用UpdateWindow或RedrawWindow也能直接向窗口发送WM_PAINT消息。
CWnd类预先定义了响应WM_PAINT消息的虚拟成员OnPaint,下面是其实现代码:
Void CView::OnPaint()
{
//标准实现
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
在其构造函数中,CpaintDC会调用CWnd::BeginPaint,而在其析构函数种又会自动调用CWnd::EndPaint。CWnd的BeginPaint成员会初始化设备上下文对象,设备上下文对象表示绘图的环境,包含了要重绘的区域、绘图工具等信息。
窗口区域分成客户区和非客户区两部分。非客户区的绘制一般由系统负责,客户区则由CWnd::OnPaint负责。
非客户区包括菜单、标题栏、滚动条等区域。绘制非客户区跟绘制客户区的时机相同。在CWnd::BeginPaint返回前,要发送WM_NCPAINT和WM_ERASEBKGND消息。应用程序通过响应WM_NCPAINT消息绘制非客户区的内容。
下面的代码在框架窗口的标题栏绘制图形:
void CMainFrame::OnNcPaint()
{
CMDIFrameWnd::OnNcPaint();
//绘制标题
DrawTitle();
}
另一个消息WM_ERASEBKGND通知窗体擦除背景并重新绘制背景。在默认情况下DefWindowProc处理该消息。DefWindowProc将擦除原来的背景,并用窗口结构中指定的刷子重绘背景。如果要自定义背景,只要编写代码处理WM_ERASEBKGND消息即可。
消息处理
WindowProc
消息首先被传递给窗体到WindowProc成员,下面是WindowProc的实现:
|
|
|
|