MFC - Gestión de controles

En las aplicaciones MFC, después de agregar visualmente un control a su aplicación, si desea hacer referencia a él en su código, puede declarar una variable basada en ese control o asociada con él. La biblioteca MFC le permite declarar dos tipos de variables para algunos de los controles utilizados en una aplicación, un valor o una variable de control.

  • Una variable se utiliza para la información almacenada en el control, que también se conoce como Control Variable/Instance.

  • La otra variable se conoce como Control Value Variable. Un usuario puede realizar algún tipo de acciones en ese control con esta variable.

Variable de control / instancia

Una variable de control es una variable basada en la clase que administra el control. Por ejemplo, un control de botón se basa en la clase CButton.

Para ver estos conceptos en la programación real, creemos un proyecto basado en diálogo MFC MFCControlManagement.

Una vez creado el proyecto, verá el siguiente cuadro de diálogo en la ventana del diseñador.

Step 1- Elimine la línea TODO y arrastre una casilla de verificación y un control de edición como se muestra en la siguiente instantánea. Cambie el título de la casilla de verificación a Habilitar control.

Step 2 - Haga clic con el botón derecho en la casilla de verificación.

Step 3 - Seleccione Agregar variable.

Step 4 - Ahora puede ver el Asistente para agregar variable de miembro.

Puede seleccionar diferentes opciones en este cuadro de diálogo. Para la casilla de verificación, el tipo de variable es CButton. Está seleccionado de forma predeterminada en este cuadro de diálogo.

De manera similar, el ID de control también está seleccionado de forma predeterminada, ahora debemos seleccionar Control en el cuadro combinado Categoría, y escribir m_enableDisableCheck en el cuadro de edición Nombre de variable y hacer clic en finalizar.

Step 5 - De manera similar, agregue la Variable de control del control de edición con la configuración como se muestra en la siguiente instantánea.

Observe el archivo de encabezado de la clase de diálogo. Puede ver que las nuevas variables se han agregado ahora.

CButton m_enableDisableCheck;
CEdit m_myEditControl;

Variable de valor de control

Otro tipo de variable que puede declarar para un control es la variable de valor. No todos los controles proporcionan una variable de valor.

  • La variable de valor debe poder manejar el tipo de valor almacenado en el control al que se pretende hacer referencia.

  • Por ejemplo, debido a que se usa un control basado en texto para manejar texto, puede declarar un tipo de datos basado en texto para él. Por lo general, sería una variable CString.

Examinemos este tipo de variable para comprobar la casilla de verificación y el control de edición.

Step 1 - Haga clic con el botón derecho en la casilla de verificación y seleccione Agregar variable.

Step 2- El tipo de variable es BOOL. Seleccione Valor de la lista desplegable Categoría.

Step 3 - Haga clic en Finalizar para continuar.

Step 4 - De manera similar, agregue valor Variable para el control de edición con la configuración como se muestra en la siguiente instantánea.

Step 5 - Escriba CString en tipo de variable y m_editControlVal en el campo de nombre de variable.

Step 6 - Ahora puede ver estas variables agregadas en el archivo de encabezado.

bool m_enableDisableVal;
CString m_editControlVal;

Controla los controladores de eventos

Después de agregar un control a su aplicación, ya sea que lo haya agregado visualmente o lo haya creado dinámicamente, también decidirá cómo manejar las posibles acciones que el usuario puede realizar en el control.

  • Para los cuadros de diálogo del proyecto que ya están asociados con una clase, puede aprovechar algunos accesos directos al crear controladores de eventos.

  • Puede crear rápidamente un controlador para el evento de notificación de control predeterminado o para cualquier mensaje de Windows aplicable.

Veamos el mismo ejemplo en el que agregamos el controlador de eventos para la casilla de verificación.

Step 1 - Haga clic con el botón derecho en el control para el que desea manejar el evento de notificación.

Step 2 - En el menú de acceso directo, haga clic en Agregar controlador de eventos para mostrar el Asistente para el controlador de eventos.

Step 3 - Seleccione el evento en el cuadro Tipo de mensaje para agregarlo a la clase seleccionada en el cuadro de lista Clase.

Step 4 - Acepte el nombre predeterminado en el cuadro Nombre del controlador de funciones o proporcione el nombre de su elección.

Step 5 - Haga clic en Agregar y editar para agregar el controlador de eventos.

Step 6 - Ahora puede ver el siguiente evento agregado al final del archivo CMFCControlManagementDlg.cpp.

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

Gestión de controles

Hasta ahora, hemos visto cómo agregar controles a una aplicación. Ahora veremos cómo administrar estos controles según los requisitos del usuario. Podemos usar la variable / instancia de control en un controlador de eventos en particular.

Step 1- Veamos el siguiente ejemplo. Aquí, habilitaremos / deshabilitaremos el control de edición cuando la casilla de verificación esté marcada / desmarcada.

Step 2- Ahora hemos agregado el controlador de eventos de clic de casilla de verificación. Aquí está la implementació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- Cuando se crea el diálogo, necesitamos agregar el siguiente código a CMFCControlManagementDlg :: OnInitDialog (). Esto administrará estos controles.

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

Step 4 - Aquí está la implementación completa del archivo 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- Cuando se compile y ejecute el código anterior, verá el siguiente resultado. La casilla de verificación está desmarcada de forma predeterminada. Esto también deshabilita el control de edición.

Step 6- Marque la casilla de verificación Habilitar control. Esto habilitará automáticamente el control de edición.