MFC - Kontrol Yönetimi

MFC uygulamalarında, uygulamanıza görsel olarak bir kontrol ekledikten sonra, kodunuzda buna başvurmak isterseniz, o kontrole dayalı veya onunla ilişkili bir değişken tanımlayabilirsiniz. MFC kitaplığı, bir uygulamada kullanılan bazı kontroller için bir değer veya bir kontrol değişkeni için iki tip değişken tanımlamanıza izin verir.

  • Kontrolde depolanan bilgiler için bir değişken kullanılır ve bu aynı zamanda Control Variable/Instance.

  • Diğer değişken olarak bilinir Control Value Variable. Bir kullanıcı bu değişkenle bu kontrol üzerinde bir takım eylemler gerçekleştirebilir.

Kontrol Değişkeni / Örnek

Bir kontrol değişkeni, kontrolü yöneten sınıfa dayalı bir değişkendir. Örneğin, bir düğme kontrolü CButton sınıfını temel alır.

Bu kavramları gerçek programlamada görmek için, MFC diyalog tabanlı bir proje MFCControlManagement oluşturalım.

Proje oluşturulduktan sonra, tasarımcı penceresinde aşağıdaki iletişim kutusunu göreceksiniz.

Step 1- TODO satırını silin ve aşağıdaki anlık görüntüde gösterildiği gibi bir onay kutusunu ve bir Düzenleme kontrolünü sürükleyin. Onay kutusunun başlığını Kontrolü Etkinleştir olarak değiştirin.

Step 2 - Onay kutusunu sağ tıklayın.

Step 3 - Değişken Ekle'yi seçin.

Step 4 - Artık Üye Değişkeni Ekleme Sihirbazını görebilirsiniz.

Bu iletişim kutusunda farklı seçenekler seçebilirsiniz. Onay kutusu için değişken türü CButton'dur. Bu iletişim kutusunda varsayılan olarak seçilir.

Benzer şekilde, kontrol kimliği de varsayılan olarak seçilmiştir, şimdi Kategori açılır kutusunda Kontrol'ü seçmemiz ve Değişken Adı düzenleme kutusuna m_enableDisableCheck yazıp bitir'e tıklamamız gerekir.

Step 5 - Benzer şekilde, aşağıdaki anlık görüntüde gösterildiği gibi ayarlarla Düzenleme kontrolünün Kontrol Değişkenini ekleyin.

Diyalog sınıfının başlık dosyasını inceleyin. Şimdi yeni değişkenlerin eklendiğini görebilirsiniz.

CButton m_enableDisableCheck;
CEdit m_myEditControl;

Kontrol Değeri Değişkeni

Bir kontrol için tanımlayabileceğiniz başka bir değişken türü, değer değişkenidir. Tüm kontroller bir değer değişkeni sağlamaz.

  • Değer değişkeni, başvurması amaçlanan denetimde saklanan değer türünü işleyebilmelidir.

  • Örneğin, metni işlemek için metin tabanlı bir denetim kullanıldığından, bunun için metin tabanlı bir veri türü bildirebilirsiniz. Bu genellikle bir CString değişkeni olacaktır.

Onay kutusu ve düzenleme kontrolü için bu tür değişkenlere bakalım.

Step 1 - Onay kutusunu sağ tıklayın ve Değişken Ekle'yi seçin.

Step 2- Değişken türü BOOL'dur. Kategori açılır listesinden Değer'i seçin.

Step 3 - Devam etmek için Bitir'i tıklayın.

Step 4 - Benzer şekilde, aşağıdaki anlık görüntüde gösterildiği gibi ayarlarla Düzenleme denetimi için Değişken değeri ekleyin.

Step 5 - Değişken türü alanına CString ve değişken adı alanına m_editControlVal yazın.

Step 6 - Artık bu değişkenlerin Başlık dosyasında eklendiğini görebilirsiniz.

bool m_enableDisableVal;
CString m_editControlVal;

Olay İşleyicilerini denetler

Uygulamanıza bir kontrol ekledikten sonra, onu görsel olarak eklediyseniz veya dinamik olarak oluşturduğunuzda, kullanıcının kontrol üzerinde gerçekleştirebileceği olası eylemleri nasıl işleyeceğinize de karar vereceksiniz.

  • Zaten bir sınıfla ilişkilendirilmiş proje iletişim kutuları için, olay işleyicileri oluştururken bazı kısayollardan yararlanabilirsiniz.

  • Varsayılan kontrol bildirimi olayı veya herhangi bir uygulanabilir Windows mesajı için hızlı bir şekilde bir işleyici oluşturabilirsiniz.

Onay kutusu için olay işleyicisi eklediğimiz aynı örneğe bakalım.

Step 1 - Bildirim olayını işlemek istediğiniz denetime sağ tıklayın.

Step 2 - Kısayol menüsünde, Olay İşleyici Sihirbazını görüntülemek için Olay İşleyici Ekle'yi tıklayın.

Step 3 - Sınıf liste kutusunda seçilen sınıfa eklemek için Mesaj türü kutusundaki etkinliği seçin.

Step 4 - İşlev işleyici adı kutusundaki varsayılan adı kabul edin veya seçtiğiniz adı girin.

Step 5 - Etkinlik işleyiciyi eklemek için Ekle ve düzenle'yi tıklayın.

Step 6 - Artık CMFCControlManagementDlg.cpp dosyasının sonuna aşağıdaki olay eklendiğini görebilirsiniz.

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

Kontrol Yönetimi

Şimdiye kadar, bir uygulamaya nasıl kontrol ekleyeceğimizi gördük. Şimdi bu kontrollerin kullanıcı ihtiyacına göre nasıl yönetileceğini göreceğiz. Kontrol değişkenini / örneğini belirli bir olay işleyicisinde kullanabiliriz.

Step 1- Aşağıdaki örneğe bakalım. Burada, onay kutusu işaretlendiğinde / işareti kaldırıldığında düzenleme kontrolünü etkinleştireceğiz / devre dışı bırakacağız.

Step 2- Şimdi onay kutusu tıklama olay işleyicisini ekledik. İşte uygulama -

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- İletişim kutusu oluşturulduğunda, aşağıdaki kodu CMFCControlManagementDlg :: OnInitDialog () öğesine eklememiz gerekir. Bu, bu kontrolleri yönetecektir.

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

Step 4 - İşte CMFCControlManagementDlg.cpp dosyasının tam uygulaması.

// 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- Yukarıdaki kod derlendiğinde ve çalıştırıldığında, aşağıdaki çıktıyı göreceksiniz. Onay kutusu varsayılan olarak işaretli değildir. Bu, düzenleme kontrolünü de devre dışı bırakır.

Step 6- Kontrolü Etkinleştir onay kutusunu işaretleyin. Bu, düzenleme kontrolünü otomatik olarak etkinleştirecektir.