在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 控制工具条的停靠位置

在VC中开发大型应用程序时,工具条通常是程序中必不可少的重要功能因素,其中工具条在整个窗口中的停靠位置尤其关键,它直接影响到程序界面的外观形象。下面针对笔者实际开发中各类工具条停靠位置的控制过程,详细...
  • qingzhengxiongmao
  • qingzhengxiongmao
  • 2010-09-12 18:37:00
  • 3329

【框架-MFC】CView(chenlu-1):重写CView,将CView的放在某控件的位置

class CMYView : public CView { DECLARE_DYNCREATE(CMYView) protected: CMYView(); // 动态创建...
  • chenlu5201314
  • chenlu5201314
  • 2013-05-16 13:52:19
  • 606

MFC创建自己的工具栏(SDI)

1.首先要对资源、关键的函数要了解,下面正式开始。 首先在资源菜单添加新的ToolBar,在类试图中CMainFrame类中的增加新的CToolBar类(.h)。    CToolBa...
  • ljsant
  • ljsant
  • 2016-07-02 08:40:03
  • 716

MFC创建浮动工具条

void CControlBar::EnableDocking(DWORD dwDockStyle) { ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FL...
  • dayenglish
  • dayenglish
  • 2014-10-04 18:38:31
  • 1554

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

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

MFC工具栏的创建和实现ToolBar

toolbar属于资源,所以在RC目录中右击,添加资源-->toolbar--->新建,新建的位图放在rec目录下,名称为toolbar1,新建 的位图一般不美观,用其他画图工具做好16X16或32X...
  • tangfuyou
  • tangfuyou
  • 2017-08-22 11:22:59
  • 419

MFC SDI单文档多视图的实现及自由切换(2种实现方式简析)

MFC SDI单文档多视图的实现及自由切换结合网上学习总结别人的例子,以及参考MSDN给出的例子,对SDI多视图的实现进行了一个简单的总结,以记录学习点滴.首先在H文件有如下声明:class CMul...
  • teleinfor
  • teleinfor
  • 2007-10-31 10:44:00
  • 13820

浅谈MFC单文档(SDI)程序

浅谈MFC单文档(SDI)程序,分析生成类的的继承关系,及各个类的之间的关系。初步探究了SDI程序的运行流程与构架。...
  • z1037561063
  • z1037561063
  • 2015-07-28 18:05:56
  • 667

MFC SDI 执行流程

在MFC程序设计的学习过程中最令人感到难受,甚至于有时会动摇学习者信心的就是一种对于程序的一切细节都没有控制权的感觉。这种感觉来源于学习者不知道一个MFC程序是如何运行起来的(即一个MFC程序的执行流...
  • baidu_25211613
  • baidu_25211613
  • 2015-01-27 17:02:55
  • 1229

MFC MDI和SDI非客户区框架界面美化之----标题栏以及边框美化

1、美化方式:贴图、重绘       优点:简单,易理解!适合       缺点:美化限制较大,实际使用意义不大。 2、基本思路是重载CMainFrame类的DefWindowProc()函数,并判断...
  • wzy198852
  • wzy198852
  • 2014-02-12 09:29:20
  • 5949
收藏助手
不良信息举报
您举报文章:在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
举报原因:
原因补充:

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