Взаимодействие классов
Реакция на выбор в окне выпадающего списка
Теперь введем реакцию на выбор пользователем новой строки в окне выпадающего списка. Для этого выполните следующие действия:
- Откройте в окне редактора Studio .NET шаблон окна диалога IDD_PROPDLG.
- Поставьте фокус в окно выпадающего списка IDC_FILLMODE и переведите фокус окно Properties.
- Нажмите кнопку Control Events, расположенную на инструментальной панели окна Properties.
- Найдите строку с идентификатором уведомляющего сообщения CBN_SELCHANGE и в ячейке справа выберите действие <Add>, для того чтобы там появилось имя функции обработки OnSelchangeFillmode.
- Перейдите в окно PropDlg.cpp и введите следующие коды в заготовку функции OnSelchangeFillmode.
LRESULT CPropDlg ::OnSelchangeFillmode(WORD/*wNotifyCode*/, WORD /*wID*/, HWND hWndCtl, BOOL& bHandled) { //====== Цикл пробега по всем объектам типа PropDlg for (UINT i = 0; i < m_nObjects; i++) { CComQIPtr<IOpenGL, &IID_IOpenGL> p(m_ppUnk[i]); // Выясняем индекс строки, выбранной в окне списка DWORD sel = (DWORD)SendMessage(hWndCtl, CB_GETCURSEL,0.0); // Преобразуем индекс в режим отображения полигонов sel = sel==0? GL_POINT : sel==l? GL_LINE: GL_FILL; //====== Устанавливаем режим в классе COpenGL if FAILED (p › SetFillMode(sel)) { ShowError(); return 0; } } bHandled = TRUE; return 0; }
Обратите внимание на то, что нам пришлось убирать два комментария, чтобы сделать видимым параметры hWndCtl и bHandled.
Реакция на нажатия кнопок
При создании отклика на выбор режима изображения полигонов следует учесть попеременное изменение текста и состояния кнопки. Поставьте курсор на кнопку IDC_QUADS и в окне Properties нажмите кнопку Control Events. Затем найдите строку с идентификатором уведомляющего сообщения BN_CLICKED и в ячейке справа выберите действие <Add>. Текст в ячейке должен измениться и стать OnClickedQuads. Введите следующие коды в заготовку функции:
LRESULT CPropDlg::OnClickedQuads(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) { //====== По всем объектам PropDlg for (UINT i = 0; i < m_nObjects; i++) { //====== Добываем интерфейсный указатель CComQIPtr<IOpenGL, &IID_IOpenGL> p(m_ppUnk[i]); //====== Переключаем режим m_bQuad =!m_bQuad; //====== Устанавливаем текст на кнопке SetDlgltemText(IDC_QUADS, m_bQuad? "Quads": "Strip"); if FAILED (p › SetQuad(m_bQuad)) { ShowError(); return 0; bHandled = TRUE; return 0; }
Аналогичные, но более простые действия следует произвести в реакции на нажатие кнопки Выбор файла. Введите функцию для обработки этого события и вставьте в нее следующий код:
LRESULT CPropDlg: rOnCl'ickedFilename (WORD /*wNotif yCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) { for (UINT i = 0; i < m_nObjects; i++) { CComQIPtr<IOpenGL, &IID_IOpenGL> p (m_ppUnk [i]); //====== Вызываем функцию класса COpenGL if FAILED (p › ReadData()) { ShowError (); return 0; } bHandled = TRUE; return 0; }
Постройте сервер и проверьте работу страницы свойств. Попробуйте прочесть другой файл, например тот, который был создан приложением, созданным в рамках MFC. Так как мы не изменяли формат данных, записываемых в файл, то все старые файлы должны читаться.