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

原创 2007年10月13日 10:10:00

 第一种方式是在此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;
}

这种方式控制较为灵活每个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;
    }

    ......
}

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

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

MFC创建浮动工具条

void CControlBar::EnableDocking(DWORD dwDockStyle) { ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FL...
  • dayenglish
  • dayenglish
  • 2014年10月04日 18:38
  • 1348

如何动态地切换MDI子窗口或者在SDI主应用程序窗口显示的视图?

谁说过一个框架窗口在整个生存期内都应该受其关联的视图的束缚呢?在用户接口中增加某些魔法,让用户动态的选中它们想要放进同一个框架窗口内的视图,使用EkSwitchViewInFrame()公用函数,切换...
  • zhongyajie
  • zhongyajie
  • 2012年01月30日 11:38
  • 951

MFC工具条与状态条设计

工具条/栏(tool bar)和状态条/栏(status bar)是构建友好GUI程序的通用标准,但它们并不是Windows API的标准部件,而是由应用程序框架(MFC)增加的一类控件。工具条是CT...
  • touzani
  • touzani
  • 2007年05月18日 02:26
  • 14933

MFC工具条和状态栏

http://51dev.com/program/cpp/20070818/7548.htmlWindows控制窗口  Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中...
  • su317
  • su317
  • 2008年01月11日 19:55
  • 3425

如何在MFC的SDI程序中实现多视图

原文出处:http://blog.csdn.net/b2b160/article/details/4319883     我们都知道MFC里的SDI程序实现了Frame-Doc-View结构,在这...
  • HarmoniousED
  • HarmoniousED
  • 2012年02月04日 06:11
  • 2465

MFC窗口创建以及工具条的浮动

在上一篇博客的分析当中,主窗口的创建是在LoadFrame当中完成的。LoadFrame函数主要调用两个函数完成这个工作,第一步向系统注册相应的窗口信息,第二步创建相应的窗口。这正好符合WIN32的窗...
  • dayenglish
  • dayenglish
  • 2014年06月21日 23:25
  • 1350

MFC如何将对话框嵌入浮动窗口中

MFC浮动窗口的中创建对话框
  • qq_19272431
  • qq_19272431
  • 2017年10月17日 13:19
  • 171

在C++/MFC框架应用程序里,当浮动工具条被拖离主窗口后,一般都有一个“关闭”按钮,

在C++/MFC框架应用程序里,当浮动工具条被拖离主窗口后,一般都有一个“关闭”按钮,如图一所示: 图一  本来这个按钮完全是按照Windows应用程序的UI设计规范而设计的,也就...
  • sha_jinhao
  • sha_jinhao
  • 2013年02月22日 14:21
  • 1605

使用对话框实现类似MFC浮动工具条

//CMainFrame.h增加下面3行 CDlgRightToolBar* m_pRightToolDlg;// 增加的浮动工具栏 void MoveRightToolDlgMi...
  • x82488059
  • x82488059
  • 2015年01月26日 17:04
  • 864

MFC 中的停靠栏

设置停靠功能1、CFrameWnd::EnableDocking()该函数创建停靠栏。2、CControlBar::EnableDocking()该函数向控制条中增加停靠和移动功能。3、CFrameW...
  • geeeeeeee
  • geeeeeeee
  • 2008年12月23日 16:23
  • 4940
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
举报原因:
原因补充:

(最多只允许输入30个字)