久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MFC 之 對(duì)話框編程入門(上,、中,、下)

 看風(fēng)景D人 2014-04-23

下面我們來(lái)設(shè)計(jì)這個(gè)程序的UI,首先在“視圖”菜單中選擇“工具箱”,,這個(gè)工具箱窗口中,,列出了很多常用的Windows控件(如按鈕、復(fù)選框,、編輯框,、標(biāo)簽等),點(diǎn)擊一個(gè)控件,,此時(shí)鼠標(biāo)變?yōu)槭中?,像使用畫圖工具一樣在設(shè)計(jì)器上繪出該控件,也可以同過(guò)拖拽的方法將控件直接拖到UI設(shè)計(jì)器中的對(duì)話框上,,還可以直接雙擊工具欄中的控件,。

UI設(shè)計(jì)器上的靜態(tài)標(biāo)簽“TODO: 在此放置對(duì)話框控件?!笨梢詫⑵鋭h掉,。按照上述方法在對(duì)話框上繪制一個(gè)按鈕控件,右擊此控件,,選擇“屬性”會(huì)出現(xiàn)屬性窗口,,在這個(gè)窗口中,左側(cè)是控件的一種屬性,,右側(cè)是該屬性的當(dāng)前值,,在屬性窗口的低端是屬性的具體含義,。對(duì)于按鈕控件,我們現(xiàn)在關(guān)注Caption屬性,,即按鈕上顯示的文字,,我們將其設(shè)為“Hello World”,輸入完畢后按回車鍵確定,。在UI設(shè)計(jì)器上的那個(gè)按鈕已經(jīng)變?yōu)椤?/span>Hello World”了,。在看一下按鈕的ID屬性,這個(gè)ID表示對(duì)話框每個(gè)控件唯一的標(biāo)識(shí)(注意IDIDC_STATIC的控件代表該控件為靜態(tài)的,,在程序運(yùn)行時(shí)不可以動(dòng)態(tài)的改變改控件的屬性,,如標(biāo)簽控件。但我們亦可以通過(guò),,修改標(biāo)簽的ID改為非IDC_STATIC值,,這樣這個(gè)控件就轉(zhuǎn)為動(dòng)態(tài)控件了,此種控件可以用IDC_STATIC來(lái)標(biāo)識(shí),,IDC_STATIC沒(méi)有唯一的限制,),,我們一般需要將該屬性值改為更有意義的,,如IDC_HELLOWORLD

下面我們?yōu)榘粹o控件編寫事件響應(yīng)代碼,,右擊Hello World按鈕,,選擇“添加事件處理程序”,依然彈出了一個(gè)向?qū)?duì)話框,,在消息類型中選擇選擇按鈕要響應(yīng)的消息,,在這個(gè)程序中我們是要響應(yīng)按鈕的單擊事件(其實(shí)在一般情況下,按鈕就是用來(lái)單擊的),,所以保持默認(rèn)“BN_CLICKED”,,在類列表中說(shuō)明了響應(yīng)代碼是作為哪個(gè)類的成員函數(shù),默認(rèn)選擇那個(gè)以“Dlg”結(jié)尾的類,,這個(gè)類是繼承于CDialog類的一個(gè)派生類,。程序員可以設(shè)置自己的“函數(shù)處理程序名稱”。完成后點(diǎn)擊“添加編輯”按鈕,,進(jìn)入代碼編輯器編輯代碼(對(duì)于按鈕這種簡(jiǎn)單控件,,我們要添加其響應(yīng)代碼,一般在UI設(shè)計(jì)器中直接雙擊這個(gè)控件即可直接進(jìn)入到代碼編輯器中編輯響應(yīng)默認(rèn)消息的函數(shù)),。

系統(tǒng)為我們自動(dòng)在CHelloWorldDlg類中添加了OnBnClickedHelloworld()函數(shù),,該函數(shù)的聲明部分在HelloWorldDlg.h文件中,在VS9開(kāi)發(fā)環(huán)境的右側(cè)“解決方案資源管理器”中雙擊該文件,,或在HelloWorldDlg.cpp文件中右擊,,在彈出菜單中選擇“轉(zhuǎn)到頭文件”,。讓我們來(lái)看一下這個(gè)MFC框架是如何構(gòu)成的。

在這個(gè)頭文件的頭部有一行“#pragma once”,,這是條編譯命令,,功能是讓次頭文件(Header)在編譯時(shí)只被編譯一次,因?yàn)橥粋€(gè)頭文件可能被包含(include)過(guò)多次,。在這個(gè)頭文件中定義了CHelloWorld類,,在這個(gè)類中聲明了一個(gè)HICON類型的m_hIcon成員變量,這是個(gè)描述該應(yīng)用程序圖標(biāo)的變量,。如果你不了解HICON這個(gè)非標(biāo)準(zhǔn)類型,,可以在代碼的HICON處右擊鼠標(biāo),然后選擇“轉(zhuǎn)到聲明”或“轉(zhuǎn)到定義”,,這是VS9會(huì)自動(dòng)定位光標(biāo)到HICON的聲明或定義代碼處,,筆者認(rèn)為這是一個(gè)非常體貼的功能,為團(tuán)隊(duì)開(kāi)發(fā)提供了很大的便利,。

這里,,我們順便來(lái)簡(jiǎn)單談?wù)?span style="line-height:normal;">MFC采用的“匈牙利標(biāo)識(shí)符命名法”,這是一個(gè)約定,,可以增加代碼的可讀性,。如果你聲明或定義了一個(gè)類,那么這個(gè)類可以一“C”(class)為前綴,,如CHelloWorldDlg類,,如果要定義一個(gè)無(wú)符號(hào)型的局部變量,那么可以用“u”(unsigned)為前綴,,如UINT uPort; ULONG uFlags;如果是intlong類型的變量則以“n”為前綴,,DWORD類型的變量前綴為“dw”,字符數(shù)組以“sz”作為前綴,,CString類的對(duì)象以“str”作為前綴,,指針以“lp”或“p(long pointerpointer,在WIN32環(huán)境下這兩種指針并沒(méi)有什么差別)作為前綴,,引用以“r”為前綴,,布爾型變量以“b”為前綴,句柄型的變量以“h”(handle)作為前綴,。如果變量是全局的,,那么以“g_”(global)開(kāi)頭,如BOOL g_bFlags;如果是類的成員變量則以“m_”(member)開(kāi)頭,,如HICON m_hIcon;,。

討論完MFC的命名規(guī)則,讓我們繼續(xù)看這個(gè)頭文件,,在此類中聲明了一個(gè)標(biāo)準(zhǔn)構(gòu)造函數(shù)CHelloWorldDlg(CWnd* pParent = NULL);可選形參CWnd* pParent指定此對(duì)話框的父窗口,。

代碼enum { IDD = IDD_HELLOWORLD_DIALOG };的意思是MFC巧妙的將IDIDD_HELLOWORLD_DIALOG的對(duì)話框資源與CHelloWorldDlg類綁定在一起,。

這些除外的成員函數(shù)都是對(duì)父類CDialog中成員函數(shù)的重載。

成員函數(shù)virtual void DoDataExchange(CDataExchange* pDX);是用來(lái)支持DDX(對(duì)話框數(shù)據(jù)交換,,將一個(gè)變量和一個(gè)控件進(jìn)行綁定的時(shí)候用DDX)和DDV(對(duì)話框數(shù)據(jù)效驗(yàn),,檢驗(yàn)該控件是否為你所需要的時(shí)候用DDV)機(jī)制的成員函數(shù)。

成員函數(shù)virtual BOOL OnInitDialog();是在對(duì)話被創(chuàng)建(Create)后立即被執(zhí)行的函數(shù),,因此在這里可以添加對(duì)話框的初始化所需要的自定義代碼,。

成員函數(shù)afx_msg void OnSysCommand(UINT nID, LPARAM lParam);是對(duì)話框的處理WM_SYSCOMMAND消息的函數(shù)。WM_SYSCOMMAND消息是關(guān)于系統(tǒng)控制的消息,,如鼠標(biāo)在標(biāo)題欄上的操作等,。

成員函數(shù)afx_msg void OnPaint();是對(duì)話框處理WM_PAINT的函數(shù),當(dāng)對(duì)話框窗體發(fā)生重繪時(shí)有WM_PAINT消息到達(dá)程序,。

成員函數(shù)afx_msg HCURSOR OnQueryDragIcon();當(dāng)用戶拖動(dòng)最小化窗口時(shí)系統(tǒng)調(diào)用此函數(shù)取得光標(biāo)顯示,。

接下來(lái)是一個(gè)DECLARE_MESSAGE_MAP()宏,這是MFC處理消息用的,,具體資料可以查閱MSDN,。

最下一行afx_msg void OnBnClickedHelloworld();就是剛自動(dòng)生成的處理按鈕單擊消息的處理函數(shù)。

讀者可能注意到了afx_msg,,在MFC中,,只要是處理消息的響應(yīng)函數(shù),在聲明時(shí),,都要加上afx_msg。通過(guò)查找其定義,,筆者認(rèn)為這個(gè)并沒(méi)有什么功能性意義,,只是一個(gè)占位用的或是一個(gè)說(shuō)明標(biāo)識(shí)。

我們分析完HelloWorldDlg.h文件后,,再來(lái)看看HelloWorldDlg.cpp文件,。在文件的include部分,包含了stdafx.h文件,,讀者可以在“”stdafx.h””上右擊鼠標(biāo),,打開(kāi)該頭文件,在這個(gè)頭文件中包含了該MFC程序必要的文件,,如果程序員要添加自定義類,,如果類中還需要MFC支持,那么必須包含這個(gè)頭文件,。HelloWorld.h文件中定義了ChelloWorldApp類(繼承于CWinApp),,是MFC的應(yīng)用程序類。一個(gè)MFC WIN32應(yīng)用程序必須是在CWinApp對(duì)象之上的,,在CHelloWorldApp類中的InitInstance()成員函數(shù)的定義中,,有相應(yīng)加載該對(duì)話框的代碼(CHelloWorldDlg dlg;之后的代碼),。

然后是一組宏定義#ifdef _DEBUG #define new DEBUG_NEW #endif_DEBUG宏對(duì)應(yīng)前面提到的Debug模式,。

接下來(lái)定義了另一個(gè)對(duì)話框類CAboutDlg,,這是個(gè)“關(guān)于”對(duì)話框的類,用來(lái)顯示程序版權(quán)信息的,。

來(lái)看看BEGIN_MESSAGE_MAP() …… END_MESSAGE_MAP()這組宏定義,,在這中間的代碼就是MFC用來(lái)指定哪個(gè)消息用哪個(gè)成員函數(shù)來(lái)響應(yīng)。對(duì)于那些無(wú)需指定的,,MFC則沒(méi)有明確指定,,如ON_WM_PAINT()是指定處理WM_PAINT消息的成員函數(shù)是OnPaint(),但,,這個(gè)用戶一般不會(huì)去更改,,所以在這里就沒(méi)有去明確指定。但ON_BN_CLICKED()中,,卻指定了具體的成員函數(shù):ID值為IDC_HELLOWORLD的控件的BN_CLICKED消息由CHelloWorldDlg類的OnBnClickedHelloworld()成員函數(shù)來(lái)處理,。

在看看OnInitDialog()函數(shù)的定義部分,首先調(diào)用了父類了初始化函數(shù),,接下來(lái)到SetIcon前,,是將“關(guān)于”加載到了系統(tǒng)菜單中,這樣用戶在單擊程序窗體左上角的圖標(biāo)時(shí),,或右擊標(biāo)題欄時(shí),,或右擊任務(wù)欄長(zhǎng)條圖標(biāo)時(shí),彈出的菜單就會(huì)包含“關(guān)于”的菜單項(xiàng),。

SetIcon()的后面有相應(yīng)注釋:“設(shè)置大圖標(biāo)”和“設(shè)置小圖標(biāo)”,。

OnSysCommand()函數(shù)中,處理了有關(guān)標(biāo)題欄上發(fā)生的事件,,代碼(nID & 0xFFF0) == IDM_ABOUTBOX表示,,如果用戶點(diǎn)擊了標(biāo)題欄系統(tǒng)菜單中的“關(guān)于”菜單項(xiàng),顯示“關(guān)于”對(duì)話框,。

OnPaint()函數(shù)中的代碼,,是用來(lái)實(shí)現(xiàn)重繪操作的。

----------------------------------------------------------

編輯框(Edit)控件,。以IDIDC_INPUT的編輯控件為例:

獲取/設(shè)置編輯框內(nèi)的文字,、設(shè)置其可用狀態(tài)和設(shè)置其可見(jiàn)狀態(tài)等方法與操作按鈕的方法類似,在次就不再贅述了,。

我們知道我們通過(guò)GetDlgItem()函數(shù)是獲取的其文本內(nèi)容,,如果想要獲取其數(shù)值,則可以用int nValue = _ttoi(strInput);的方法來(lái)轉(zhuǎn)換。這里介紹一個(gè)DDX的方法,,將一個(gè)成員變量與一個(gè)目標(biāo)控件進(jìn)行綁定,,這樣變量的值就可以用來(lái)反應(yīng)控件的值了,同樣,,也可以通過(guò)設(shè)置這個(gè)變量的值,,來(lái)控制控件的值。下面來(lái)看具體步驟:在工具箱中,,拖拽一個(gè)編輯框到對(duì)話框上,,ID設(shè)為IDC_INPUT。右鍵點(diǎn)擊這個(gè)控件,,選擇“添加變量”菜單項(xiàng),,在彈出的“添加成員變量向?qū)А睂?duì)話框中設(shè)置其訪問(wèn)屬性(筆者建議用protected);在類別列表框中選擇Value(默認(rèn)是Control),;在變量類型組合框中選擇一種變量類型,,這里選擇int;輸入變量名m_nValue,;最小值,、最大值、最大字符數(shù)和注釋,,根據(jù)實(shí)際情況選填(這里略過(guò)),;點(diǎn)擊完成按鈕。完成“添加變量”向?qū)Ш?,?/span>HelloWorldDlg.cpp文件中的CHelloWorldDlg::DoDataExchange()中,,系統(tǒng)自動(dòng)添加了一條語(yǔ)句:DDX_Text(pDX, IDC_INPUT, m_nValue);這條語(yǔ)句的意思是將IDIDC_INPUT的控件與m_nValue成員變量進(jìn)行綁定。當(dāng)程序執(zhí)行UpdateData()的時(shí)候,,數(shù)據(jù)便開(kāi)始進(jìn)行交換,,數(shù)據(jù)交換方向由UpdateData的參數(shù)確定。

在對(duì)話框上繪制一個(gè)按鈕,,Caption設(shè)為“判斷”,雙擊編寫其消息響應(yīng)代碼:

void CHelloWorldDlg::OnBnClickedButton1()

{

               // TODO: 在此添加控件通知處理程序代碼

               UpdateData(TRUE);

               if (m_nValue >= 0) MessageBox(_T("大于等于零"));

               else MessageBox(_T("小于零"));

          }

這里,,UpdateData(TRUE);就是讓文本框的值更新到m_nValue里,,如果是UpdateData(FALSE);就是將變量中的數(shù)據(jù)返回給文本框里。在對(duì)話框初始化時(shí),,MFC會(huì)默認(rèn)調(diào)用一次UpdateData(FALSE);,,用來(lái)初始化控件中的顯示內(nèi)容;在對(duì)話框結(jié)束時(shí),,MFC會(huì)調(diào)用一次UpdateData(TRUE);,,用來(lái)更新控件數(shù)據(jù)到成員變量中去。

還可以為為控件添加控件變量,即在“添加變量向?qū)А敝械淖兞款悇e列表中選擇Control,,則系統(tǒng)會(huì)添加一個(gè)MFC的控件類的對(duì)象作為改對(duì)話框的成員變量,,并且將這個(gè)控件對(duì)象與響應(yīng)的控件進(jìn)行綁定,這樣操作這個(gè)控件對(duì)象就相當(dāng)于操作相應(yīng)的控件,。

復(fù)選框(Check)和單選框(Radio)控件,。分別以IDIDC_CHECK1IDC_RADIO1的控件為例:

獲取/設(shè)置其選中狀態(tài):

成員函數(shù)原型:

int GetCheck() const;

     void SetCheck(int nCheck);

這兩個(gè)函數(shù)都是CButton類的成員函數(shù),所以在用GetDlgItem()獲取CWnd指針后,,一定要強(qiáng)制轉(zhuǎn)換為CButton的指針類型,。

例子:

              BOOL bState;

          bState = ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck();     //獲取復(fù)選框狀態(tài)

     ((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(1);             //設(shè)置單選框狀態(tài)為選中

注意,當(dāng)復(fù)選框的Tri-State屬性為True的時(shí)候,,那么復(fù)選框可以有三種狀態(tài),,在SetCheck()的時(shí)候可以通過(guò)傳給012來(lái)設(shè)置狀態(tài),。

操作復(fù)選框和單選框的狀態(tài),,同樣也可以采用DDX的方法,添加一個(gè)int型的成員變量來(lái)與控件進(jìn)行綁定,。

列表框(List)和組合框(Combo),,在此只介紹成員函數(shù)原型:

列表框常用成員函數(shù):

void ResetContent();                                                                    //清空列表

         int AddString(LPCTSTR lpszItem);                                             //追加列表項(xiàng)

         int DeleteString(UINT nIndex);                                                   //刪除指定項(xiàng)

         int SetSel(int nIndex, BOOL bSelect = TRUE);                           //設(shè)置指定項(xiàng)的選擇狀態(tài)

         int SetCurSel(int nSelect);                                                            //設(shè)置當(dāng)前選中項(xiàng)

         int GetCurSel() const;                                                                  //獲取當(dāng)前選中項(xiàng)

         int GetSelItems(int nMaxItems, LPINT rgIndex) const;               //獲取所有選中項(xiàng)

         int GetSelCount() const;                                                              //獲取選中項(xiàng)總數(shù)

         int GetTextLen(int nIndex) const;                                                 //獲取指定項(xiàng)的文本長(zhǎng)度

         int GetText(int nIndex, LPTSTR lpszBuffer) const;                      //獲取指定項(xiàng)文本

         void GetText(int nIndex, CString &rString) const;

int FindString(int nStartAfter, LPCTSTR lpszItem) const;          //查找指定項(xiàng)

對(duì)于組合框來(lái)說(shuō),可以理解為由編輯框和列表框組合而成的復(fù)合控件,,因此其MFC中的成員函數(shù)與也可以參照編輯框和列表框控件類的成員函數(shù),。

對(duì)話框編程就介紹到此了,更多具體資料還請(qǐng)參看MicrosoftMSDN,,MSDN的簡(jiǎn)體中文網(wǎng)址為:http://msdn.microsoft.com/,。MSDNMicrosoft最大的資料庫(kù)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多