Программирование на Visual C++. Архив рассылки
Шрифт:
Как видим, в классе CCustomDraw<> также предусмотрено две карты сообщений – для родительского окна и для самого контрола, если он получает отражённые уведомления. Обработчик OnCustomDraw распаковывает параметры уведомления NM_CUSTOMDRAW и определяет фазу рисования. Каждой фазе соответствует своя функция, которая и вызывается из OnCustomDraw. Вы можете переопределить любую из этих функций в производном классе и включить в неё нужный вам код (реализации из класса CCustomDraw<> не выполняют никой полезной работы). Список фаз рисования и соответствующих им функций приведён в таблице 10.
Фаза | Прототип функции |
---|---|
CDDS_PREPAINTD | WORD OnPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw) |
CDDS_POSTPAINTD | WORD OnPostPaint(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw) |
CDDS_PREERASAED | WORD OnPreErase(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw) |
CDDS_POSTERASED | WORD OnPostErase(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw) |
CDDS_ITEMPREPAINTD | WORD OnItemPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw) |
CDDS_ITEMPOSTPAINTD | WORD OnItemPostPaint(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw) |
CDDS_ITEMPREERASED | WORD OnItemPreErase(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw) |
CDDS_ITEMPOSTERASE | DWORD OnItemPostErase(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw) |
Вот небольшой пример использования класса CCustomDraw<>. Для разнообразия я поручил обработку сообщения NM_CUSTOMDRAW самому контролу. Подразумевается, что родительское окно переправляет ему уведомления, используя механизм отражения.
Мы изучили уже целую кучу новых классов, и теперь самое время посмотреть, как они применяются на практике. В этом разделе мы изучим целый ряд демонстрационных программ, иллюстрирующих различные аспекты программирования диалогов и контролов с использованием библиотеки WTL.
Демонстрационный проект WTLErrLook
WTLErrLook
Приложение WTLErrLook – это упрощённый вариант программы Error Lookup, которая входит в Visual Studio 6. Главное окно программы выполнено в виде модельного диалога. Обмен данными с полями ввода осуществляется с помощью DDX_TEXT.
Демонстрационный проект WTLSndVol
WTLSndVol
WTLSndVol – это упрощённая версия регулятора громкости (sndvol32.exe), который входит в комплект Windows. При запуске программы она не показывает главное окно (которое выполнено в виде немодального дмалога), а размещает иконку в системном трее (Shell_NotifyIcon). Чтобы она отличалась от иконки стандартного регулятора, я сделал её зелёной. Щелчок по иконке приводит к появлению окна регулятора. Для изменения громкости используется класс CSimpleMixer. Рассматривать его устройство мы не будем, так как это тема для отдельной статьи. Чтобы закрыть WTLSndVol, щёлкните правой кнопкой на иконке в трее и выберите из меню команду Exit.