MFC - Gerenciamento de Controles

Em aplicativos MFC, após adicionar visualmente um controle ao seu aplicativo, se desejar fazer referência a ele em seu código, você pode declarar uma variável baseada ou associada a esse controle. A biblioteca MFC permite que você declare dois tipos de variáveis ​​para alguns dos controles usados ​​em um aplicativo, um valor ou uma variável de controle.

  • Uma variável é usada para as informações armazenadas no controle, que também é conhecido como Control Variable/Instance.

  • A outra variável é conhecida como Control Value Variable. Um usuário pode executar algum tipo de ação nesse controle com esta variável.

Variável / Instância de Controle

Uma variável de controle é uma variável baseada na classe que gerencia o controle. Por exemplo, um controle de botão é baseado na classe CButton.

Para ver esses conceitos na programação real, vamos criar um projeto MFCControlManagement baseado em diálogo do MFC.

Assim que o projeto for criado, você verá a seguinte caixa de diálogo na janela do designer.

Step 1- Exclua a linha TODO e arraste uma caixa de seleção e um controle de edição conforme mostrado no instantâneo a seguir. Altere a legenda da caixa de seleção para Ativar controle.

Step 2 - Clique com o botão direito na caixa de seleção.

Step 3 - Selecione Adicionar variável.

Step 4 - Agora você pode ver o Assistente para adicionar variável de membro.

Você pode selecionar diferentes opções nesta caixa de diálogo. Para checkbox, o tipo de variável é CButton. Ele é selecionado por padrão nesta caixa de diálogo.

Da mesma forma, o ID de controle também é selecionado por padrão, agora precisamos selecionar Controle na caixa de combinação Categoria e digitar m_enableDisableCheck na caixa de edição Nome da variável e clicar em Concluir.

Step 5 - Da mesma forma, adicione Control Variable of Edit control com as configurações mostradas no instantâneo a seguir.

Observe o arquivo de cabeçalho da classe de diálogo. Você pode ver que as novas variáveis ​​foram adicionadas agora.

CButton m_enableDisableCheck;
CEdit m_myEditControl;

Variável de valor de controle

Outro tipo de variável que você pode declarar para um controle é a variável de valor. Nem todos os controles fornecem uma variável de valor.

  • A variável de valor deve ser capaz de lidar com o tipo de valor armazenado no controle ao qual se destina a se referir.

  • Por exemplo, como um controle baseado em texto é usado para manipular texto, você pode declarar um tipo de dados baseado em texto para ele. Isso geralmente seria uma variável CString.

Vamos examinar esse tipo de variável para caixa de seleção e controle de edição.

Step 1 - Clique com o botão direito na caixa de seleção e selecione Adicionar variável.

Step 2- O tipo de variável é BOOL. Selecione Valor na lista suspensa Categoria.

Step 3 - Clique em Concluir para continuar.

Step 4 - Da mesma forma, adicione uma variável de valor para o controle de edição com as configurações mostradas no instantâneo a seguir.

Step 5 - Digite CString no tipo de variável e m_editControlVal no campo de nome da variável.

Step 6 - Agora você pode ver essas variáveis ​​adicionadas no arquivo de cabeçalho.

bool m_enableDisableVal;
CString m_editControlVal;

Controladores de manipuladores de eventos

Depois de adicionar um controle ao seu aplicativo, independentemente de tê-lo adicionado visualmente ou criado dinamicamente, você também decidirá como lidar com as possíveis ações que o usuário pode executar no controle.

  • Para as caixas de diálogo do projeto que já estão associadas a uma classe, você pode tirar proveito de alguns atalhos ao criar manipuladores de eventos.

  • Você pode criar rapidamente um manipulador para o evento de notificação de controle padrão ou para qualquer mensagem aplicável do Windows.

Vejamos o mesmo exemplo em que adicionamos o manipulador de eventos para checkbox.

Step 1 - Clique com o botão direito no controle para o qual deseja tratar o evento de notificação.

Step 2 - No menu de atalho, clique em Adicionar manipulador de eventos para exibir o Assistente de manipulador de eventos.

Step 3 - Selecione o evento na caixa Tipo de mensagem para adicioná-lo à classe selecionada na caixa de listagem Classe.

Step 4 - Aceite o nome padrão na caixa Nome do manipulador de função ou forneça o nome de sua escolha.

Step 5 - Clique em Adicionar e editar para adicionar o manipulador de eventos.

Step 6 - Agora você pode ver o seguinte evento adicionado ao final do arquivo CMFCControlManagementDlg.cpp.

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

Gestão de Controles

Até agora, vimos como adicionar controles a um aplicativo. Veremos agora como gerenciar esses controles de acordo com os requisitos do usuário. Podemos usar a variável / instância de controle em um manipulador de eventos específico.

Step 1- Vejamos o seguinte exemplo. Aqui, iremos ativar / desativar o controle de edição quando a caixa de seleção estiver marcada / desmarcada.

Step 2- Agora adicionamos o manipulador de eventos de clique na caixa de seleção. Aqui está a implementação -

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 a caixa de diálogo é criada, precisamos adicionar o seguinte código a CMFCControlManagementDlg :: OnInitDialog (). Isso gerenciará esses controles.

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

Step 4 - Aqui está a implementação completa do arquivo 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 o código acima for compilado e executado, você verá a seguinte saída. A caixa de seleção está desmarcada por padrão. Isso desativa o controle de edição também.

Step 6- Marque a caixa de seleção Ativar controle. Isso ativará automaticamente o controle de edição.