首页 > 代码库 > 测试CDockablePane。 测试他的最基本的功能。

测试CDockablePane。 测试他的最基本的功能。

最近看到一句话:

×××××××××××××××××××××××××××××××××××××××××××

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 once5 #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

测试CDockablePane。 测试他的最基本的功能。