MFC - Gestion des contrôles

Dans les applications MFC, après avoir ajouté visuellement un contrôle à votre application, si vous souhaitez y faire référence dans votre code, vous pouvez déclarer une variable basée sur ou associée à ce contrôle. La bibliothèque MFC vous permet de déclarer deux types de variables pour certains des contrôles utilisés dans une application une valeur ou une variable de contrôle.

  • Une variable est utilisée pour les informations stockées dans le contrôle, également appelées Control Variable/Instance.

  • L'autre variable est connue sous le nom de Control Value Variable. Un utilisateur peut effectuer une sorte d'actions sur ce contrôle avec cette variable.

Variable de contrôle / instance

Une variable de contrôle est une variable basée sur la classe qui gère le contrôle. Par exemple, un contrôle bouton est basé sur la classe CButton.

Pour voir ces concepts dans la programmation réelle, créons un projet MFCControlManagement basé sur le dialogue MFC.

Une fois le projet créé, vous verrez la boîte de dialogue suivante dans la fenêtre du concepteur.

Step 1- Supprimez la ligne TODO et faites glisser une case à cocher et un contrôle d'édition comme indiqué dans l'instantané suivant. Modifiez la légende de la case à cocher sur Activer le contrôle.

Step 2 - Cliquez avec le bouton droit sur la case à cocher.

Step 3 - Sélectionnez Ajouter une variable.

Step 4 - Vous pouvez maintenant voir l'assistant d'ajout de variable de membre.

Vous pouvez sélectionner différentes options dans cette boîte de dialogue. Pour la case à cocher, le type de variable est CButton. Il est sélectionné par défaut dans cette boîte de dialogue.

De même, l'ID de contrôle est également sélectionné par défaut, nous devons maintenant sélectionner Contrôle dans la zone de liste déroulante Catégorie, et tapez m_enableDisableCheck dans la zone d'édition Nom de la variable et cliquez sur Terminer.

Step 5 - De même, ajoutez la variable de contrôle du contrôle d'édition avec les paramètres comme indiqué dans l'instantané suivant.

Observez le fichier d'en-tête de la classe de dialogue. Vous pouvez voir que les nouvelles variables ont été ajoutées maintenant.

CButton m_enableDisableCheck;
CEdit m_myEditControl;

Variable de valeur de contrôle

Un autre type de variable que vous pouvez déclarer pour un contrôle est la variable value. Tous les contrôles ne fournissent pas une variable de valeur.

  • La variable de valeur doit être capable de gérer le type de valeur stockée dans le contrôle auquel elle est destinée.

  • Par exemple, étant donné qu'un contrôle basé sur du texte est utilisé pour gérer du texte, vous pouvez déclarer un type de données basé sur du texte pour celui-ci. Ce serait généralement une variable CString.

Examinons ce type de variable pour la case à cocher et le contrôle d'édition.

Step 1 - Cliquez avec le bouton droit sur la case à cocher et sélectionnez Ajouter une variable.

Step 2- Le type de variable est BOOL. Sélectionnez Valeur dans la liste déroulante Catégorie.

Step 3 - Cliquez sur Terminer pour continuer.

Step 4 - De même, ajoutez une valeur Variable pour le contrôle d'édition avec les paramètres comme indiqué dans l'instantané suivant.

Step 5 - Tapez CString dans le type de variable et m_editControlVal dans le champ de nom de variable.

Step 6 - Vous pouvez maintenant voir ces variables ajoutées dans le fichier d'en-tête.

bool m_enableDisableVal;
CString m_editControlVal;

Contrôles des gestionnaires d'événements

Après avoir ajouté un contrôle à votre application, que vous l'ayez ajouté visuellement ou que vous l'ayez créé dynamiquement, vous déciderez également comment gérer les actions possibles que l'utilisateur peut effectuer sur le contrôle.

  • Pour les boîtes de dialogue de projet déjà associées à une classe, vous pouvez tirer parti de certains raccourcis lorsque vous créez des gestionnaires d'événements.

  • Vous pouvez créer rapidement un gestionnaire pour l'événement de notification de contrôle par défaut ou pour tout message Windows applicable.

Examinons le même exemple dans lequel nous avons ajouté un gestionnaire d'événements pour la case à cocher.

Step 1 - Cliquez avec le bouton droit sur le contrôle pour lequel vous souhaitez gérer l'événement de notification.

Step 2 - Dans le menu contextuel, cliquez sur Ajouter un gestionnaire d'événements pour afficher l'Assistant Gestionnaire d'événements.

Step 3 - Sélectionnez l'événement dans la zone Type de message à ajouter à la classe sélectionnée dans la zone de liste Classe.

Step 4 - Acceptez le nom par défaut dans la zone Nom du gestionnaire de fonctions ou indiquez le nom de votre choix.

Step 5 - Cliquez sur Ajouter et modifier pour ajouter le gestionnaire d'événements.

Step 6 - Vous pouvez maintenant voir l'événement suivant ajouté à la fin du fichier CMFCControlManagementDlg.cpp.

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

Gestion des contrôles

Jusqu'à présent, nous avons vu comment ajouter des contrôles à une application. Nous allons maintenant voir comment gérer ces contrôles selon les besoins de l'utilisateur. Nous pouvons utiliser la variable / instance de contrôle dans un gestionnaire d'événements particulier.

Step 1- Regardons l'exemple suivant. Ici, nous allons activer / désactiver le contrôle d'édition lorsque la case est cochée / décochée.

Step 2- Nous avons maintenant ajouté le gestionnaire d'événements de clic de case à cocher. Voici la mise en œuvre -

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- Lorsque la boîte de dialogue est créée, nous devons ajouter le code suivant à CMFCControlManagementDlg :: OnInitDialog (). Cela gérera ces contrôles.

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

Step 4 - Voici l'implémentation complète du fichier 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- Lorsque le code ci-dessus est compilé et exécuté, vous verrez la sortie suivante. La case à cocher est décochée par défaut. Cela désactive également le contrôle d'édition.

Step 6- Cochez la case Activer le contrôle. Cela activera automatiquement le contrôle d'édition.