天天看點

MFC學習筆記——07-MFC_19day

在學習MFC總結了筆記,并分享出來。

07-MFC_19day

一、基于對話框程式設計

(1)基于對話框程式設計

對話框是一種特殊類型的視窗,絕大多數Windows程式都通過對話框與使用者進行互動。在Visual C++中,對話框既可以單獨組成一個簡單的應用程式,又可以成為文檔/視圖結構程式的資源。

建立基于對話框的 MFC 應用程式架構

程式的建立過程:

》選擇“檔案 | 建立 | 項目”菜單;

》在“建立項目”對話框中,選擇“ MFC 應用程式 ”,輸入工程名稱,選擇“确定”。

》選擇“ 基于對話框”,即建立基于對話框的應用程式,選擇“完成”。

(2)對話框應用程式架構介紹

1)資源視圖

用 AppWizard 建立基于對話框的應用程式架構(假定工程名為 Dialog )後,項目工作區上增加了一個“資源視圖”頁籤。

或者,通過視圖找到“資源視圖”頁籤:

在 MFC中,與使用者進行互動的對話框界面被認為是一種資源。展開“Dialog”,可以看到有一個ID為IDD_ DIALOG _DIALOG(中間部分(DIALOG)與項目名稱相同)的資源,對應中間的對話框設計界面。不管在何時,隻要輕按兩下對話框資源的ID,對話框設計界面就會顯示在中間。

2)類視圖

在類視圖中,可以看到生成了3 個類:CAboutDlg、CDialogApp和CDialogDlg。

》CAboutDlg:對應生成的版本資訊對話框。

》CDialogApp:應用程式類,從 CWinApp 繼承過來,封裝了初始化、運作、終止該程式的代碼。

》CDialogDlg:對話框類,從CdialogEx繼承過來的,在程式運作時看到的對話框就是它的一個具體對象。

>DoDataExchange函數:該函數主要完成對話框資料的交換和校驗。

>OnInitDialog函數:相當于對對話框進行初始化處理。

1、模态對話框建立

當模态對話框顯示時,程式會暫停執行,直到關閉這個模态對話框之後,才能執行程式中的其他任務。

1)通過工具箱在界面上放一個Button,輕按兩下此按鈕即可跳轉到按鈕處理函數:

MFC學習筆記——07-MFC_19day

1 //按鈕處理函數

2 void CDialogDlg::OnBnClickedButton1()

3 {

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

5 }

2)資源視圖 -> Dialog -> 右擊 -> 插入 Dialog:

MFC學習筆記——07-MFC_19day
MFC學習筆記——07-MFC_19day

3)修改對話框ID:

MFC學習筆記——07-MFC_19day

4)點選對話框模闆 -> 右擊 -> 添加類:

MFC學習筆記——07-MFC_19day

5)類視圖中多了一個自定義類:

MFC學習筆記——07-MFC_19day

6)按鈕處理函數建立對話框,以模态方式運作。

實作模态對話框的建立需要調用CDialog類的成員函數CDialog::DoModel,該函數的功能就是建立并顯示一個對話框:

1 //啟動模态對話框按鈕2 void CDialogDlg::OnBnClickedButton1()

3 {

4 //需要包含頭檔案:#include "DlgExec.h"

5 CDlgExec dlg;

6 dlg.DoModal(); //以模态方式運作

7 }

2、非模态對話框建立

當非模态對話框顯示時,運作轉而執行程式中的其他任務,而不用關閉這個對話框。

圖形界面操作過程和模态對話框一樣,隻是,非模态對話框實作方式不一樣,先建立(CDialog::Create)一次,然後再顯示(CWnd::ShowWindow)。

1)主對話框.h類中聲明對話框對象:

MFC學習筆記——07-MFC_19day

2)建立對話框放在主對話框類的構造函數或OnCreate()函數,目的隻建立一次對話框:

1 //主對話框構造函數2 CDialogDlg::CDialogDlg(CWnd* pParent /*=NULL*/)3     : CDialogEx(CDialogDlg::IDD, pParent)
4 {
5     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
6 
7     m_dlg.Create(IDD_DIALOG_SHOW); //IDD_DIALOG_SHOW為對話框ID
8 }      

3)按鈕處理函數顯示對話框:

1 //啟動非模态對話框按鈕2 void CDialogDlg::OnBnClickedButton2()3 {
4     // TODO:  在此添加控件通知處理程式代碼
5 
6     m_dlg.ShowWindow(SW_SHOWNORMAL); //顯示非模态對話框
7 }      

二、常用控件

1、StaticText靜态文本使用

(1)靜态文本框

靜态文本框是最簡單的控件,它主要用來顯示文本資訊,不能接受使用者輸入,一般不需要連接配接變量,也不需要處理消息。

靜态文本框的重要屬性有:

》ID:所有靜态文本框的預設ID都是IDC_STATIC,靜态ID,不響應任何消息(事件)

》Caption:修改顯示的内容

常用接口:

接口                      功能

CWnd::SetWindowText      設定控件内容

CWnd::GetWindowText      擷取控件内容

CStatic::SetBitmap        設定位圖(字尾為bmp的圖檔)

關聯控件變量:

由于XXX_STATIC靜态ID是不能關聯變量,故需把ID修改後,再關聯變量:

MFC學習筆記——07-MFC_19day
MFC學習筆記——07-MFC_19day
MFC學習筆記——07-MFC_19day

在主對話框類OnInitDialog()中,完成相應接口測試:

MFC學習筆記——07-MFC_19day

1 //設定靜态控件内容為Tom 2 m_label.SetWindowText(TEXT("Tom")); 3

4 //擷取靜态控件的内容

5 CString str;

6 m_label.GetWindowText(str);

7 MessageBox(str);

8

9 //設定靜态控件視窗風格為位圖居中顯示

10 m_label.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE);

11

12 //通過路徑擷取bitmap句柄

13 #define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION)

14

15 //靜态控件設定bitmap

16 m_label.SetBitmap(HBMP(TEXT("./1.bmp"), 300, 250));

更改為顯示完整圖像

1 //設定靜态控件視窗風格為位圖居中顯示 2 m_Img.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE); 3

4 //通過路徑擷取bitmap句柄

5 #define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION)

6

7 //擷取控件寬度和高度,設定到圖檔中

8 CRect rect;

9 m_Img.GetWindowRect(rect);

10

11 //靜态控件設定bitmap

12 m_Img.SetBitmap(HBMP(TEXT("./1.bmp"), rect.Width(), rect.Height()));

(2)普通按鈕

按鈕是最常見的、應用最廣泛的一種控件。在程式執行期間,當單擊某個按鈕後就會執行相應的消息處理函數。

按鈕的主要屬性是Caption,來設定在按鈕上顯示的文本。

指令按鈕處理的最多的消息是:BN_CLICKED,輕按兩下按鈕即可跳轉到處理函數。或者,通過按鈕屬性 -> 控制事件 -> 選擇所需事件,

常用接口:

接口            功能

CWnd::SetWindowText    設定控件内容

CWnd::GetWindowText    擷取控件内容

CWnd::EnableWindow    設定控件是否變灰

1)關聯控件變量:添加變量(變量名:m_button)

2)添加處理函數:

1 //擷取按鈕的内容 2     CString str; 3     m_button.GetWindowText(str);
 4     MessageBox(str);
 5 
 6     //設定按鈕内容
 7     m_button.SetWindowText(TEXT("^_^"));
 8 
 9     //設定按鈕狀态為灰色
10     m_button.EnableWindow(FALSE);
11     m_button.EnableWindow(TRUE);      

總結

繼續閱讀