在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法

时间:2022-07-03 10:07:43

 第一种方式是在此view的对应doc模板CFrameWnd子类的OnCreate函数中添加创建代码
由于mdi的模板多个view可能是公用一个CFrameWnd子类。此方法控制不太灵活但是简单

第二种方式即在view的OnCreate函数中创建

在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法int  CXxxView::OnCreate(LPCREATESTRUCT lpCreateStruct)
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
{
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
if (CView::OnCreate(lpCreateStruct) == -1)
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法        
return -1;
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
// 创建工具栏
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
    CMDIChildWnd * pFrame = (CMDIChildWnd*)GetParentFrame();
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
if (!m_wndToolBar.Create(pFrame) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
{
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法        TRACE0(
"Failed to create doc view ");
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法        
return -1;      // fail to create
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
    }

在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
// 其他工具栏的或者dockable窗口的创建
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
    .......
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
// 停靠设置
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
    m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP);
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    pFrame
->EnableDocking(CBRS_ALIGN_ANY);
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    pFrame
->DockControlBar(&m_wndToolBar);
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
return 0;
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法}

这种方式控制较为灵活每个view的工具栏可以独立控制

第三种方式即在view中再创建一个CFrameWnd的窗口然后贴在view上
首先编写继承于CFrameWnd的一个子类例如CDockFrame,然后实现以下方法

在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法virtual  BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *  pContext)
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
{
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
//在此Frame中增加默认的视图模板并创建
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
    CCreateContext context;
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    pContext 
= &context;
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    pContext
->m_pNewViewClass = RUNTIME_CLASS(CHtmlView); // CHtmlView可以替换为其它继承于CView的类但是不能是CView本身
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
    CView *pView = CreateView(pContext);
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    SetActiveView(pView);
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
// 如果需要拆分窗口可创建一个分割的CSplitterWnd窗口
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
//if (!m_wndSplit.CreateStatic(this, 2, 1))
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
//{
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
//    TRACE0("Failed to CreateStaticSplitter ");
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
//    return FALSE;
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
//}
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
//
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
//m_wndSplit.CreateView(0, 0, RUNTIME_CLASS(CHtmlView), CSize(600, 400), pContext);
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
//m_wndSplit.CreateView(1, 0, RUNTIME_CLASS(CDocListView), CSize(600, 100), pContext);
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
    return TRUE;
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法}

在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
int  OnCreate(LPCREATESTRUCT lpCreateStruct)
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
{
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法        
return -1;
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
// 和第一种方法一样创建各种工具栏
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
    if (!m_wndToolBar.CreateEx(this|| !m_wndToolBar.SetButtons(lpBtn, 5))
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    
{
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法        
return -1;
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    }

在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法    ......
在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法}

然后在view的OnCreate函数中创建此CFrameWnd窗口
m_pDockFrame= new CDockFrame();
m_pDocFrame->Create(NULL, _T("doc"), WS_CHILD|WS_VISIBLE, m_clienRect, this);
如果在视图中创建已我的实践此CFrameWnd的指针不用自己delete,不然会出错

此方法比较麻烦,层次不够明晰,不过可以用在某些比较特殊的情况如View不是程序模板创建本身也是贴在其它的窗口
如果需要在对话框上实现工具栏浮动停靠此方法也是可行的只不过创建的CFrameWnd窗口父窗口替换为对话框