एमएफसी - नियंत्रण प्रबंधन

एमएफसी अनुप्रयोगों में, अपने आवेदन में एक नियंत्रण जोड़ने के बाद, यदि आप इसे अपने कोड में संदर्भित करना चाहते हैं, तो आप इसके आधार पर एक चर की घोषणा कर सकते हैं, या उस नियंत्रण से संबद्ध कर सकते हैं। MFC लाइब्रेरी आपको किसी एप्लिकेशन में उपयोग किए गए कुछ नियंत्रणों के लिए दो प्रकार के चर घोषित करने की अनुमति देता है एक मूल्य या एक नियंत्रण चर।

  • एक चर का उपयोग नियंत्रण में संग्रहीत जानकारी के लिए किया जाता है, जिसे इस रूप में भी जाना जाता है Control Variable/Instance

  • अन्य चर के रूप में जाना जाता है Control Value Variable। एक उपयोगकर्ता इस चर के साथ उस नियंत्रण पर कुछ प्रकार की क्रियाएं कर सकता है।

नियंत्रण चर / आवृत्ति

एक नियंत्रण चर वर्ग पर आधारित एक चर है जो नियंत्रण का प्रबंधन करता है। उदाहरण के लिए, एक बटन नियंत्रण CButton वर्ग पर आधारित है।

इन अवधारणाओं को वास्तविक प्रोग्रामिंग में देखने के लिए, हमें एक एमएफसी संवाद आधारित परियोजना MFCControlManagement बनाएं।

एक बार प्रोजेक्ट बन जाने के बाद, आपको डिज़ाइनर विंडो में निम्नलिखित डायलॉग बॉक्स दिखाई देगा।

Step 1- TODO लाइन हटाएं और एक चेकबॉक्स और एक एडिट कंट्रोल को नीचे दिए गए स्नैपशॉट में दिखाए अनुसार खींचें। नियंत्रण सक्षम करने के लिए चेकबॉक्स के कैप्शन को बदलें।

Step 2 - चेकबॉक्स पर राइट क्लिक करें।

Step 3 - Add Variable चुनें।

Step 4 - अब आप सदस्य जोड़ें परिवर्तनीय विज़ार्ड देख सकते हैं।

आप इस डायलॉग बॉक्स पर विभिन्न विकल्पों का चयन कर सकते हैं। चेकबॉक्स के लिए, चर प्रकार CButton है। यह इस संवाद बॉक्स में डिफ़ॉल्ट रूप से चयनित है।

इसी प्रकार, नियंत्रण आईडी भी डिफ़ॉल्ट रूप से चयनित है अब हमें श्रेणी कॉम्बो बॉक्स में नियंत्रण का चयन करने की आवश्यकता है, और चर नाम संपादित करें बॉक्स में m_enableDisableCheck टाइप करें और फिनिश पर क्लिक करें।

Step 5 - इसी तरह, सेटिंग्स के साथ एडिट कंट्रोल का कंट्रोल वेरिएबल जोड़ें जैसा कि निम्नलिखित स्नैपशॉट में दिखाया गया है।

संवाद वर्ग की हेडर फ़ाइल का निरीक्षण करें। आप देख सकते हैं कि नए वेरिएबल को अब जोड़ दिया गया है।

CButton m_enableDisableCheck;
CEdit m_myEditControl;

नियंत्रण मूल्य चर

एक अन्य प्रकार का चर जिसे आप नियंत्रण के लिए घोषित कर सकते हैं वह है मूल्य चर। सभी नियंत्रण एक मान चर प्रदान नहीं करते हैं।

  • मान चर को उस नियंत्रण में संग्रहीत मान के प्रकार को संभालने में सक्षम होना चाहिए जिसे इसे संदर्भित करना है।

  • उदाहरण के लिए, क्योंकि पाठ को संभालने के लिए एक पाठ आधारित नियंत्रण का उपयोग किया जाता है, आप इसके लिए एक पाठ-आधारित डेटा प्रकार की घोषणा कर सकते हैं। यह आमतौर पर एक CString चर होगा।

आइए हम चेकबॉक्स और संपादन नियंत्रण के लिए इस प्रकार के चर को देखें।

Step 1 - चेकबॉक्स पर राइट क्लिक करें और Add Variable चुनें।

Step 2- चर प्रकार BOOL है। श्रेणी ड्रॉपडाउन सूची से मान का चयन करें।

Step 3 - जारी रखने के लिए समाप्त क्लिक करें।

Step 4 - इसी तरह, निम्न स्नैपशॉट में दिखाए अनुसार सेटिंग्स के साथ संपादन नियंत्रण के लिए वैरिएबल जोड़ें।

Step 5 - चर प्रकार में CString टाइप करें और चर नाम फ़ील्ड में m_editControlVal।

Step 6 - अब आप हैडर फ़ाइल में जोड़े गए इन चरों को देख सकते हैं।

bool m_enableDisableVal;
CString m_editControlVal;

इवेंट हैंडलर्स को नियंत्रित करता है

अपने एप्लिकेशन में एक नियंत्रण जोड़ने के बाद, चाहे आपने इसे नेत्रहीन रूप से जोड़ा या इसे गतिशील रूप से बनाया, आप यह भी तय करेंगे कि उपयोगकर्ता संभावित नियंत्रणों को कैसे नियंत्रित कर सकता है।

  • प्रोजेक्ट संवाद बॉक्स के लिए जो पहले से ही एक वर्ग से जुड़े हैं, आप इवेंट हैंडलर बनाते समय कुछ शॉर्टकट का लाभ उठा सकते हैं।

  • आप डिफ़ॉल्ट नियंत्रण अधिसूचना घटना के लिए या किसी भी लागू विंडोज संदेश के लिए जल्दी से एक हैंडलर बना सकते हैं।

आइए हम उसी उदाहरण पर ध्यान दें जिसमें हमने चेकबॉक्स के लिए ईवेंट हैंडलर जोड़ा है।

Step 1 - उस कंट्रोल को राइट-क्लिक करें जिसके लिए आप नोटिफिकेशन इवेंट को हैंडल करना चाहते हैं।

Step 2 - शॉर्टकट मेनू पर, ईवेंट हैंडलर विज़ार्ड प्रदर्शित करने के लिए इवेंट हैंडलर जोड़ें पर क्लिक करें।

Step 3 - क्लास सूची बॉक्स में चयनित वर्ग में जोड़ने के लिए संदेश प्रकार बॉक्स में घटना का चयन करें।

Step 4 - फ़ंक्शन हैंडलर नाम बॉक्स में डिफ़ॉल्ट नाम को स्वीकार करें, या अपनी पसंद का नाम प्रदान करें।

Step 5 - ईवेंट हैंडलर जोड़ने के लिए जोड़ें और संपादित करें पर क्लिक करें।

Step 6 - अब आप CMFCControlManagementDlg.cpp फ़ाइल के अंत में जोड़े गए निम्न ईवेंट को देख सकते हैं।

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

नियंत्रण प्रबंधन

अब तक, हमने देखा है कि किसी एप्लिकेशन पर नियंत्रण कैसे जोड़ें। अब हम देखेंगे कि उपयोगकर्ता की आवश्यकता के अनुसार इन नियंत्रणों को कैसे प्रबंधित किया जाए। हम एक विशेष घटना हैंडलर में नियंत्रण चर / उदाहरण का उपयोग कर सकते हैं।

Step 1- आइए हम निम्नलिखित उदाहरण देखें। जब चेकबॉक्स चेक / अनचेक किया जाता है, तो हम संपादन नियंत्रण को सक्षम / अक्षम कर देंगे।

Step 2- हमने अब चेकबॉक्स क्लिक ईवेंट हैंडलर जोड़ा है। यहाँ कार्यान्वयन है -

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- जब संवाद बनाया जाता है, तो हमें निम्नलिखित कोड को CMFCControlManagementDlg :: OnInitDialog () में जोड़ना होगा। यह इन नियंत्रणों का प्रबंधन करेगा।

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

Step 4 - यहां 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- जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो आपको निम्न आउटपुट दिखाई देगा। डिफ़ॉल्ट रूप से चेकबॉक्स अनियंत्रित है। यह संपादन नियंत्रण को भी अक्षम करता है।

Step 6- नियंत्रण नियंत्रण सक्षम करें चेकबॉक्स की जांच करें। यह स्वचालित रूप से संपादन नियंत्रण को सक्षम करेगा।