VS2010创建的MFC单文档工程中,菜单栏也是可停靠,本文简单分析一下停靠菜单的创建过程。
首先呢,给出一下类图结构
CMainFrame有一个 CMFCMenuBar m_wndMenuBar 成员,从名字中可以推断出它代表了菜单。
从继承路径上可以看出,CMFCMenuBar是从CPane继承而来。CPane提供了停靠的功能,所以这个m_wndMenuBar所代表的窗口也具有了停靠功能。
m_wndMenuBar所指代的窗口不是跟主框架窗口不是同一个窗口,它是主框架的子窗口,那么必定是在某个地方它将主框架的菜单栏“搬到”了自己内部,答案得从CMainFrame::OnCreate函数找起:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
BOOL bNameValid;
// 基于持久值设置视觉管理器和样式
OnApplicationLook(theApp.m_nAppLook);
if (!m_wndMenuBar.Create(this))
{
TRACE0("未能创建菜单栏\n");
return -1; // 未能创建
}
// 此处略去n行
return