• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-145  評(píng)論-173  文章-70  trackbacks-0
            開始學(xué)習(xí)MFC,各位高手不要見笑啊。

            其實(shí)之前一直都在陸續(xù)的學(xué)習(xí)中,不過看書和動(dòng)手相差太遠(yuǎn)了,所以一直沒有長(zhǎng)進(jìn),今天動(dòng)手寫了小的程序,就出現(xiàn)了很多狀況,于是不得不好好的思考和查找資料,也收獲了不少。

            這個(gè)是第一個(gè)成功的程序。第一個(gè)就是一個(gè)小的對(duì)話框,點(diǎn)擊上面的add按鈕,就會(huì)出現(xiàn)一個(gè)Test的按鈕,然后再次點(diǎn)擊的時(shí)候,就會(huì)消失,此時(shí)就會(huì)出現(xiàn)循環(huán)的出現(xiàn)和消失的情況,而如果不點(diǎn)擊的時(shí)候,就會(huì)保持那種狀態(tài)。
            先上了一張圖:



            (高手們暗笑吧)那個(gè)按鈕就是動(dòng)態(tài)生成的,而那個(gè)MessageBox則是點(diǎn)擊動(dòng)態(tài)生成的按鈕出現(xiàn)的。
            問題和解答:
            1)如何實(shí)現(xiàn)顯示和不顯示呢?
            添加類的成員變量。這里是一個(gè)dlg,對(duì)話框的類,因此切換到類的層次結(jié)構(gòu)圖中,然后點(diǎn)擊右邊,添加member variable,添加兩個(gè)變量,一個(gè)是BOOL類型的,一個(gè)是CButton類型的,其中后者,就是那個(gè)要?jiǎng)?chuàng)建的按鈕的名稱。
            如何實(shí)現(xiàn)呢?很簡(jiǎn)單,添加方法。在拖住一個(gè)button控件后,雙擊,生成一個(gè)響應(yīng)函數(shù),那么在里面添加的話就直接響應(yīng)了add按鈕了。
            然后,里面的就是填充函數(shù)體了,來一個(gè)if判斷,如果剛才的那個(gè)BOOL類型的變量為true或者是false,就響應(yīng)的創(chuàng)建或者銷毀,注意完成之后,需要重新設(shè)置,使得下次點(diǎn)擊的時(shí)候可以再次起作用。
            至此,就完成了前面的那部分功能。

            2)如何實(shí)現(xiàn)響應(yīng)動(dòng)態(tài)生成的按鈕呢?
            動(dòng)態(tài)生成的按鈕,如何得到ID,然后響應(yīng)呢?
            (參加blog:http://www.shnenglu.com/deercoder/articles/107132.html
            那么我具體說說我做的吧。(本來書上在Create的最后一個(gè)參數(shù)是123,也就是一個(gè)整數(shù),對(duì)它來說沒有作用,所以直接整數(shù))
            但是對(duì)于我來說,由于要繼續(xù)實(shí)現(xiàn)響應(yīng)這個(gè)按鈕的動(dòng)作,于是不得不得到具體的這個(gè)ID,那么,我就要用一個(gè)宏來定義了。
            在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( 
            "哈!你單擊了動(dòng)態(tài)按鈕。" );
            }

            我知道這樣可以動(dòng)態(tài)創(chuàng)建一個(gè)按鈕并添加消息響應(yīng)函數(shù),但其消息響應(yīng)函數(shù)還是手動(dòng)
            添加,我想問一下有沒有一種方法,可以動(dòng)態(tài)創(chuàng)建一個(gè)按鈕后再動(dòng)態(tài)創(chuàng)建其消息響應(yīng)函數(shù)?

             這個(gè)是網(wǎng)上摘錄的。但是添加后明顯就知道有錯(cuò)誤。如何實(shí)現(xiàn)呢?看看剛剛那篇blog吧,
            afx_msg void OnMybut1()和ON_BN_CLICKED(ID_MYBUT1, OnMybut1)放在一起肯定是不行的,而以前看過的《深入淺出MFC》則在這個(gè)上面講了很多,特別是消息映射和消息的響應(yīng)。于是了解到:
            ON_BN_CLICKED(ID_MYBUT1, OnMybut1)-----------------將相應(yīng)的ID_MYBUT1關(guān)聯(lián)到函數(shù)OnMybut1   (放在實(shí)現(xiàn)中,有其他的類似的東西,那些paint等等函數(shù)也都是這樣映射到ID的,實(shí)現(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ù)(放在類定義中,其中注釋的那個(gè)部分說明了這個(gè)的具體位置,有很多函數(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()
            };



            將這兩者完成后,實(shí)際上就完成了大部分工作,不過還是不夠啊。

            下面的,具體實(shí)現(xiàn)那個(gè)方法,即void OnMybut1();到底是哪個(gè)類的成員函數(shù)呢?我如何定義呢?

            前面的問題其實(shí)就解決了。如何,在.h文件中,我既然用到了消息映射的函數(shù),而且在class中,那么自然是這個(gè)class的子函數(shù),于是就是用到這個(gè)類的,前面的Demo小例子,用的是TextEdit,這里是一個(gè)DLG,要具體的分析,于是改正之后,就變成了下面的的這個(gè)。
            void CTeswDlg::OnMybut1()
            {
             MessageBox( "哈!你單擊了動(dòng)態(tài)按鈕。" );
            }

            這樣,就OK了。

            看到結(jié)果就會(huì)發(fā)現(xiàn),其實(shí)處理的函數(shù)都沒有變,只是添加了一個(gè)新的消息映射和button,由他們來自動(dòng)處理,與我們?cè)瓉淼哪莻€(gè)add按鈕的函數(shù)是沒有任何關(guān)系的。兩者獨(dú)立。

            于是程序就完了。結(jié)果很簡(jiǎn)單,入門不容易。。。。



            源代碼我上傳到程序員聯(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 閱讀(3438) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            精品久久亚洲中文无码| 久久人人爽人爽人人爽av | 久久精品国产精品亚洲艾草网美妙| 97久久精品午夜一区二区| 狼狼综合久久久久综合网| 精品久久一区二区三区| 一级a性色生活片久久无| 99热精品久久只有精品| 久久亚洲中文字幕精品一区| 久久精品免费观看| 久久久免费精品re6| 热99RE久久精品这里都是精品免费| 久久一日本道色综合久久| 99精品国产99久久久久久97 | 国内精品久久久久久久影视麻豆| 久久精品国产亚洲av麻豆蜜芽 | 久久国产精品一区| 久久国产高清一区二区三区| 久久久久婷婷| 久久精品国产亚洲av水果派| 久久大香萑太香蕉av| 77777亚洲午夜久久多人| 人妻少妇久久中文字幕| 国内精品久久久久久久97牛牛| 色偷偷888欧美精品久久久| 99久久亚洲综合精品成人| 99久久婷婷国产一区二区| 亚洲午夜无码久久久久| 久久精品国产亚洲av水果派| 国产精品热久久无码av| 亚洲AV无码久久精品狠狠爱浪潮| 久久香蕉国产线看观看精品yw| av午夜福利一片免费看久久| 亚洲人成无码www久久久| 久久久久久青草大香综合精品| 国产精品99久久久久久宅男小说| 国产美女久久精品香蕉69| 欧美激情一区二区久久久| 开心久久婷婷综合中文字幕| 国产精品99精品久久免费| 久久国产亚洲高清观看|