MFC - Quản lý điều khiển
Trong các ứng dụng MFC, sau khi thêm đ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 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 một ứng dụng là 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à Control Variable/Instance.
Biến khác được gọi là Control Value Variable. 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.
Kiểm soát biến / phiên bản
Biến điều khiển là một 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 những khái niệm này trong lập trình thực, chúng ta hãy tạo một dự án MFCControlManagement dựa trên hộp thoại MFC.
Sau 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ế.
Step 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. Thay đổi chú thích của hộp kiểm thành Bật điều khiển.
Step 2 - Nhấp chuột phải vào hộp kiểm.
Step 3 - Chọn Thêm biến.
Step 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 Điều khiển 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.
Step 5 - Tương tự, thêm Control Variable của điều khiển Edit với các cài đặt như trong ảnh chụp sau.
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 bây giờ.
CButton m_enableDisableCheck;
CEdit m_myEditControl;
Kiểm soát biến giá trị
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.
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 sẽ là một biến CString.
Hãy để chúng tôi xem xét loại biến này để kiểm soát hộp kiểm và chỉnh sửa.
Step 1 - Nhấp chuột phải vào hộp kiểm và chọn Thêm biến.
Step 2- Loại biến là BOOL. Chọn Giá trị từ danh sách thả xuống Danh mục.
Step 3 - Nhấn Hoàn tất để tiếp tục.
Step 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 sau.
Step 5 - Gõ CString vào kiểu biến và m_editControlVal trong trường tên biến.
Step 6 - Bây giờ bạn có thể thấy các biến này được thêm vào trong tệp Header.
bool m_enableDisableVal;
CString m_editControlVal;
Kiểm soát Trình 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ó động, bạn cũng sẽ quyết định cách xử lý các tác vụ có thể xảy ra 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 áp dụng nào.
Chúng ta hãy xem xét cùng một ví dụ trong đó chúng tôi đã thêm trình xử lý sự kiện cho hộp kiểm.
Step 1 - Bấm chuột phải vào điều khiển mà bạn muốn xử lý sự kiện thông báo.
Step 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 Xử lý Sự kiện.
Step 3 - Chọn sự kiện trong hộp Loại tin nhắn để thêm vào lớp đã chọn trong hộp danh sách Lớp.
Step 4 - Chấp nhận tên mặc định trong hộp Tên trình xử lý hàm hoặc cung cấp tên bạn chọn.
Step 5 - Nhấp vào Thêm và chỉnh sửa để thêm trình xử lý sự kiện.
Step 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ý kiểm soát
Cho đến nay, chúng ta đã thấy cách thêm điều khiển vào ứ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ể.
Step 1- Chúng ta hãy xem xét ví dụ sau. Tại đâ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.
Step 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);
}
Step 3- Khi hộp thoại được tạo, chúng ta cần thêm đoạn mã sau vào CMFCControlManagementDlg :: OnInitDialog (). Điều 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);
Step 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);
}
Step 5- Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy kết quả như sau. Hộp kiểm không được chọn theo mặc định. Điều này cũng vô hiệu hóa điều khiển chỉnh sửa.
Step 6- Đánh dấu vào hộp kiểm Enable Control. Điều này sẽ tự động bật kiểm soát chỉnh sửa.