}
CWnd* CFrameWnd::CreateView(CCreateContext* pContext, UINT nID)
{
ASSERT(m_hWnd != NULL);
ASSERT(::IsWindow(m_hWnd));
ASSERT(pContext != NULL);
ASSERT(pContext->m_pNewViewClass != NULL);
//应用运行类信息,动态创建视图对象
CWnd* pView = (CWnd*)pContext->m_pNewViewClass->CreateObject();
if (pView == NULL)
{
TRACE1(“Warning: Dynamic create of view type %hs failed.\n”, pContext->m_pNewViewClass->m_lpszClassName);
return NULL;
}
ASSERT_KINDOF(CWnd, pView);
//使用已经创建的视图对象创建视图窗口
if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, nID, pContext))
{
TRACE0(“Warning: could not create view for frame.\n”);
return NULL; //can’t continue without a view
}
//根据视图窗口的边界风格调整框架窗口风格
if (afxData.bWin4 && (pView->GetExStyle() & WS_EX_CLIENTEDGE))
{
//如果视图已经设置了凹陷边框,去除主窗口的凹陷边框
ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_FRAMECHANGED);
}
return pView;
}
一个主窗口可能包含多个视图,它们或者是通过CSpliterWnd在客户区拆分创建的,或者是直接在客户区以子窗口形式创建。框架规定只能有一个活动视图,如果不使用拆分,同时只能显示一个视图。在主框架窗口创建后(视图也已创建),一般要调用CFrameWnd::InitialUpdateFrame()进行初始化,该函数首先设置第一视图(ID为AFX_IDW_PANE_FIRST)为活动视图,然后向所有视图发送初始化消息,确保每个视图CView::OnInitialUpdate()被调用。
可以调用CFrameWnd::SetActiveView()及CFrameWnd::GetActiveView()设置或取得活动视图。在设置活动视图后,应该将活动视的ID切换为AFX_IDW_PANE_FIRST,因为有些操作是只针对第一视图的。例如,只有第一视图才能与控制条争夺主窗口客户区的空间,所以其他视图无法在主框架窗口中正常显示(如果不使用拆分)。
管理控制条
主框架窗口的直观特点是被丰富的控制条装饰的,如工具条、状态条等,它们都派生于基类CControlBar。当鼠标移到工具条或某菜单项区域时,相应的提示信息会在状态栏显示或以Tip形式弹出;没有建立消息映射的命令会自动禁止;客户区发生变化时视图和控制条会自动排列。这一切都是CFrameWnd封装的功能。下面列举几个重要的控制条操作函数。
EnableDocking(): 允许控制条在自己的客户区依靠。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30960-3.html
你和他们差不多
你知道美国在我周边煽动别国闹事
xihuan
谢作诗我看叫谢死
猪狗不如的教授