MFC教程(12)-- 对话框和对话框类CDialog(2)
2010-03-25 20:34:58 来源:WEB开发网回顾视窗口的创建过程,Create函数被CFrameWnd::CreateView所调用,参数nID取值AFX_IDW_PANE_FIRST。由于CreateDlg设置对话框窗口的ID为对话框模板的ID,所以需要调用函数SetDlgCtrlID(nID)设置视窗口ID为nID(即AFX_IDW_PANE_FIRST)。
由于CFormView是从CScrollView继承,所以调用SetScrollSize设置映射模式,窗口尺寸等。
完成上述动作之后,初始化对话框的控制子窗口。
最后,必要的话,显示视窗口。
这样,一个无模式对话框被创建,它被用作当前MDI窗口或者MDI子窗口的视。如同CDialog的消息处理一样,必要时,消息或者事件将传递给视原来的窗口过程(无模式对话框的原窗口过程)处理,其他的消息处理和通常视一样。
由于是调用对话框创建函数创建视窗口,所以不能向::CreateWindowEX传递创建上下文指针,于是把它保存到成员变量m_pCreateContext中,在OnCreate时使用。OnCreate的实现如下:
int CFormView::OnCreate(LPCREATESTRUCT lpcs)
{
//既然不能通过CreateDialog使用参数传递的方法得到创建上下文
//参数,则使用一个成员变量来传递
return CScrollView::OnCreate(lpcs);
}
CFormView的消息预处理
现在,讨论CFormView 的PreTranslateMessage函数。CDialog覆盖函数PreTranslateMessage的主要目的是处理Tooltip消息、Escape键盘消息和Dialog消息。CFormView覆盖该函数的目的是处理Tooltip消息和Dialog消息。CFormView和CDialog不同之处在于CFormView是一个视,故在把键盘消息当Dialog消息处理之前,必须优先让其父窗口检查按下的键是否是快捷键。PreTranslateMessage函数实现如下:
BOOL CFormView::PreTranslateMessage(MSG* pMsg)
{
ASSERT(pMsg != NULL);
ASSERT_VALID(this);
ASSERT(m_hWnd != NULL);
//过滤Tooltip消息
if (CView::PreTranslateMessage(pMsg))
return TRUE;
//SHIFT+F1上下文帮助模式下,不处理Dialog消息
CFrameWnd* pFrameWnd = GetTopLevelFrame();
if (pFrameWnd != NULL && pFrameWnd->m_bHelpMode)
return FALSE;
//既然IsDialogMessage将把窗口快捷键解释成Dialog消息
//所以在此先调用所有父边框窗口的消息预处理函数
pFrameWnd = GetParentFrame(); // start with first parent frame
while (pFrameWnd != NULL)
{
// allow owner & frames to translate before IsDialogMessage does
if (pFrameWnd->PreTranslateMessage(pMsg))
return TRUE;
// try parent frames until there are no parent frames
pFrameWnd = pFrameWnd->GetParentFrame();
}
// 过滤来自子窗口的消息或者给对话框的消息
return PreTranslateInput(pMsg);
}
由于CFormView是一个视,不是模式对话框,所以它首先要把消息给父窗口(MDI子窗口或者MDI窗口)预处理,如果它们不能处理,则调用PreTranslateInput来过滤Dialog消息。
CFormView的输入焦点
CFormView另一个特性是:在和用户交互中,如果用户离开视窗口,则必须保存CFormView视的哪个控制子窗口拥有输入焦点,以便在重新激活视窗口时,原来的那个窗口重新获得输入焦点。所以,CFormView覆盖了虚拟函数OnActivateView和OnActiveFrame,以便在视窗口失去激活时把它的当前输入焦点保存到成员变量m_hWndFocus中。
为了在适当时候恢复输入焦点,CFormView覆盖了消息处理函数OnSetFocus,以便在视获得输入焦点时把输入焦点传递给m_hWndFocus(如果非空)。
至此,MFC实现对话框的处理分析完毕。
在后面要讨论的工具条等控制窗口,类似于对话框也具备由Windows提供的窗口过程,MFC在SDK的特定控制窗口创建函数的基础上,提供了MFC的窗口创建函数,使用MFC的窗口过程取代了它们原来的窗口过程,然后在必要的时候调用Default把有关消息和事件传递给原来的窗口过程处理。
更多精彩
赞助商链接