MFC教程(12)-- 对话框和对话框类CDialog(2)
2010-03-25 20:34:58 来源:WEB开发网覆盖的虚拟函数
CWnd的CalcWindowRect
CView的OnPrepareDC、OnScroll、OnScrollBy
用于DEBUG的Dump和AssertValid
这里,覆盖的消息处理函数和虚拟函数共同完成对滚动条、滚动消息的处理。
在CSrcollView的实现涉及到许多和Windows映射模式、坐标转换等相关的函数的使用。这里,不作具体讨论。
CFormView
CFormView派生于CSrcollView,本身没有增加新的函数,但覆盖了一些基类的虚拟函数,增加了几个成员变量(以下列出的不包含OLE处理)。
增加的成员变量
LPCTSTR m_lpszTemplateName;
CCreateContext* m_pCreateContext;
HWND m_hWndFocus; // last window to have focus
m_lpszTemplateName用来保存创建视图的对话框模板的名称,_pCreateContext用来保存创建上下文,m_hWndFocus用来保存最近一次拥有焦点的控制窗口。在构造CFormView对象时,构造函数把有关信息保存到成员变量中,如下所示:
CFormView::CFormView(LPCTSTR lpszTemplateName)
{
m_lpszTemplateName = lpszTemplateName;
m_pCreateContext = NULL;
m_hWndFocus = NULL; // focus window is font
}
覆盖的虚拟函数
virtual void OnDraw(CDC* pDC); // MFC缺省处理空
virtual BOOL Create(LPCTSTR, LPCTSTR, DWORD,
const RECT&, CWnd*, UINT, CCreateContext*);
virtual BOOL PreTranslateMessage(MSG* pMsg);
virtual void OnActivateView(BOOL, CView*, CView*);
virtual void OnActivateFrame(UINT, CFrameWnd*);
创建基于对话框的视窗口,不同于创建普通视窗口(前者调用CWnd::CreateEx,后者调用CWnd::CreateDlg),故需要覆盖Create虚拟函数。
覆盖PreTranslateMessage是为了过滤对话框消息,把一些消息让CFormView对象来处理。
覆盖了两个消息处理函数:
afx_msg int OnCreate(LPCREATESTRUCT lpcs);
afx_msg void OnSetFocus(CWnd* pOldWnd);
下面,分析几个函数作。Create函数解释了MFC如何使用一个对话框作为视的方法,PreTranslateMessage显示了CFormView不同于CDialog的实现。
更多精彩
赞助商链接