開始學(xué)習(xí)MFC,各位高手不要見笑啊。
其實之前一直都在陸續(xù)的學(xué)習(xí)中,不過看書和動手相差太遠了,所以一直沒有長進,今天動手寫了小的程序,就出現(xiàn)了很多狀況,于是不得不好好的思考和查找資料,也收獲了不少。
這個是第一個成功的程序。第一個就是一個小的對話框,點擊上面的add按鈕,就會出現(xiàn)一個Test的按鈕,然后再次點擊的時候,就會消失,此時就會出現(xiàn)循環(huán)的出現(xiàn)和消失的情況,而如果不點擊的時候,就會保持那種狀態(tài)。
先上了一張圖:

(高手們暗笑吧)那個按鈕就是動態(tài)生成的,而那個MessageBox則是點擊動態(tài)生成的按鈕出現(xiàn)的。
問題和解答:
1)如何實現(xiàn)顯示和不顯示呢?
添加類的成員變量。這里是一個dlg,對話框的類,因此切換到類的層次結(jié)構(gòu)圖中,然后點擊右邊,添加member variable,添加兩個變量,一個是BOOL類型的,一個是CButton類型的,其中后者,就是那個要創(chuàng)建的按鈕的名稱。
如何實現(xiàn)呢?很簡單,添加方法。在拖住一個button控件后,雙擊,生成一個響應(yīng)函數(shù),那么在里面添加的話就直接響應(yīng)了add按鈕了。
然后,里面的就是填充函數(shù)體了,來一個if判斷,如果剛才的那個BOOL類型的變量為true或者是false,就響應(yīng)的創(chuàng)建或者銷毀,注意完成之后,需要重新設(shè)置,使得下次點擊的時候可以再次起作用。
至此,就完成了前面的那部分功能。
2)如何實現(xiàn)響應(yīng)動態(tài)生成的按鈕呢?
動態(tài)生成的按鈕,如何得到ID,然后響應(yīng)呢?
(參加blog:
http://m.shnenglu.com/deercoder/articles/107132.html)
那么我具體說說我做的吧。(本來書上在Create的最后一個參數(shù)是123,也就是一個整數(shù),對它來說沒有作用,所以直接整數(shù))
但是對于我來說,由于要繼續(xù)實現(xiàn)響應(yīng)這個按鈕的動作,于是不得不得到具體的這個ID,那么,我就要用一個宏來定義了。
在resources.h里面添加#define IDC_1 123,然后替換,就OK了。
然后剩下的問題是響應(yīng),通過查資料,知道了基本步驟是:
CButton *p_Button = new CButton();
p_Button->Create( "Good", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, ID_MYBUT1 );
然后添加:
afx_msg void OnMybut1()
ON_BN_CLICKED(ID_MYBUT1, OnMybut1)
最后
void CTextEditorView::OnMybut1()


{
MessageBox( "哈!你單擊了動態(tài)按鈕。" );
}
我知道這樣可以動態(tài)創(chuàng)建一個按鈕并添加消息響應(yīng)函數(shù),但其消息響應(yīng)函數(shù)還是手動
添加,我想問一下有沒有一種方法,可以動態(tài)創(chuàng)建一個按鈕后再動態(tài)創(chuàng)建其消息響應(yīng)函數(shù)?

這個是網(wǎng)上摘錄的。但是添加后明顯就知道有錯誤。如何實現(xiàn)呢?看看剛剛那篇blog吧,
afx_msg void OnMybut1()和ON_BN_CLICKED(ID_MYBUT1, OnMybut1)放在一起肯定是不行的,而以前看過的《深入淺出MFC》則在這個上面講了很多,特別是消息映射和消息的響應(yīng)。于是了解到:
ON_BN_CLICKED(ID_MYBUT1, OnMybut1)-----------------將相應(yīng)的ID_MYBUT1關(guān)聯(lián)到函數(shù)OnMybut1 (放在實現(xiàn)中,有其他的類似的東西,那些paint等等函數(shù)也都是這樣映射到ID的,實現(xiàn)方法的。因此放在.cpp文件中)
代碼如下:
BEGIN_MESSAGE_MAP(CTeswDlg, CDialog)
//{{AFX_MSG_MAP(CTeswDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_1, OnMybut1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
afx_msg void OnMybut1()---------------------------------------(Generated message map functions)消息映射函數(shù)(放在類定義中,其中注釋的那個部分說明了這個的具體位置,有很多函數(shù),比如,OnInitDialog , Onpaint等等函數(shù)。因此也是類的成員函數(shù))代碼部分如下
(由于是聲明,放在.h文件中):
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CTeswDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
afx_msg void OnMybut1();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
將這兩者完成后,實際上就完成了大部分工作,不過還是不夠啊。
下面的,具體實現(xiàn)那個方法,即void OnMybut1();到底是哪個類的成員函數(shù)呢?我如何定義呢?
前面的問題其實就解決了。如何,在.h文件中,我既然用到了消息映射的函數(shù),而且在class中,那么自然是這個class的子函數(shù),于是就是用到這個類的,前面的Demo小例子,用的是TextEdit,這里是一個DLG,要具體的分析,于是改正之后,就變成了下面的的這個。
void CTeswDlg::OnMybut1()
{
MessageBox( "哈!你單擊了動態(tài)按鈕。" );
}
這樣,就OK了。
看到結(jié)果就會發(fā)現(xiàn),其實處理的函數(shù)都沒有變,只是添加了一個新的消息映射和button,由他們來自動處理,與我們原來的那個add按鈕的函數(shù)是沒有任何關(guān)系的。兩者獨立。
于是程序就完了。結(jié)果很簡單,入門不容易。。。。
源代碼我上傳到程序員聯(lián)合開發(fā)網(wǎng),下載地址為:http://www.pudn.com/downloads225/sourcecode/windows/control/button/detail1058419.html
ok,完了。繼續(xù)學(xué)習(xí)中………………(寒假閉關(guān)修煉,哈哈!!)
posted on 2010-02-03 23:17
deercoder 閱讀(3427)
評論(0) 編輯 收藏 引用