1. 程式人生 > >mfc最詳細入門教程

mfc最詳細入門教程

以下是我從其他網站中學的內容,後有相應的網站學習連結地址,可供學習

1.選擇選單項File->New->Project,彈出“New Project”對話方塊。

 2.左側面板中Installed Templated的Visual C++下選擇MFC,中間視窗中選擇MFC Application,然後在下面的Name編輯框中鍵入工程名稱,本例取名“Addition”,在Location編輯框中設定工程的儲存路徑。點“OK”。

 3.點“Next”到“Application Type”對話方塊,在Application type下選擇Dialog based,其他使用預設設定,點“Finish”。


 我們可以在Solution Explorer檢視中看到,此工程的檔案要比單文件應用程式少的多,在Class View中主要有三個類:CAboutDlg、CAdditionApp和CAdditionDlg。CAboutDlg是應用程式的“關於”對話方塊類,CAdditionApp是由CWinApp派生的類,CAdditionDlg是主對話方塊類,主對話方塊也就是此應用程式執行後顯示的主要介面。

在Resource View檢視中可以看到工程Addition的資源樹,展開Addition.rc,下面有四個子項:Dialog(對話方塊)、Icon(圖示)、String Table(字串表)和Version(版本)。然後展開Dialog項,下面有兩個對話方塊模板,其ID分別為:IDD_ABOUTBOX和IDD_ADDITION_DIALOG,前者是“關於”對話方塊的模板,後者是主對話方塊的模板。ID是資源的唯一標識,本質上是一個無符號整數,一般ID代表的整數值由系統定義,我們無需干涉。


可見對於主對話方塊來說,建立對話方塊第一步中的建立新的對話方塊模板已經由系統自動完成了。而如果是再新增對話方塊需要建立新的對話方塊模板時,需要在Resource View的“Dialog”節點上點右鍵,在右鍵選單中選擇“Insert Dialog”,就會生成新的對話方塊模板,並且會自動分配ID。

在Resource View的資源樹中雙擊某個ID,可在中間區域內顯示相應的資源介面。雙擊IDD_ADDITION_DIALOG時,中間區域就會顯示Addition對話方塊模板。如下圖:

VS2010/MFC程式設計入門之六(對話方塊:建立對話方塊模板和修改對話方塊屬性)

在Addition對話方塊模板上點右鍵,然後在右鍵選單中選擇Properties,則在右側面板中會顯示對話方塊的屬性列表。如下圖:


VS2010/MFC程式設計入門之六(對話方塊:建立對話方塊模板和修改對話方塊屬性)

 1.ID:對話方塊ID,唯一標識對話方塊資源,可以修改。此處為IDD_ADDITION_DIALOG,我們不修改它。

2.Caption:對話方塊標題。此處預設為Addition,我們將其修改為“加法計算器”。

3.Border:邊框型別。有四種類型:None、Thin、Resizing和Dialog Frame。我們使用預設的Dialog Frame。

       4.Maximize:是否使用最大化按鈕。我們使用預設的False。

       5.Minimize:是否使用最小化按鈕。同樣我們使用預設的False。

       6.Style:對話方塊型別。有三種類型:Overlapped(重疊視窗)、Popup(彈出式視窗)和Child(子視窗)。彈出式視窗比較常見。我們使用預設的Popup型別。

       7.System Menu:是否帶有標題欄左上角的系統選單,包括移動、關閉等選單項。我們使用預設的True。

       8.Title Bar:是否帶有標題欄。我們使用預設的True。

       9.Font(Size):字型型別和字型大小。如果將其修改為非系統字型,則Use System自動改為False。而如果Use System原來為False,將其修改為True,則Font(Size)自動設定為系統字型。這裡我們使用預設的系統字型。

       根據以上說明,其實我們只修改了標題屬性。這時我們執行此程式後的介面如下:

VS2010/MFC程式設計入門之六(對話方塊:建立對話方塊模板和修改對話方塊屬性)

 1.為對話方塊新增一個靜態文字框(Static Text),用於顯示字串--“被加數”。

      對於自動新增的一個標題為“TODO:Place dialog controls here.”的靜態文字框,這裡將它刪掉,繼續新增新的靜態文字框。

       刪除控制元件時,可以使用滑鼠左鍵點選選中它,選中後控制元件的周圍會出現虛線框,然後按Delete鍵就可以將其刪除了。在“Addition”工程的Resource View中開啟上一講中建立的對話方塊模板IDD_ADDITION_DIALOG,自動新增的靜態文字框就可以使用這種方法刪除。

       在新增新的靜態文字框以前,先看看Toolbox檢視是否顯示了,如果沒有顯示,在選單欄上點選View->Toolbox即可。Toolbox檢視如下圖:

VS2010/MFC程式設計入門之七(對話方塊:為對話方塊新增控制元件)

       Toolbox中列出了一些常用控制元件,其中有一個是Static Text,即是我們要新增的控制元件。在Toolbox中的Static Text上點下滑鼠左鍵不放開,並拖到IDD_ADDITION_DIALOG對話方塊模板上,模板上會出現一個虛線框,我們找到合適的位置鬆開滑鼠左鍵放下它。

       用滑鼠左鍵選中控制元件後周圍出現虛線框,然後滑鼠移到虛線框上幾個黑點的位置會變成雙向箭頭的形狀,此時就可以按下滑鼠左鍵並拖動來改變控制元件大小了。我們可以這樣改變新新增的靜態文字框控制元件的大小,以更好的顯示標題。當然,整個對話方塊模板也可以用這種方法改變大小。

       接下來就該修改靜態文字框的文字了。滑鼠右鍵點選靜態文字框,在右鍵選單中選擇“Properties”,Properties面板就會顯示出來,在面板上修改Caption屬性為“被加數”,ID修改為IDC_SUMMAND_STATIC。此時模板如下圖:

VS2010/MFC程式設計入門之七(對話方塊:為對話方塊新增控制元件)

       2.為對話方塊新增一個編輯框(Edit Control),用來輸入被加數。

       新增編輯框的過程與靜態文字框類似,在Toolbox中選中Edit Control控制元件拖到對話方塊模板上,並使其與之前的靜態文字框水平對齊(為了美觀),然後調整其大小使之適合被加數的輸入。

       在編輯框上點右鍵,仍然在右鍵選單中選擇“Properties”顯示出屬性(Properties)面板,修改其ID為IDC_SUMMAND_EDIT。此時模板如下圖:

VS2010/MFC程式設計入門之七(對話方塊:為對話方塊新增控制元件)

       3.按照1的方法新增一個標題為“加數”的靜態文字框,用於顯示字串--“加數”。並將其ID改為IDC_ADDEND_STATIC。

       4.按照2的方法新增一個ID為IDC_ADDEND_EDIT的編輯框,用來輸入加數。

       5.按照1的方法新增一個標題為“和”的靜態文字框,用於顯示文字--“和”。並修改其ID為IDC_SUM_STATIC。

       6.按照2的方法新增一個ID為IDC_SUM_EDIT的編輯框,用來顯示最終的加和。

       7.類似的新增按鈕(Button)控制元件到對話方塊模板,用於在被點選後觸發加法計算。修改其標題為“計算”,ID為IDC_ADD_BUTTON。

       到此,對話方塊模板如圖:

VS2010/MFC程式設計入門之七(對話方塊:為對話方塊新增控制元件)

       8.刪除OK按鈕。開啟Cancel按鈕的屬性面板,將標題改為“退出”,並使其與“計算”按鈕水平對齊。

       9.根據控制元件的佈局,適當調整整個對話方塊模板的大小,使其相對控制元件佈局來說大小合適,介面美觀。

       這樣在對話方塊模板中就把我們在本例中需要用到的控制元件就新增完了。最終效果如下:

VS2010/MFC程式設計入門之七(對話方塊:為對話方塊新增控制元件)

 因為例程Addition是基於對話方塊的程式,所以程式自動建立了對話方塊模板IDD_ADDITION_DIALOG,並自動生成了對話方塊類CAdditionDlg,它是從CDialogEx類派生的。大家用過VC++ 6.0的可能記得,我們定義的對話方塊類都是從CDialog類派生的,但在VS2010中,一般對話方塊類都是繼承自CDialogEx類。

       建立對話方塊類

       如果是自己新新增的對話方塊模板,怎樣為它建立對話方塊類呢?

       1.在Resource View的“Dialog”節點上右鍵,然後在右鍵選單中選擇“Insert Dialog”建立一個新的對話方塊模板,ID就使用預設的IDD_DIALOG1。

       2.在中間區域會顯示新建的對話方塊模板,然後選中此對話方塊模板,點右鍵,在右鍵選單中選擇Add Class。

 VS2010/MFC程式設計入門之八(對話方塊:建立對話方塊類和新增控制元件變數)

       3.選擇“Add Class”後會彈出一個對話方塊,在對話方塊中“Class name”下的編輯框中寫入自定義的類名就可以了,例如CMyDialog。

       4.最後點“Finish”完成。

       最終你就可以在Class View中看到新生成的對話方塊類CMyDialog了,並且在Solution Explorer中有相應的MyDialog.h標頭檔案和MyDialog.cpp原始檔生成。CMyDialog類同樣派生於CDialogEx類。

       注意,一般類名都以C打頭,又比如,CTestDlg。

       為對話方塊中的控制元件新增變數

       在上一講中為對話方塊添加了幾個控制元件,包括三個靜態文字框,三個編輯框,一個按鈕控制元件。程式自動生成的Cancel按鈕保留,作為退出按鈕,而OK按鈕刪除掉了。

       靜態文字框只是為了說明後面緊跟的編輯框中資料的意義,是被加數、加數還是和,所以它們是不會變的,我們就不為它們新增變量了。按鈕控制元件是用來操作的,這裡也不為它們新增變數。編輯框中的資料可能會經常變化,有必要為它們每個控制元件關聯一個變數。

       首先為被加數的編輯框IDC_SUMMAND_EDIT新增變數。

       1.在編輯框上點右鍵,在右鍵選單中選擇“Add Variable”。彈出新增成員變數的嚮導對話方塊。

       2.我們想為其新增值變數而不是控制元件變數,所以對話方塊中“Category”下的組合框中選擇Value。

       3.“Variable type”下的組合框此時預設選中的是“CString”,CString是字串類,顯然不能進行加法運算。我們可以選擇double、float、int等。這裡我們選擇double,即編輯框關聯一個double型別的變數。

       4.在“Variable name”中寫入自定義的變數名。雞啄米為其取名m_editSummand。

VS2010/MFC程式設計入門之八(對話方塊:建立對話方塊類和新增控制元件變數)

       5.點“Finish”完成。

       注意,類的成員變數名一般以m_打頭,以標識它是一個成員變數。

       參照此方法,再分別為加數的編輯框IDD_ADDEND_EDIT新增double型變數m_editAddend、和的編輯框IDD_SUM_EDIT新增double型變數m_editSum。

       對話方塊類的資料交換和檢驗

       在程式執行介面中,使用者往往會改變控制元件的屬性,例如,在編輯框中輸入字串,或者改變組合框的選中項,又或者改變複選框的選中狀態等。控制元件的屬性改變後MFC會相應修改控制元件關聯變數的值。這種同步的改變是通過MFC為對話方塊類自動生成的成員函式DoDataExchange()來實現的,這也叫做對話方塊的資料交換和檢驗機制。

       我們為三個編輯框添加了變數以後,在AdditionDlg.cpp中CAdditionDlg的DoDataExchange()函式的函式體中多了三條DDX_Text呼叫語句。下面是函式體程式碼和雞啄米新增的註釋。

C++程式碼
  1. void CAdditionDlg::DoDataExchange(CDataExchange* pDX)   
  2. {   
  3. // 處理MFC預設的資料交換 
  4.     CDialogEx::DoDataExchange(pDX);   
  5. // 處理控制元件IDC_SUMMAND_EDIT和變數m_editSummand之間的資料交換 
  6.     DDX_Text(pDX, IDC_SUMMAND_EDIT, m_editSummand);   
  7. // 處理控制元件IDC_ADDEND_EDIT和變數m_editAddend之間的資料交換 
  8.     DDX_Text(pDX, IDC_ADDEND_EDIT, m_editAddend);   
  9. // 處理控制元件IDC_SUM_EDIT和變數m_editSum之間的資料交換 
  10.     DDX_Text(pDX, IDC_SUM_EDIT, m_editSum);   
  11. }  

       再以Addition程式為例簡單說下資料交換機制。如果我們在程式執行介面中輸入被加數,則通過CAddition的DoDataExchange()函式可以將輸入的值儲存到m_editSummand變數中,反之如果程式執行中修改了變數m_editSummand的值,則通過CAddition的DoDataExchange()函式也可以將新的變數值顯示到被加數的編輯框中。

       但是這種資料交換機制中,DoDataExchange()並不是被自動呼叫的,而是需要我們在程式中呼叫CDialogEx::UpdateData()函式,由UpdateData()函式再去自動呼叫DoDataExchange()的。

       CDialogEx::UpdateData()函式的原型為:

       BOOL UpdateData(BOOL bSaveAndValidate = TRUE);

       引數:bSaveAndValidate用於指示資料傳輸的方向,TRUE表示從控制元件傳給變數,FALSE表示從變數傳給控制元件。預設值是TRUE,即從控制元件傳給變數。

       返回值:CDialogEx::UpdateData()函式的返回值表示操作是否成功,成功則返回TRUE,否則返回FALSE。

       在下一講中將具體演示CDialogEx::UpdateData()函式如何使用。

       雞啄米本節主要講的是新建對話方塊類和新增控制元件變數,控制元件的訊息處理函式將在下一講詳細介紹。

*********************************************************************************************************************************************************************

 建立對話方塊類和新增控制元件變數在上一講中已經講過,這一講的主要內容是如何為控制元件新增訊息處理函式。

       MFC為對話方塊和控制元件等定義了諸多訊息,我們對它們操作時會觸發訊息,這些訊息最終由訊息處理函式處理。比如我們點選按鈕時就會產生BN_CLICKED訊息,修改編輯框內容時會產生EN_CHANGE訊息等。一般為了讓某種操作達到效果,我們只需要實現某個訊息的訊息處理函式。

       一.新增訊息處理函式

       雞啄米仍以前面的加法計算器的程式為例,說明怎樣為“計算”按鈕控制元件新增訊息處理函式。新增方法列出4種:

       1.使用Class Wizard新增訊息處理函式

       用過的VC++ 6.0的朋友應該對Class Wizard很熟悉了,新增、訊息處理函式等經常會用到它,可以說是一個很核心的功能。但從VS2002開始就見不到Class Wizard了,大部分功能都整合到對話方塊和控制元件等的屬性中了,使用很方便。到VS2010,久違的Class Wizard又回來了。但雞啄米已經習慣了使用屬性中的功能了,對於從VC++ 6.0直接轉VS2010的朋友可能覺得還是使用Class Wizard比較習慣。

VS2010/MFC程式設計入門之九(對話方塊:為控制元件新增訊息處理函式)

       大家應該記得,“計算”按鈕的ID為IDC_ADD_BUTTON,上圖中Commands標籤下,Oject IDs列表中有此ID,因為我們是想實現點選按鈕後的訊息處理函式,所以在Messages列表中選擇BN_CLICKED訊息,然後點右上方的Add Handler就可以新增BN_CLICKED訊息處理函式OnClickedAddButton了。當然你也可以改名,但一般用的預設的就可以。

       2.通過“Add Event Handler...”新增訊息處理函式

       在“計算”按鈕上點右鍵,然後在右鍵選單中選擇選單項“Add Event Handler...”,彈出“Event Handler Wizard”對話方塊,如下圖:

VS2010/MFC程式設計入門之九(對話方塊:為控制元件新增訊息處理函式)

       可見“Message type”中預設選中的就是BN_CLICKED訊息,函式名和所在類都已經自動給出,直接點“Add and Edit”就可以了。

       3.在按鈕的屬性檢視中新增訊息處理函式

       上面說過,從VS2002開始就主要從屬性檢視新增訊息處理函數了。我們在“計算”按鈕上點右鍵,在右鍵選單中選擇“Properties”,右側面板中會顯示按鈕的屬性檢視。

VS2010/MFC程式設計入門之九(對話方塊:為控制元件新增訊息處理函式)

       我們可以像上圖中那樣,點屬性檢視的“Control Events”按鈕(類似閃電標誌),下面列出了“計算”按鈕的所有訊息。我們要處理的是BN_CLICKED訊息,點其右側空白列表項,會出現一個帶下箭頭的按鈕,再點此按鈕會出現“<Add> OnBnClickedAddButton”選項,最後選中這個選項就會自動新增BN_CLICKED處理函數了。

       4.雙擊按鈕新增訊息處理函式

       最直接最簡單的方法就是,雙擊“計算”按鈕,MFC會自動為其在CAdditionDlg類中新增BN_CLICKED訊息的處理函式OnBnClickedAddButton()。

       二.在訊息處理函式中新增自定義功能

       在我們使用任意一種方法添加了訊息處理函式以後,都只能得到一個空的OnBnClickedAddButton()函式的函式體,要實現我們想要的功能,還需要在函式體中加入自定義功能程式碼。

       在加法計算器程式中,我們想要“計算”按鈕實現的功能是,獲取被加數和加數的數值,然後計算它們的和並顯示到和的編輯框裡。那麼,OnBnClickedAddButton()的函式體就應修改為:

C++程式碼
  1. void CAdditionDlg::OnBnClickedAddButton()   
  2. {   
  3. // TODO: Add your control notification handler code here 
  4. // 將各控制元件中的資料儲存到相應的變數 
  5.     UpdateData(TRUE);   
  6. // 將被加數和加數的加和賦值給m_editSum 
  7.     m_editSum = m_editSummand + m_editAddend;   
  8. // 根據各變數的值更新相應的控制元件。和的編輯框會顯示m_editSum的值 
  9.     UpdateData(FALSE);   
  10. }  

       雞啄米在上面的程式碼中已經添加註釋,大家應該很容易理解了。對於UpdateData()函式的說明在上一講中已經介紹過,如果忘了可以再回上一講了解了解。

       接下來我們執行下此應用程式。在執行結果介面中,輸入被加數5.1,加數2.3,然後點“計算”:

VS2010/MFC程式設計入門之九(對話方塊:為控制元件新增訊息處理函式)

       在上圖中可以看到,點“計算”按鈕後,和的編輯框中顯示了正確結果:7.4。

       雞啄米簡單分析下執行過程:輸入被加數和加數,點“計算”按鈕後產生點選訊息,從而呼叫OnBnClickedAddButton()函式。進入此函式後,首先由UpdateData(TRUE)函式將被加數的值5.1和加數的值2.3分別儲存到變數m_editSummand和m_editAddend,然後通過語句m_editSum = m_editSummand + m_editAddend;計算出被加數和加數的和為7.4,並把7.4賦值給m_editSum。最後呼叫UpdateData(FALSE)根據被加數、加數、和的值更新三個編輯框的顯示值,就得到了上圖中的結果。

       到此,一個具有簡單的加法運算功能的加法計算器應用程式就基本完成了。

************************************************************************************************************************************************************************

本節主要講對話方塊上控制元件的Tab順序如何調整

       上一講為“計算”按鈕添加了訊息處理函式後,加法計算器已經能夠進行浮點數的加法運算。但是還有個遺留的小問題,就是對話方塊控制元件的Tab順序問題。

       執行加法計算器程式,顯示對話方塊後不進行任何操作,直接按回車,可以看到對話方塊退出了。這是因為“退出”按鈕是Tab順序為1的控制元件,也就是第一個接受使用者輸入的控制元件。但是按照我們的輸入習慣,應該是被加數的編輯框首先接受使用者輸入,然後是加數編輯框,再接下來是“計算”按鈕,最後才是“退出”按鈕。

       我們先來直觀的看看各個控制元件的Tab順序吧。開啟“Resource View”檢視,然後在資源中找到對話方塊IDD_ADDITION_DIALOG,雙擊ID後中間客戶區域出現其模板檢視。在主選單中選擇“Format”->"Tab Order",或者按快捷鍵Ctrl+D,對話方塊模板上就會顯示各個控制元件的Tab順序數字。如下圖:

VS2010/MFC程式設計入門之十(對話方塊:設定對話方塊控制元件的Tab順序)

       上圖中每個控制元件左上角都有一個數字,這就是它的Tab響應順序。對話方塊剛開啟時輸入焦點就在Tab順序為1的“退出”按鈕上,不做任何操作按下Tab鍵,輸入焦點就會轉移到Tab順序為2的“被加數”靜態文字框上,但是因為靜態文字框不接受任何輸入,所以輸入焦點繼續自動轉移到Tab順序為3的被加數編輯框,再按Tab鍵,輸入焦點又會轉移到Tab順序為4的“加數”靜態文字框上,同樣由於它是靜態文字框,輸入焦點不停留繼續轉移到加數編輯框,後面的控制元件同理。

       我們認為這個順序不合理,那怎麼修改呢?很簡單,從自己認為Tab順序應該為1的控制元件開始依次單擊,隨著單擊的完成,各控制元件的Tab響應順序也按我們的想法設定好了。

       例如,此例中我們可以依次單擊被加數編輯框、“被加數”靜態文字框、加數編輯框、“加數”靜態文字框、和編輯框、“和”靜態文字框、“計算”按鈕和“退出”按鈕。設定完後如下圖:

VS2010/MFC程式設計入門之十(對話方塊:設定對話方塊控制元件的Tab順序)

       最後按ESC鍵,確認設定並退出對話方塊模板的Tab順序設定狀態。

       現在我們再執行程式,可以看到對話方塊開啟後最初的輸入焦點在被加數編輯框上,然後我們按Tab鍵,輸入焦點移到加數編輯框上,繼續多次按Tab鍵時,輸入焦點會按“和編輯框--‘計算’按鈕--‘退出’按鈕--被加數編輯框--加數編輯框--和編輯框......”的順序迴圈轉移。這樣就達到了我們的目的。

*******************************************************************************************************************************************************************************************

加法計算器對話方塊程式大家照著做一遍後,相信對基於對話方塊的程式有些瞭解了,有個好的開始對於以後的學習大有裨益。趁熱打鐵,雞啄米這一節講講什麼是模態對話方塊和非模態對話方塊,以及模態對話方塊怎樣彈出。

       一.模態對話方塊和非模態對話方塊

       Windows對話方塊分為兩類:模態對話方塊和非模態對話方塊。

       模態對話方塊是這樣的對話方塊,當它彈出後,本應用程式其他視窗將不再接受使用者輸入,只有該對話方塊響應使用者輸入,在對它進行相應操作退出後,其他窗口才能繼續與使用者互動。

       非模態對話方塊則是,它彈出後,本程式