- MFC 教程
- MFC - 首頁
- MFC - 概述
- MFC - 環境設定
- MFC - VC++ 專案
- MFC - 入門指南
- MFC - Windows 基礎
- MFC - 對話方塊
- MFC - Windows 資源
- MFC - 屬性表
- MFC - Windows 佈局
- MFC - 控制元件管理
- MFC - Windows 控制元件
- MFC - 訊息與事件
- MFC - ActiveX 控制元件
- MFC - 檔案系統
- MFC - 標準 I/O
- MFC - 文件/檢視
- MFC - 字串
- MFC - CArray
- MFC - 連結串列
- MFC - 資料庫類
- MFC - 序列化
- MFC - 多執行緒
- MFC - Internet 程式設計
- MFC - GDI
- MFC - 庫
- MFC 有用資源
- MFC - 快速指南
- MFC - 有用資源
- MFC - 討論
MFC - 控制元件管理
在 MFC 應用程式中,在將控制元件視覺化地新增到應用程式後,如果要在程式碼中引用它,則可以宣告一個基於該控制元件或與該控制元件關聯的變數。MFC 庫允許您為應用程式中使用的一些控制元件宣告兩種型別的變數:值變數或控制元件變數。
一個變數用於儲存在控制元件中的資訊,也稱為控制元件變數/例項。
另一個變數稱為控制元件值變數。使用者可以使用此變數對該控制元件執行某些操作。
控制元件變數/例項
控制元件變數是基於管理控制元件的類的變數。例如,按鈕控制元件基於 CButton 類。
為了在實際程式設計中看到這些概念,讓我們建立一個基於 MFC 對話方塊的專案 MFCControlManagement。
建立專案後,您將在設計器視窗中看到以下對話方塊。
步驟 1 - 刪除 TODO 行,並拖動一個複選框和一個編輯控制元件,如下面的快照所示。將複選框的標題更改為“啟用控制元件”。
步驟 2 - 右鍵單擊複選框。
步驟 3 - 選擇“新增變數”。
步驟 4 - 現在您可以看到“新增成員變數嚮導”。
您可以在此對話方塊上選擇不同的選項。對於複選框,變數型別為 CButton。它在此對話方塊中預設選中。
類似地,控制元件 ID 也已預設選中,現在我們需要在“類別”組合框中選擇“控制元件”,並在“變數名稱”編輯框中鍵入 m_enableDisableCheck,然後單擊“完成”。
步驟 5 - 同樣,新增編輯控制元件的控制元件變數,設定如下面的快照所示。
觀察對話方塊類的標頭檔案。您現在可以看到已添加了新的變數。
CButton m_enableDisableCheck; CEdit m_myEditControl;
控制元件值變數
您可以為控制元件宣告的另一種型別的變數是值變數。並非所有控制元件都提供值變數。
值變數必須能夠處理它要引用的控制元件中儲存的值的型別。
例如,由於基於文字的控制元件用於處理文字,因此您可以為其宣告基於文字的資料型別。這通常是 CString 變數。
讓我們看看複選框和編輯控制元件的這種型別的變數。
步驟 1 - 右鍵單擊複選框並選擇“新增變數”。
步驟 2 - 變數型別為 BOOL。從“類別”下拉列表中選擇“值”。
步驟 3 - 單擊“完成”繼續。
步驟 4 - 同樣,新增編輯控制元件的值變數,設定如下面的快照所示。
步驟 5 - 在變數型別中鍵入 CString,在變數名稱欄位中鍵入 m_editControlVal。
步驟 6 - 您現在可以在標頭檔案中看到這些新增的變數。
bool m_enableDisableVal; CString m_editControlVal;
控制元件事件處理程式
將控制元件新增到應用程式後,無論您是透過視覺化方式新增還是動態建立,您還需要決定如何處理使用者可能對控制元件執行的操作。
對於已與類關聯的專案對話方塊,在建立事件處理程式時,您可以利用一些快捷方式。
您可以快速建立預設控制元件通知事件或任何適用的 Windows 訊息的處理程式。
讓我們看看我們在其中添加了複選框事件處理程式的相同示例。
步驟 1 - 右鍵單擊要為其處理通知事件的控制元件。
步驟 2 - 在快捷選單上,單擊“新增事件處理程式”以顯示“事件處理程式嚮導”。
步驟 3 - 在“訊息型別”框中選擇要新增到“類”列表框中選擇的類的事件。
步驟 4 - 接受“函式處理程式名稱”框中的預設名稱,或提供您選擇的名稱。
步驟 5 - 單擊“新增並編輯”以新增事件處理程式。
步驟 6 - 您現在可以在 CMFCControlManagementDlg.cpp 檔案末尾看到以下新增的事件。
void CMFCControlManagementDlg::OnBnClickedCheck1() {
// TODO: Add your control notification handler code here
}
控制元件管理
到目前為止,我們已經瞭解瞭如何將控制元件新增到應用程式。現在我們將瞭解如何根據使用者需求管理這些控制元件。我們可以在特定的事件處理程式中使用控制元件變數/例項。
步驟 1 - 讓我們看看下面的示例。在這裡,我們將啟用/停用編輯控制元件,當複選框被選中/取消選中時。
步驟 2 - 我們現在添加了複選框單擊事件處理程式。以下是實現方式 -
void CMFCControlManagementDlg::OnBnClickedCheck1() {
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
}
步驟 3 - 建立對話方塊時,我們需要將以下程式碼新增到 CMFCControlManagementDlg::OnInitDialog() 中。這將管理這些控制元件。
UpdateData(TRUE); if (m_enableDisableVal) m_myEditControl.EnableWindow(TRUE); else m_myEditControl.EnableWindow(FALSE);
步驟 4 - 以下是 CMFCControlManagementDlg.cpp 檔案的完整實現。
// MFCControlManagementDlg.cpp : implementation file
//
#include "stdafx.h"
#include "MFCControlManagement.h"
#include "MFCControlManagementDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialogEx {
public:
CAboutDlg();
// Dialog Data
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) {
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CMFCControlManagementDlg dialog
CMFCControlManagementDlg::CMFCControlManagementDlg(CWnd* pParent /* = NULL*/)
:CDialogEx(IDD_MFCCONTROLMANAGEMENT_DIALOG, pParent) ,
m_enableDisableVal(FALSE) , m_editControlVal(_T("")) {
m_hIcon = AfxGetApp()&rarr LoadIcon(IDR_MAINFRAME);
}
void CMFCControlManagementDlg::DoDataExchange(CDataExchange* pDX) {
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CHECK1, m_enableDisableCheck);
DDX_Control(pDX, IDC_EDIT1, m_myEditControl);
DDX_Check(pDX, IDC_CHECK1, m_enableDisableVal);
DDX_Text(pDX, IDC_EDIT1, m_editControlVal);
}
BEGIN_MESSAGE_MAP(CMFCControlManagementDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CHECK1, &CMFCControlManagementDlg::OnBnClickedCheck1)
END_MESSAGE_MAP()
// CMFCControlManagementDlg message handlers
BOOL CMFCControlManagementDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL) {
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty()) {
pSysMenu → AppendMenu(MF_SEPARATOR);
pSysMenu → AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
void CMFCControlManagementDlg::OnSysCommand(UINT nID, LPARAM lParam) {
if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}else {
CDialogEx::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMFCControlManagementDlg::OnPaint() {
if (IsIconic()) {
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND,
reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}else {
CDialogEx::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMFCControlManagementDlg::OnQueryDragIcon() {
return static_cast<HCURSOR>(m_hIcon);
}
void CMFCControlManagementDlg::OnBnClickedCheck1() {
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
}
步驟 5 - 當上述程式碼編譯並執行時,您將看到以下輸出。複選框預設未選中。這也停用了編輯控制元件。
步驟 6 - 選中“啟用控制元件”複選框。這將自動啟用編輯控制元件。