ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Модификация обработчиков сообщений в ходе работы над проектомРассмотрим простой пример, в котором был создан каркас AppWizard-а (exe) и ресурс в виде окна диалога:
Для работы с окном с помощью ClassWizard (который вызывается из меню View/ClassWizard) были внесены следующие изменения. Так, по нажатию на кнопке «Результат» должно выводиться окно с результатом сложения, по нажатию на кнопке «Сброс» - в текстовых окнах отображаются 0, по нажатию на кнопке «Завершить» - окно закрывается и приложение завершает работу. Для работы используется вкладка Message Maps (Карта сообщений), в окне ClassWizard-а на этой вкладке 3 текстовых области:
V – отмечены виртуальные функции W – отмечены обработчики событий
Кнопки диалогового окна ClassWizard: AddClass,…, AddFunction, DeleteFunction, EditCOde – позволяют соответственно добавить новый класс, добавить лили удалить определение виртуальной функции в выбранном классе. Вкладка “Member Variables” позволяет назначить для органов управления (кнопок, текстовых полей), располагающихся в окне, выбрав их идентификаторы на текстовой области Control IDs, переменные, куда будет передаваться информация от органов управление или откуда они её будут получать. Определение диалогового класса в нашем проекте выглядит следующим образом
// CEasyDialogDlg dialog class CEasyDialogDlg: public CDialog { // Construction public: CEasyDialogDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data enum { IDD = IDD_EASYDIALOG_DIALOG };
//{{AFX_VIRTUAL(CEasyDialogDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_ VIRTUAL
// Implementation protected: HICON m_hIcon;
// Generated message map functions DECLARE_MESSAGE_MAP() public: //{{AFX_DATA(CEasyDialogDlg) CString m_first; CString m_second; //}}AFX_DATA
//{{AFX_MSG(CEasyDialogDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnOk(); afx_msg void OnCancel(); afx_msg void OnButton2(); //}}AFX_MSG
private: char strArr[30]; double m_acdValue; double m_fstValue; };
Здесь //{{AFX_VIRTUAL(CEasyDialogDlg) //{{AFX_MSG(CEasyDialogDlg) //{{AFX_DATA(CEasyDialogDlg) - комментарии визардов
Дальше вносим изменения в функции обработчика OnInitDialog(), OnCancel(), OnButton2().
OnInitDialog всегда автоматически определяется для диалогового окни и получает управление в результате посылки сообщения от окна, раскрывающегося на экране. 2-й и 3-й обработчики, из перечисленных выше, получают управление при щелчках на кнопках с идентификаторами IDCANCEL и IDC_BUTTON2 (имеется сходство имеён функций и идентификаторов, назначеных для соответствующих окон). 1-й обработчик можно дополнить кодом для инициализации какого-либо из своих объектов, если необходимо. В примере – обнуляем переменные. 2-й обработчик надо дополнить кодом, обнуляющим переменные и пересыпающим 0-е значение в тексте окна. 3-й обработчик – дополнить кодом для вычисления суммы и отображения в окне результата. Мы также дополнили конструктор класса. Определение функций размещается в файле EasyDialogDlg.cpp. Приведём весь текст:
CEasyDialogDlg::CEasyDialogDlg(CWnd* pParent /*=NULL*/) : CDialog(CEasyDialogDlg::IDD, pParent) , m_first(_T("0.0")) , m_second(_T("0.0")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_fstValue = 0.0; m_scdValue = 0.0; }
void CEasyDialogDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_first); DDV_MaxChars(pDX,m_first,12); DDX_Text(pDX, IDC_EDIT2, m_second); DDV_MaxChars(pDX,m_second,12);
BEGIN_MESSAGE_MAP(CEasyDialogDlg, CDialog) ON_WM_SYSCOMMAND() .... END_MESSAGE_MAP()
// CEasyDialogDlg message handlers
BOOL CEasyDialogDlg::OnInitDialog() {
... // TODO: Add extra initialization here SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon m_fstValue = 0.0; m_scdValue = 0.0; UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control }
void CEasyDialogDlg::OnCancel() { m_first=_T("0.0"); m_second=_T("0.0"); m_fstValue = 0.0; m_scdValue = 0.0; UpdateData(FALSE); }
void CEasyDialogDlg::OnButton2() { UpdateData(TRUE); sscanf((LPCTSTR)m_first,"%lf",&m_fstValue); sscanf((LPCTSTR)m_second,"%lf",&m_scdValue); sprintf(strArr,"%lf",m_scdValue+m_fstValue); AfxMessageBox(strArr);
}
_T() – выполняет преобразование из типа char* в CString, обратное преобразование пришлось сделать с помошью префикс ной операции (LPCTSTR). AfxMessageBox() – глобальная функция, выводящая окно сообщения, указанного параметром (содержится в определении глобальных функций MFC). Вопросы для самоконтроля · Перечислите типы проектов, которые могут создаваться визардами проектов в Dev Studio? · Что выполняют визард класса и редактор ресурсов? · Для чего применяются Class wizard и Wizard Bar? · Как выполняется модификация обработчиков сообщений в ходе работы над проектом? · Как добавить новые свои переменные и методы в проектируемый класс? · В результате каких действий формируются DDV- и DDX-функции? Вопросы для самостоятельного изучения · Как выглядят параметры функции AfxMessageBox()? – какие типы окон можно отображать с помощью этой функции? · Выяснить последовательность действий при выполнении вызовов UpdateData(False), UpdateData(True), а также назначение метода DoDataExchange() и класса CDataExchange!
Не нашли, что искали? Воспользуйтесь поиском:
|