MFC - ควบคุมการจัดการ
ในแอปพลิเคชัน MFC หลังจากเพิ่มตัวควบคุมลงในแอปพลิเคชันของคุณด้วยสายตาแล้วหากคุณต้องการอ้างถึงในโค้ดของคุณคุณสามารถประกาศตัวแปรตามหรือเชื่อมโยงกับการควบคุมนั้นได้ ไลบรารี MFC ช่วยให้คุณสามารถประกาศตัวแปรสองประเภทสำหรับตัวควบคุมบางตัวที่ใช้ในแอปพลิเคชันเป็นค่าหรือตัวแปรควบคุม
ตัวแปรเดียวใช้สำหรับข้อมูลที่จัดเก็บในตัวควบคุมซึ่งเรียกอีกอย่างว่า Control Variable/Instance.
ตัวแปรอื่นเรียกว่า Control Value Variable. ผู้ใช้สามารถดำเนินการบางอย่างกับตัวควบคุมนั้นด้วยตัวแปรนี้
ควบคุมตัวแปร / อินสแตนซ์
ตัวแปรควบคุมคือตัวแปรตามคลาสที่จัดการคอนโทรล ตัวอย่างเช่นปุ่มควบคุมจะขึ้นอยู่กับคลาส CButton
หากต้องการดูแนวคิดเหล่านี้ในการเขียนโปรแกรมจริงให้เราสร้าง MFC โต้ตอบตามโครงการ MFCControlManagement
เมื่อสร้างโครงการแล้วคุณจะเห็นกล่องโต้ตอบต่อไปนี้ในหน้าต่างนักออกแบบ
Step 1- ลบบรรทัดสิ่งที่ต้องทำและลากช่องทำเครื่องหมายหนึ่งช่องและหนึ่งตัวควบคุมแก้ไขดังที่แสดงในภาพรวมต่อไปนี้ เปลี่ยนคำบรรยายของช่องทำเครื่องหมายเป็นเปิดใช้งานการควบคุม
Step 2 - คลิกขวาที่ช่องทำเครื่องหมาย
Step 3 - เลือกเพิ่มตัวแปร
Step 4 - ตอนนี้คุณสามารถดู Add Member Variable Wizard
คุณสามารถเลือกตัวเลือกต่างๆในกล่องโต้ตอบนี้ สำหรับช่องทำเครื่องหมายประเภทตัวแปรคือ CButton ถูกเลือกโดยค่าเริ่มต้นในกล่องโต้ตอบนี้
ในทำนองเดียวกันรหัสควบคุมจะถูกเลือกโดยค่าเริ่มต้นตอนนี้เราต้องเลือกตัวควบคุมในกล่องคำสั่งผสมประเภทและพิมพ์ m_enableDisableCheck ในกล่องแก้ไขชื่อตัวแปรและคลิกเสร็จสิ้น
Step 5 - ในทำนองเดียวกันให้เพิ่ม Control Variable ของ Edit control ด้วยการตั้งค่าดังที่แสดงในภาพรวมต่อไปนี้
สังเกตไฟล์ส่วนหัวของคลาสไดอะล็อก คุณจะเห็นว่ามีการเพิ่มตัวแปรใหม่แล้ว
CButton m_enableDisableCheck;
CEdit m_myEditControl;
ตัวแปรค่าควบคุม
ตัวแปรอีกประเภทหนึ่งที่คุณสามารถประกาศสำหรับตัวควบคุมคือตัวแปรค่า ตัวควบคุมบางตัวไม่ได้ระบุตัวแปรค่า
ตัวแปรค่าต้องสามารถจัดการกับชนิดของค่าที่จัดเก็บในตัวควบคุมที่ต้องการอ้างถึง
ตัวอย่างเช่นเนื่องจากตัวควบคุมที่ใช้ข้อความถูกใช้เพื่อจัดการกับข้อความคุณสามารถประกาศชนิดข้อมูลที่เป็นข้อความได้ โดยปกติจะเป็นตัวแปร CString
ให้เราตรวจสอบตัวแปรประเภทนี้สำหรับช่องทำเครื่องหมายและแก้ไขการควบคุม
Step 1 - คลิกขวาที่ช่องทำเครื่องหมายแล้วเลือกเพิ่มตัวแปร
Step 2- ประเภทตัวแปรคือ BOOL เลือกค่าจากรายการแบบเลื่อนลงหมวดหมู่
Step 3 - คลิกเสร็จสิ้นเพื่อดำเนินการต่อ
Step 4 - ในทำนองเดียวกันให้เพิ่มค่าตัวแปรสำหรับการควบคุมแก้ไขด้วยการตั้งค่าดังที่แสดงในภาพรวมต่อไปนี้
Step 5 - พิมพ์ CString ในประเภทตัวแปรและ m_editControlVal ในช่องชื่อตัวแปร
Step 6 - ตอนนี้คุณสามารถเห็นตัวแปรเหล่านี้เพิ่มในไฟล์ส่วนหัว
bool m_enableDisableVal;
CString m_editControlVal;
ควบคุมตัวจัดการเหตุการณ์
หลังจากเพิ่มการควบคุมลงในแอปพลิเคชันของคุณไม่ว่าคุณจะเพิ่มด้วยภาพหรือสร้างแบบไดนามิกคุณจะตัดสินใจว่าจะจัดการกับการกระทำที่เป็นไปได้ที่ผู้ใช้สามารถดำเนินการได้อย่างไร
สำหรับกล่องโต้ตอบโปรเจ็กต์ที่เชื่อมโยงกับคลาสแล้วคุณสามารถใช้ประโยชน์จากทางลัดบางอย่างเมื่อคุณสร้างตัวจัดการเหตุการณ์
คุณสามารถสร้างตัวจัดการสำหรับเหตุการณ์การแจ้งเตือนการควบคุมเริ่มต้นหรือสำหรับข้อความ Windows ที่เกี่ยวข้องได้อย่างรวดเร็ว
ให้เราดูตัวอย่างเดียวกับที่เราเพิ่มตัวจัดการเหตุการณ์สำหรับช่องทำเครื่องหมาย
Step 1 - คลิกขวาที่ตัวควบคุมที่คุณต้องการจัดการกับเหตุการณ์การแจ้งเตือน
Step 2 - บนเมนูทางลัดคลิกเพิ่มตัวจัดการเหตุการณ์เพื่อแสดงตัวช่วยจัดการเหตุการณ์
Step 3 - เลือกเหตุการณ์ในกล่องประเภทข้อความเพื่อเพิ่มลงในคลาสที่เลือกในกล่องรายการคลาส
Step 4 - ยอมรับชื่อเริ่มต้นในกล่องชื่อตัวจัดการฟังก์ชันหรือระบุชื่อที่คุณต้องการ
Step 5 - คลิกเพิ่มและแก้ไขเพื่อเพิ่มตัวจัดการเหตุการณ์
Step 6 - ตอนนี้คุณสามารถดูเหตุการณ์ต่อไปนี้ที่เพิ่มไว้ที่ท้ายไฟล์ CMFCControlManagementDlg.cpp
void CMFCControlManagementDlg::OnBnClickedCheck1() {
// TODO: Add your control notification handler code here
}
ควบคุมการจัดการ
จนถึงตอนนี้เราได้เห็นวิธีเพิ่มการควบคุมให้กับแอปพลิเคชันแล้ว ตอนนี้เราจะดูวิธีจัดการการควบคุมเหล่านี้ตามความต้องการของผู้ใช้ เราสามารถใช้ตัวแปรควบคุม / อินสแตนซ์ในตัวจัดการเหตุการณ์เฉพาะ
Step 1- ให้เราดูตัวอย่างต่อไปนี้ ที่นี่เราจะเปิด / ปิดการควบคุมการแก้ไขเมื่อช่องทำเครื่องหมายถูกเลือก / ไม่เลือก
Step 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);
}
Step 3- เมื่อสร้างกล่องโต้ตอบเราจำเป็นต้องเพิ่มรหัสต่อไปนี้ใน CMFCControlManagementDlg :: OnInitDialog () ซึ่งจะจัดการการควบคุมเหล่านี้
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
Step 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);
}
Step 5- เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้ ช่องทำเครื่องหมายจะไม่ถูกเลือกโดยค่าเริ่มต้น ซึ่งจะปิดใช้งานตัวควบคุมการแก้ไขด้วย
Step 6- เลือกช่องทำเครื่องหมายเปิดใช้งานการควบคุม ซึ่งจะเปิดใช้งานตัวควบคุมการแก้ไขโดยอัตโนมัติ