第一种方式是在此view的对应doc模板CFrameWnd子类的OnCreate函数中添加创建代码
由于mdi的模板多个view可能是公用一个CFrameWnd子类。此方法控制不太灵活但是简单
第二种方式即在view的OnCreate函数中创建
int
CXxxView::OnCreate(LPCREATESTRUCT lpCreateStruct)
... {
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// 创建工具栏
CMDIChildWnd * pFrame = (CMDIChildWnd*)GetParentFrame();
if (!m_wndToolBar.Create(pFrame) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
...{
TRACE0("Failed to create doc view ");
return -1; // fail to create
}
// 其他工具栏的或者dockable窗口的创建
.......
// 停靠设置
m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP);
pFrame->EnableDocking(CBRS_ALIGN_ANY);
pFrame->DockControlBar(&m_wndToolBar);
return 0;
}
... {
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// 创建工具栏
CMDIChildWnd * pFrame = (CMDIChildWnd*)GetParentFrame();
if (!m_wndToolBar.Create(pFrame) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
...{
TRACE0("Failed to create doc view ");
return -1; // fail to create
}
// 其他工具栏的或者dockable窗口的创建
.......
// 停靠设置
m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP);
pFrame->EnableDocking(CBRS_ALIGN_ANY);
pFrame->DockControlBar(&m_wndToolBar);
return 0;
}
这种方式控制较为灵活每个view的工具栏可以独立控制
第三种方式即在view中再创建一个CFrameWnd的窗口然后贴在view上
首先编写继承于CFrameWnd的一个子类例如CDockFrame,然后实现以下方法
virtual
BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext
*
pContext)
... {
//在此Frame中增加默认的视图模板并创建
CCreateContext context;
pContext = &context;
pContext->m_pNewViewClass = RUNTIME_CLASS(CHtmlView); // CHtmlView可以替换为其它继承于CView的类但是不能是CView本身
CView *pView = CreateView(pContext);
SetActiveView(pView);
// 如果需要拆分窗口可创建一个分割的CSplitterWnd窗口
//if (!m_wndSplit.CreateStatic(this, 2, 1))
//{
// TRACE0("Failed to CreateStaticSplitter ");
// return FALSE;
//}
//
//m_wndSplit.CreateView(0, 0, RUNTIME_CLASS(CHtmlView), CSize(600, 400), pContext);
//m_wndSplit.CreateView(1, 0, RUNTIME_CLASS(CDocListView), CSize(600, 100), pContext);
return TRUE;
}
int OnCreate(LPCREATESTRUCT lpCreateStruct)
... {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// 和第一种方法一样创建各种工具栏
if (!m_wndToolBar.CreateEx(this) || !m_wndToolBar.SetButtons(lpBtn, 5))
...{
return -1;
}
......
}
... {
//在此Frame中增加默认的视图模板并创建
CCreateContext context;
pContext = &context;
pContext->m_pNewViewClass = RUNTIME_CLASS(CHtmlView); // CHtmlView可以替换为其它继承于CView的类但是不能是CView本身
CView *pView = CreateView(pContext);
SetActiveView(pView);
// 如果需要拆分窗口可创建一个分割的CSplitterWnd窗口
//if (!m_wndSplit.CreateStatic(this, 2, 1))
//{
// TRACE0("Failed to CreateStaticSplitter ");
// return FALSE;
//}
//
//m_wndSplit.CreateView(0, 0, RUNTIME_CLASS(CHtmlView), CSize(600, 400), pContext);
//m_wndSplit.CreateView(1, 0, RUNTIME_CLASS(CDocListView), CSize(600, 100), pContext);
return TRUE;
}
int OnCreate(LPCREATESTRUCT lpCreateStruct)
... {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// 和第一种方法一样创建各种工具栏
if (!m_wndToolBar.CreateEx(this) || !m_wndToolBar.SetButtons(lpBtn, 5))
...{
return -1;
}
......
}
然后在view的OnCreate函数中创建此CFrameWnd窗口
m_pDockFrame= new CDockFrame();
m_pDocFrame->Create(NULL, _T("doc"), WS_CHILD|WS_VISIBLE, m_clienRect, this);
如果在视图中创建已我的实践此CFrameWnd的指针不用自己delete,不然会出错
此方法比较麻烦,层次不够明晰,不过可以用在某些比较特殊的情况如View不是程序模板创建本身也是贴在其它的窗口
如果需要在对话框上实现工具栏浮动停靠此方法也是可行的只不过创建的CFrameWnd窗口父窗口替换为对话框