MFC - 複選框



複選框是一個 Windows 控制元件,允許使用者將專案的 value 設定或更改為真或假。

讓我們建立一個新的基於 MFC 對話方塊的專案。

專案建立後,您將在設計器視窗中看到以下對話方塊。

步驟 1 - 刪除 TODO 行,並拖動一個複選框和一個編輯控制元件,如下圖所示。同時將複選框的標題更改為“啟用控制元件”。

Checkbox

步驟 2 - 右鍵單擊複選框,然後選擇“新增變數”。

Checkbox Add Member Var

步驟 3 - 您可以在此對話方塊中選擇不同的選項。對於複選框,預設情況下選擇 CButton 變數型別。

步驟 4 - 同樣,控制元件 ID 也預設為選中狀態。現在,我們需要在“類別”組合框中選擇“控制元件”,在“變數名”編輯框中鍵入 m_enableDisableCheck,然後單擊“完成”。

步驟 5 - 使用以下快照中顯示的設定新增編輯控制元件的控制元件變數。

Checkbox Edit Control

步驟 6 - 檢視對話方塊類的標頭檔案。您現在可以看到這兩個變數已新增。

CButton m_enableDisableCheck;
CEdit m_myEditControl;

步驟 7 - 右鍵單擊複選框,然後選擇“新增變數”。

Checkbox Add Variable

步驟 8 - 單擊“完成”繼續。

步驟 9 - 使用以下快照中顯示的設定新增編輯控制元件的值變數。

Checkbox Edit Variable

步驟 10 - 檢視標頭檔案。您現在可以看到新變數已新增。

bool m_enableDisableVal;
CString m_editControlVal;

步驟 11 - 現在我們將為複選框新增事件處理程式。

步驟 12 - 右鍵單擊要處理通知事件的控制元件。

Checkbox Event Handler

步驟 13 - 在“訊息型別”框中選擇要新增到“類”列表框中選擇的類中的事件。

步驟 14 - 接受“函式處理程式名稱”框中的預設名稱,或提供您選擇的名稱。

步驟 15 - 單擊“新增和編輯”以新增事件處理程式。

步驟 16 - 您現在可以在 CMFCControlManagementDlg.cpp 檔案的末尾看到以下新增的事件。

void CMFCControlManagementDlg::OnBnClickedCheck1() {
   // TODO: Add your control notification handler code here
}

步驟 17 - 這會在選中/取消選中複選框時啟用/停用編輯控制元件。

步驟 18 - 我們現在已新增複選框單擊事件處理程式。以下是複選框事件處理程式的實現。

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);
}

步驟 19 - 我們需要將以下程式碼新增到 CMFCControlManagementDlg::OnInitDialog()。建立對話方塊時,它將管理這些控制元件。

UpdateData(TRUE);
if (m_enableDisableVal)
   m_myEditControl.EnableWindow(TRUE);
else
   m_myEditControl.EnableWindow(FALSE);

步驟 20 - 以下是 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::CMFCControlManagementDlg(CWnd* pParent /* = NULL*/)
   : CDialogEx(IDD_MFCCONTROLMANAGEMENT_DIALOG, pParent), 
   m_enableDisableVal(FALSE), m_editControlVal(_T("")) {
  
   m_hIcon = AfxGetApp()→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);
}

步驟 21 - 編譯並執行上述程式碼後,您將看到以下輸出。您現在可以看到複選框預設情況下未選中。這將停用編輯控制元件。

Edit Control Disable

步驟 22 - 現在,當您選中複選框時,編輯控制元件將被啟用。

Edit Control Enabled
mfc_windows_controls.htm
廣告