最近看到一句话:
×××××××××××××××××××××××××××××××××××××××××××
CDockablePane是一个通用窗口容器,它主要有两个用途:在一个框架中悬浮或者停靠窗口。
在复杂布局的应用程序中,它可以显示或隐藏所装载的窗口,为应用程序窗口提供额外的空间。
×××××××××××××××××××××××××××××××××××××××××××
上面说的事呢 感觉还是不错的。于是乎开始测试。
××××××××××××××××××××××××××××
Q1:窗口的容器是个什么玩意?
A1:也许就是把一个窗口放入到里面去。然后这个窗口就可以牛X了。这种牛X表现在窗口可以随意停靠了。类似VS2010里面的窗口的那种感觉。
××××××××××××××××××××××
既然如此开始测试吧。
第一步:在Win7 64位系统里面 使用VS2010创建一个单文档MFC程序,然后编译测试通过后进行下一步。
第二步:既然这个什么CDockablePane可以做为一个窗口的箩筐使用,那咱们就创建一个窗口。创建什么样的窗口呢?
简单点吧。。直接插入一个对话框吧。
找到资源视图,右击Dialog插入一个对话框。在属性里面把个这个对话框的参数稍微改一下。
Caption ->DialogGsz,style->child,border->none。就是把这个对话框的名字,风格,边框 修改一下。
ID->IDD_DIALOG_GSZ
第三步:添加一个类 :CDockablePaneGsz
这个类呢 继承自CDockablePane。这个为啥要添加一个继承在CDockablePane的类的 而不是直接去修改CDockablePane呢? 鄙人认为是CDockablePane是微软自己的东西,
很是金贵,轻易不要更改。所以咱们继承一个过来。咱自己的东西想怎么折腾都可以。大不了删掉重做。
第四步 :经过一番波折,咱们有了CDockablePanegGsz这个继承自CDockablePane的类。也有一个对话框的类。话说这筐也有了,萝卜也有了。那就放进入呗。
哦! 差点忘了。我们刚才这是创建了一个对话框资源,却没有给予这个资源创建类。罪过 罪过 。 右击刚才的那个对话框,创建一个继承CDialgEx的类CDialogDockbablePaneGsz。至此萝卜有了。开始放:
A:先在CDockablePanegGsz的头文件里面包含萝卜的的头文件。#include "DialogDockbablePaneGsz.h"
B:然后在头文件里面实例化一个对象 CDialogDockbablePaneGsz m_DialogDockbablePaneGszMain;
至此萝卜完成放进入了。
第五步:萝卜既然进来了,就要对萝卜做一些 操作。 是切还是剁 是红烧还是清蒸。 总是要做的事情吧 不然把它放进来干嘛?
做啥事呢?客官你别急 。。这就来了。。
A:在CDockablePanegGsz的OnCreate函数里面创建并显示对话框
问:我这找不到OnCreate函数啊
答:见下图
1 int CDockablePaneGsz::OnCreate(LPCREATESTRUCT lpCreateStruct) 2 { 3 if (CDockablePane::OnCreate(lpCreateStruct) == -1) 4 return -1; 5 6 // TODO: 在此添加您专用的创建代码 7 m_DialogDockbablePaneGszMain.Create(IDD_DIALOG_GSZ,this); 8 m_DialogDockbablePaneGszMain.ShowWindow(SW_SHOW); 9 return 0; 10 }
第六步:这个CDockablePaneGsz所在的窗口销毁的时候,里面的萝卜(也就是那个基于对话框创建的窗口)也被销毁
1 void CDockablePaneGsz::OnDestroy() 2 { 3 CDockablePane::OnDestroy(); 4 m_DialogDockbablePaneGszMain.DestroyWindow(); 5 // TODO: 在此处添加消息处理程序代码 6 }
第七步: 当CDockablePaneGsz所在的窗口的尺寸变化 或者是隐藏的时候 ,里面的萝卜也要跟着变化。
1 void CDockablePaneGsz::OnSize(UINT nType, int cx, int cy) 2 { 3 CDockablePane::OnSize(nType, cx, cy); 4 5 // TODO: 在此处添加消息处理程序代码 6 if (m_DialogDockbablePaneGszMain.GetSafeHwnd()) 7 { 8 CRect rct; 9 GetClientRect(rct); 10 m_DialogDockbablePaneGszMain.MoveWindow(rct); 11 } 12 }
第八步: 刚才把筐和萝卜弄好了。是不是就万事大吉了呢? 不是的。。 这个筐和萝卜还要整体和那个单文档MFC程序发生的关系。这样才好。
当然了,至于如何发生关系,是在框架类里面发生关系 还是在视图类里面发生关系。 这个估计都可以。。。
我在这里选择在框架类里面发生点关系。
A:首先 在框架的类头文件里面 添加 CDockablePanegGsz
1 // MainFrm.h : CMainFrame 类的接口 2 // 3 4 #pragma once 5 #include "DockablePaneGsz.h" 6 class CMainFrame : public CFrameWndEx
B在框架类的头文件里面 创建 CDockablePanegGsz的对象
1 protected: 2 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 3 afx_msg void OnViewCustomize(); 4 afx_msg LRESULT OnToolbarCreateNew(WPARAM wp, LPARAM lp); 5 DECLARE_MESSAGE_MAP() 6 public: 7 CDockablePaneGsz m_DockablePaneGszMain;
C:在框架类的OnCreate函数里面 添加CDockbalePaneGszMain 窗口的创建。 这个函数有好多好多参数。。
CMFCToolBar::SetBasicCommands(lstBasicCommands); ////////////////////////////////////////////////////////////////////////// m_DockablePaneGszMain.Create(_T("朕就是那个牛X停靠类"),this,CRect(0,0,300,300),TRUE,10010, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_LEFT|CBRS_FLOAT_MULTI); m_DockablePaneGszMain.EnableDocking(CBRS_ALIGN_ANY); //EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_DockablePaneGszMain); return 0;
第九步: 是骡子是马 跑起来 溜溜
见效果图。
后记 :
源代码地址:http://pan.baidu.com/s/1sjr0jAd
环境 :VS2010 。 不需要附加任何其他库。系统是Win7 64位
邮箱:wenluderen@gmail.com
QQ :470885756