1. 程式人生 > >測試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函式啊

答:見下圖

 

 

int CDockablePaneGsz::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDockablePane::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  在此新增您專用的建立程式碼
    m_DialogDockbablePaneGszMain.Create(IDD_DIALOG_GSZ,this);
    m_DialogDockbablePaneGszMain.ShowWindow(SW_SHOW);
    return 0;
}

第六步:這個CDockablePaneGsz所在的視窗銷燬的時候,裡面的蘿蔔(也就是那個基於對話方塊建立的視窗)也被銷燬

 void CDockablePaneGsz::OnDestroy()
 {
     CDockablePane::OnDestroy();
    m_DialogDockbablePaneGszMain.DestroyWindow();
    // TODO: 在此處新增訊息處理程式程式碼
}

第七步: 當CDockablePaneGsz所在的視窗的尺寸變化 或者是隱藏的時候 ,裡面的蘿蔔也要跟著變化。

void CDockablePaneGsz::OnSize(UINT nType, int cx, int cy)
{
    CDockablePane::OnSize(nType, cx, cy);

    // TODO: 在此處新增訊息處理程式程式碼
    if (m_DialogDockbablePaneGszMain.GetSafeHwnd())
    {
        CRect rct;
        GetClientRect(rct);
        m_DialogDockbablePaneGszMain.MoveWindow(rct);
    }
}

第八步: 剛才把筐和蘿蔔弄好了。是不是就萬事大吉了呢? 不是的。。  這個筐和蘿蔔還要整體和那個單文件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位

郵箱:[email protected]  

QQ :470885756