• 测试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 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

  • 相关阅读:
    jQuery的事件处理
    《CSS mastery》 读书笔记
    javascript 基础三
    javascript 基础二
    webpack全局引入jquery的方法
    解决mongoVue的collections不显示问题
    javascript 实现一个回文数字
    nth-child和:nth-of-type的区别
    iscroll5实现一个下拉刷新上拉加载的效果
    js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法
  • 原文地址:https://www.cnblogs.com/wenluderen/p/4245623.html
Copyright © 2020-2023  润新知