測試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位
QQ :470885756