MFC - Gestione controlli
Nelle applicazioni MFC, dopo aver aggiunto visivamente un controllo all'applicazione, se si desidera fare riferimento ad esso nel codice, è possibile dichiarare una variabile basata su o associata a tale controllo. La libreria MFC consente di dichiarare un valore o una variabile di controllo due tipi di variabili per alcuni dei controlli utilizzati in un'applicazione.
Una variabile viene utilizzata per le informazioni memorizzate nel controllo, noto anche come Control Variable/Instance.
L'altra variabile è nota come Control Value Variable. Un utente può eseguire una sorta di azioni su quel controllo con questa variabile.
Variabile di controllo / istanza
Una variabile di controllo è una variabile basata sulla classe che gestisce il controllo. Ad esempio, un controllo pulsante si basa sulla classe CButton.
Per vedere questi concetti nella programmazione reale, creiamo un progetto MFCControlManagement basato su finestre di dialogo MFC.
Una volta creato il progetto, vedrai la seguente finestra di dialogo nella finestra di progettazione.
Step 1- Elimina la riga TODO e trascina una casella di controllo e un controllo Modifica come mostrato nell'istantanea seguente. Modificare la didascalia della casella di controllo in Abilita controllo.
Step 2 - Fare clic con il tasto destro sulla casella di controllo.
Step 3 - Seleziona Aggiungi variabile.
Step 4 - È ora possibile visualizzare l'Aggiunta guidata variabile membro.
È possibile selezionare diverse opzioni in questa finestra di dialogo. Per la casella di controllo, il tipo di variabile è CButton. È selezionato per impostazione predefinita in questa finestra di dialogo.
Allo stesso modo, anche l'ID di controllo è selezionato per impostazione predefinita, ora è necessario selezionare Controllo nella casella combinata Categoria e digitare m_enableDisableCheck nella casella di modifica Nome variabile e fare clic su Fine.
Step 5 - Allo stesso modo, aggiungi la variabile di controllo del controllo Modifica con le impostazioni come mostrato nella seguente istantanea.
Osservare il file di intestazione della classe di dialogo. Puoi vedere che le nuove variabili sono state aggiunte ora.
CButton m_enableDisableCheck;
CEdit m_myEditControl;
Variabile del valore di controllo
Un altro tipo di variabile che puoi dichiarare per un controllo è la variabile valore. Non tutti i controlli forniscono una variabile di valore.
La variabile valore deve essere in grado di gestire il tipo di valore memorizzato nel controllo a cui si intende fare riferimento.
Ad esempio, poiché un controllo basato su testo viene utilizzato per gestire il testo, è possibile dichiarare un tipo di dati basato su testo per esso. Di solito è una variabile CString.
Esaminiamo questo tipo di variabile per la casella di controllo e il controllo di modifica.
Step 1 - Fare clic con il pulsante destro del mouse sulla casella di controllo e selezionare Aggiungi variabile.
Step 2- Il tipo di variabile è BOOL. Seleziona Valore dall'elenco a discesa Categoria.
Step 3 - Fare clic su Fine per continuare.
Step 4 - Allo stesso modo, aggiungi valore Variabile per il controllo Modifica con le impostazioni come mostrato nella seguente istantanea.
Step 5 - Digita CString nel tipo di variabile e m_editControlVal nel campo del nome della variabile.
Step 6 - Ora puoi vedere queste variabili aggiunte nel file di intestazione.
bool m_enableDisableVal;
CString m_editControlVal;
Controlla i gestori di eventi
Dopo aver aggiunto un controllo alla vostra applicazione, sia che lo abbiate aggiunto visivamente sia che lo abbiate creato dinamicamente, deciderete anche come gestire le possibili azioni che l'utente può eseguire sul controllo.
Per le finestre di dialogo del progetto che sono già associate a una classe, puoi sfruttare alcune scorciatoie quando crei gestori di eventi.
È possibile creare rapidamente un gestore per l'evento di notifica del controllo predefinito o per qualsiasi messaggio di Windows applicabile.
Esaminiamo lo stesso esempio in cui abbiamo aggiunto il gestore eventi per la casella di controllo.
Step 1 - Fare clic con il pulsante destro del mouse sul controllo per il quale si desidera gestire l'evento di notifica.
Step 2 - Nel menu di scelta rapida, fare clic su Aggiungi gestore eventi per visualizzare la procedura guidata del gestore eventi.
Step 3 - Selezionare l'evento nella casella Tipo di messaggio da aggiungere alla classe selezionata nella casella di riepilogo Classe.
Step 4 - Accetta il nome predefinito nella casella Nome gestore funzione o fornisci il nome di tua scelta.
Step 5 - Fai clic su Aggiungi e modifica per aggiungere il gestore dell'evento.
Step 6 - È ora possibile vedere il seguente evento aggiunto alla fine del file CMFCControlManagementDlg.cpp.
void CMFCControlManagementDlg::OnBnClickedCheck1() {
// TODO: Add your control notification handler code here
}
Gestione dei controlli
Finora abbiamo visto come aggiungere controlli a un'applicazione. Vedremo ora come gestire questi controlli secondo le esigenze dell'utente. Possiamo usare la variabile di controllo / istanza in un particolare gestore di eventi.
Step 1- Esaminiamo il seguente esempio. Qui, abiliteremo / disabiliteremo il controllo di modifica quando la casella di controllo è selezionata / deselezionata.
Step 2- Ora abbiamo aggiunto la casella di controllo gestore dell'evento clic. Ecco l'implementazione:
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- Quando viene creata la finestra di dialogo, è necessario aggiungere il codice seguente a CMFCControlManagementDlg :: OnInitDialog (). Questo gestirà questi controlli.
UpdateData(TRUE);
if (m_enableDisableVal)
m_myEditControl.EnableWindow(TRUE);
else
m_myEditControl.EnableWindow(FALSE);
Step 4 - Ecco l'implementazione completa del file 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- Quando il codice sopra è stato compilato ed eseguito, vedrai il seguente output. La casella di controllo è deselezionata per impostazione predefinita. Questo disabilita anche il controllo di modifica.
Step 6- Seleziona la casella di controllo Abilita controllo. Ciò abiliterà automaticamente il controllo di modifica.