Управление с помощью объекта класса-оболочки
Обратите внимание на тот факт, что в режиме дизайна вы можете открыть с помощью правой кнопки мыши диалог со страницами свойств для элемента IDC_OPENGL, одну из которых мы создавали в предыдущем проекте. Теперь с помощью Studio .NET введите в диалоговый класс обработчики следующих событий:
- OnClickedFilename – нажата кнопка IDC_FILENAME,
- OnCiickedBkcir – нажата кнопка IDC_BKCLR,
- OnSelchangeFill – изменился выбор в списке IDC_FILL,
- OnClickedQuads – нажата кнопка IDC_QUADS,
- OnHScroll – изменилась позиция ползунка IDC_XPOS,
- OnClickedStrips – нажата кнопка IDC_STRIPS.
Ниже мы приведем тела этих функций, а сейчас отметим, что все они пользуются услугами класса-оболочки для прямого вызова методов СОМ-сервера. Однако, как вы могли заключить из рассмотрения кодов класса COpenGL, на самом деле вызов будет происходить с помощью интерфейса IDispatch, а точнее его метода Invoke. Функция cwnd::invokeHelper, вызов которой вы видите во всех методах COpenGL, преобразует параметры к типу VARIANTARG, а затем вызывает функцию Invoke. Если происходит отказ, то Invoke выбрасывает исключение.
В диалоговом классе мы попутно произвели упрощения, которые связаны с удалением ненужных функций OnPaint и OnQueryDragicon. Эти изменения обсуждались при разработке приложения Look. Во избежание недоразумений, которые могут возникнуть в связи с многочисленным ручным редактированием, приведем коды как декларации, так и реализации класса CTestGLDlg:
//=== Декларация диалогового класса (Файл TestGLDlg.h) #include "opengl.h" #pragma once class CTestGLDlg: public CDialog { public: CTestGLDlg(CWnd* p = NULL); enum { IDD = IDD_TESTGL_DIALOG }; //======= Объект класса-оболочки COpenGL m_CTRL; //======= Запоминаем способ изображения BOOL m_bQuads; //======= Реакции на регуляторы в окне диалога void OnSelchangeFill(void); void OnClickedFilename(void); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); void OnCiickedBkcir(void); void OnClickedQuads(void); void OnClickedStrips(void); protected: virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnlnitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM IParam); DECLARE_MESSAGE_MAP() };
В файл реализации методов класса мы кроме функций обработки сообщений от элементов управления вставили код начальной установки этих элементов. Для этой цели нам опять понадобилась связь с сервером, которую обеспечивает объект m_CTRL класса-оболочки.
Характерным моментом является то, что обрабатываем событие WM_HSCROLL, которое поступает окну диалога, вместо того чтобы обработать уведомляющее событие NM_RELEASEDCAPTURE, которое идет от элемента типа Slider Control. Такая тактика позволяет реагировать на управление ползунком клавишами, а не только мышью.