從CDialogBar派生自己的類進行控制項的初始化

2021-06-06 05:02:01 字數 2688 閱讀 8435

當建立一些簡單的形如只包含了一些button的dialogbar的時候,是不需要從cdialogbar派生,因為cdialogbar本身就是從ccontrolbar派生而來,它可以接收任何的通告訊息。

然而,在一下的諸多較為複雜的情形下,我們就需要利用cdialogbar派生出自己的類了(子控制項是指用作子視窗的控制項------個人理解)。

·           dialogbar包含了具有drop-down屬性的combobox;

·           dialogbar包含了treeview或者tree控制項,listview, list控制項;

·           dialogbar包含了activex控制項;

諸如上面所說的任何較為複雜的情形下,我們都應該對dialogbar進行派生,以便在派生的類中對其他的控制項進行初始化。因為在classwizard並沒有支援以cdialogbar為基類的派生。所以我們必須自己手動完成該派生過程。這篇文章就是要闡述如何將cdialog的派生類轉換為cdialogbar的派生類。

在開始正題之前,有必要說明一點:cdialogbar類是從ccontrolbar類派生而來的,而ccontrolbar類則是從cwnd類派生而來,所以cdialogbar並非cdialog的派生類。

首先開啟vs2008,建立乙個dialogbar型別的dialog資源(在建立對話方塊資源的時候,單擊dialog選項前面的"+"號進行選擇)。並以cdialog類為基類生成派生類,然後按照下面的步驟對所產生的類進行修改。

1.              在類的宣告中,將基類cdialog改為cdialogbar,同時將.cpp檔案中,begin_message_map中的基類也改為cdialogbar.

2.              修改.h檔案和.cpp檔案中的析構函式,同時修改dodataexchange()函式,具體修改後的效果如下圖:

//修改前的**:

1 cmydlgbar (cwnd* pparent = null);   // standard constructor

2  3 cmydlgbar:: cmydlgbar (cwnd* pparent /*=null*/)

4    : cdialog(cmydlgbar::idd, pparent)

5 }afx_msg

11  

12    afx_msg long oninitdialog ( uint, long );   // <-新增這一行.

13     declare_message_map()

14 };

1   //在原始檔中

2  begin_message_map(cmydlgbar, cdialogbar)// 把原來的cdialog改為cdialogbar

3  ...

4  on_message(wm_initdialog, oninitdialog ) // <-- 新增這一行.

5  end_message_map()

//將函式實現從:

bool cmydlgbar::oninitdialog()

...

return bret;

到此為止所有需要修改的地方都已經完成,剩下的就是使用了。在cmainframe中定義變數,並在cmainframe::oncreate()函式中新增**:

1 if (!m_wnddlgbar.create(this, idd_dialogbar, ws_child | ws_visible | cbrs_bottom

2         | cbrs_gripper | cbrs_tooltips | cbrs_flyby | cbrs_size_dynamic, idd_dialogbar)) 3

7 8 //如果需要實現可停靠的功能,則新增如下**:

9 m_wnddlgbar.enabledocking(cbrs_align_bottom );

10 enabledocking(cbrs_align_any); //這句很重要

11 dockcontrolbar(&m_wnddlgbar, afx_idw_dockbar_bottom);

9 10 11這三行可以注釋掉

接下來在mainframe.h中新增

virtual bool oncmdmsg(uint nid,int ncode,void* pextra,afx_cmdhandlerinfo* phandlerinfo);

.cpp中新增

bool cmainframe::oncmdmsg(uint nid,int ncode,void* pextra,afx_cmdhandlerinfo* phandlerinfo)

這個訊息函式處理button發到mainframe的訊息,所以必須新增

然後在oninitdialog函式中初始化,使位圖貼到按鈕上

hbitmap hbmp=::loadbitmap(afxgetinstancehandle(), makeintresource(idb_bitmap1));

button = (cbutton*)getdlgitem(idc_button1);

button ->setbitmap(hbitmap(hbmp));

button是在標頭檔案中定義 cbutton* button;

這裡因為不能新增control型別的button變數,不知道為什麼,所以只能通過獲取id的方法來控制,不知道為啥。這樣就能把點陣圖貼到按鈕上了。(注意:得把按鈕的第乙個屬性設為bitmap)

學習從自己開始

人生苦短,轉眼大學生活已過大半,回首往事,覺得自己很傻,浪費愛戀很多時間,而學到的知識卻是少之又少,所以現在決定發奮圖強,狂補一下了!現在我們正在學習資料結構,我每天就是去上上課,感覺日子過得很輕鬆,但是沒完我睡在床上,感覺自己一無是處,除了上課時間之外,我的時間全花在同外國人聊天了,雖然這對我的英...

從別人到自己

早晨被一股異味弄醒,同事上完廁所不衝。那酸爽,無語了。這種素質還指望他能幹嘛。早晨起來看了幾篇別人的博文,感覺寫的不錯,乙個是關於如何高效程式設計的妹子寫的。感覺條理清晰,不像我這樣記流水賬。還有一篇關於寫部落格申請做專家的,小夥子寫了幾篇關於基礎知識和一些專業知識的blog就成磚家了,呵呵 也許磚...

從外面看自己

雖然到目前只有短短的三個多月,不過海外mba學習也給了我乙個機會,在乙個安全的環境裡觀察自己,權衡利弊得失,同時思考下一步的方向。一些小小的感受,寫給自己 1.選擇做什麼,決定權在自己,結果怎麼樣,決定權往往在他人,所以,應當關注他人 2.要清晰自己的目標,明確哪些事情是必須做的,哪些是可以做的,哪...