Trong các ứng dụng MFC, sau khi thêm một điều khiển vào ứng dụng của bạn một cách trực quan, nếu bạn muốn tham chiếu nó trong mã của mình, bạn có thể khai báo một biến dựa trên hoặc được liên kết với điều khiển đó. Thư viện MFC cho phép bạn khai báo hai loại biến cho một số điều khiển được sử dụng trong ứng dụng một giá trị hoặc một biến điều khiển.
- Một biến được sử dụng cho thông tin được lưu trữ trong điều khiển, còn được gọi là Biến/Trường hợp điều khiển .
- Biến còn lại được gọi là Biến giá trị kiểm soát . Người dùng có thể thực hiện một số loại hành động trên điều khiển đó với biến này.
Biến/Thực thể điều khiển
Biến điều khiển là biến dựa trên lớp quản lý điều khiển. Ví dụ, một nút điều khiển dựa trên lớp CButton.
Để xem các khái niệm này trong lập trình thực tế, chúng ta hãy tạo một dự án MFCControlManagement dựa trên hộp thoại MFC.
Khi dự án được tạo, bạn sẽ thấy hộp thoại sau trong cửa sổ trình thiết kế.
Bước 1 – Xóa dòng TODO và kéo một hộp kiểm và một điều khiển Chỉnh sửa như được hiển thị trong ảnh chụp nhanh sau đây. Thay đổi chú thích của hộp kiểm thành Bật Kiểm soát.
Bước 2 – Nhấp chuột phải vào hộp kiểm.
Bước 3 – Chọn Thêm biến.
Bước 4 – Bây giờ bạn có thể thấy Trình hướng dẫn Thêm biến thành viên.
Bạn có thể chọn các tùy chọn khác nhau trên hộp thoại này. Đối với hộp kiểm, loại biến là CButton. Nó được chọn theo mặc định trong hộp thoại này.
Tương tự, ID điều khiển cũng được chọn theo mặc định, bây giờ chúng ta cần chọn Control trong hộp tổ hợp Danh mục và nhập m_enableDisableCheck vào hộp chỉnh sửa Tên biến và nhấp vào kết thúc.
Bước 5 – Tương tự, thêm Biến điều khiển của điều khiển Chỉnh sửa với các cài đặt như trong ảnh chụp nhanh sau đây.
Quan sát tệp tiêu đề của lớp hộp thoại. Bạn có thể thấy rằng các biến mới đã được thêm vào ngay bây giờ.
CButton m_enableDisableCheck;
CEdit m_myEditControl;
Kiểm soát giá trị biến
Một loại biến khác mà bạn có thể khai báo cho một điều khiển là biến giá trị. Không phải tất cả các điều khiển đều cung cấp một biến giá trị.
- Biến giá trị phải có khả năng xử lý loại giá trị được lưu trữ trong điều khiển mà nó dự định tham chiếu đến.
- Ví dụ: vì điều khiển dựa trên văn bản được sử dụng để xử lý văn bản, bạn có thể khai báo kiểu dữ liệu dựa trên văn bản cho nó. Đây thường là một biến CString.
Chúng ta hãy xem xét loại biến này cho hộp kiểm và điều khiển chỉnh sửa.Bước 1 – Nhấp chuột phải vào hộp kiểm và chọn Thêm biến.
Bước 2 – Loại Biến là BOOL. Chọn Giá trị từ danh sách thả xuống Danh mục.
Bước 3 – Nhấp vào Kết thúc để tiếp tục.
Bước 4 – Tương tự, thêm giá trị Biến cho điều khiển Chỉnh sửa với các cài đặt như trong ảnh chụp nhanh sau đây.
Bước 5 – Nhập CString vào loại biến và m_editControlVal trong trường tên biến.Bước 6 – Bây giờ bạn có thể thấy các biến này được thêm vào tệp Tiêu đề.
bool m_enableDisableVal;
CString m_editControlVal;
Điều khiển xử lý sự kiện
Sau khi thêm một điều khiển vào ứng dụng của bạn, cho dù bạn đã thêm nó một cách trực quan hay tạo nó một cách linh hoạt, bạn cũng sẽ quyết định cách xử lý các hành động có thể có mà người dùng có thể thực hiện trên điều khiển.
- Đối với các hộp thoại dự án đã được liên kết với một lớp, bạn có thể tận dụng một số phím tắt khi tạo trình xử lý sự kiện.
- Bạn có thể nhanh chóng tạo một trình xử lý cho sự kiện thông báo điều khiển mặc định hoặc cho bất kỳ thông báo Windows hiện hành nào.
Chúng ta hãy xem xét ví dụ tương tự trong đó chúng ta đã thêm trình xử lý sự kiện cho hộp kiểm.
Bước 1 – Nhấp chuột phải vào điều khiển mà bạn muốn xử lý sự kiện thông báo.
Bước 2 – Trên menu lối tắt, nhấp vào Thêm Trình xử lý Sự kiện để hiển thị Trình hướng dẫn Trình xử lý Sự kiện.
Bước 3 – Chọn sự kiện trong hộp Loại thông báo để thêm vào lớp đã chọn trong hộp Danh sách lớp.
Bước 4 – Chấp nhận tên mặc định trong hộp Tên trình xử lý chức năng hoặc cung cấp tên bạn chọn.
Bước 5 – Nhấp vào Thêm và chỉnh sửa để thêm trình xử lý sự kiện.
Bước 6 – Bây giờ bạn có thể thấy sự kiện sau được thêm vào cuối tệp CMFCControlManagementDlg.cpp.
void CMFCControlManagementDlg::OnBnClickedCheck1() {
// TODO: Add your control notification handler code here
}
Quản lý điều khiển
Cho đến giờ, chúng ta đã biết cách thêm các điều khiển vào một ứng dụng. Bây giờ chúng ta sẽ xem cách quản lý các điều khiển này theo yêu cầu của người dùng. Chúng ta có thể sử dụng biến/thể hiện điều khiển trong một trình xử lý sự kiện cụ thể.
Bước 1 – Chúng ta hãy xem xét ví dụ sau. Ở đây, chúng tôi sẽ bật/tắt kiểm soát chỉnh sửa khi hộp kiểm được chọn/bỏ chọn.
Bước 2 – Bây giờ chúng tôi đã thêm trình xử lý sự kiện nhấp vào hộp kiểm. Đây là cách thực hiện
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);
}
Bước 3 – Khi hộp thoại được tạo, chúng ta cần thêm đoạn mã sau vào CMFCControlManagementDlg::OnInitDialog(). Thao tác này sẽ quản lý các điều khiển này.
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
Bước 4 – Đây là phần triển khai hoàn chỉnh của tệp 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);
}
Bước 5 – Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy đầu ra sau. Hộp kiểm được bỏ chọn theo mặc định. Điều này cũng vô hiệu hóa kiểm soát chỉnh sửa.
Bước 6 – Chọn hộp kiểm Bật điều khiển. Điều này sẽ tự động kích hoạt kiểm soát chỉnh sửa.