![]() |
|
Программирование >> Процедурные приложения
pdc->SelectObject(pOldPen); pdc->SelectObject(pOldBrush); Действие функции Rectangle() приводит к тому, что элемент управления принимает вид прямоугольника, закрашенного в желтый цвет. Реакция на события мыши В данном параграфе будет показано, как заставить элемент управления TDCtrlреагировать на действия, осуществляемые с помощью мыши. Мы сделаем так, что элемент управления после щелчка на нем указателем мыши изменит свой цвет на светло-серый и в нем отобразятся системное время и дата. Ниже перечислены действия, которые необходимо выполнить для осуществления намеченного плана. 1. В диалоговом окне MFC lassWizard перейдите на вкладку Automation. 2. В списке Classname выберите класс CTDCtrlctrl. 3. С помощью кнопки AddProperty откройте диалоговое окно AddProperty. 4. В поле External names введитеHitTDCtrl. 5. В группе опций Implementation выберите переключатель Member variable. 6. В списке Туре выделите тип данных olecolor и очистите поле Notification function. 7. Щелкните на кнопке ОК, чтобы принять сделанные установки и вернуться к диалоговому окну MFC ClassWizard(рис. 22.11). 8. Перейдите на вкладку MessageMaps. 9. В списке Classname выберите класс CTDCtrlctrl. 10. В списке Messages выберите сообщение wm lbuttondown. 11. Щелкните на кнопке AddFunction. 12. Повторите действия, указанные в пунктах 10 и 11, по отношению к сообщению wm lbuttonup. Теперь ваше диалоговое окно должно выглядеть так, как показано на рис. 22.12. ![]() Рис. 22.11. Свойство HitTDCtrl позволит элементу управления реагировать на события мыши ![]() Рис. 22.12. Добавление обработчиков событий мыши 13. Щелкните на кнопке ОК, и мастер ClassWizard внесет изменения в код элемента управления. Мастер классов автоматически добавит в файл TDCTRLCTL.Hобъявление переменной m hitTDCtrl, а в файл TDCTRLCTL.CPP- стандартные реализации обработчиков OnLButtonDown() и OnLButtonUp(). Теперь нужно самостоятельно добавить код, определяющий реакцию элемента управления на соответствующие события. Файл TDCTRLCTL.H В данный файл заголовков, сразу после объявления деструктора, следует поместить прототип новой функции HitTDCtrl(), предназначенной для изменения цвета элемента управления в ответ на щелчок мышью. Реализация protected: -CTDCtrlCtrl() ; void HitTDCtrl(CDC* pdc); изменение цвета Далее нужно написать код этой функции. Возвращаемся к файлу TDCTRLCTL.CPP При щелчке левой кнопкой мыши на элементе управления должен измениться цвет его прямоугольной области. Частично это событие обрабатывается функцией DoPropExchange(). Ниже показана исправленная версия данной функции в ЛОбав-ленной строкой, которая выделена полужирным шрифтом: / CTDCtrlCtrl::DoPropExchange- Поддержка постоянства элемента void CTDCtrlCtrl::DoPropExchange(CPropExchange* pPX) { ExchangeVersion(pPX, MAKELONG( wVerMinor, wVerMajor)); COleControl::DoPropExchange(pPX); TODO: Поместите здесь вызовы РХ -функций для каждого постоянного пользовательского свойства. ; Цвет элемента управления меняется на светло-серый PX Color(pPX, T( HitTDCtrl ), m hitTDCtrl, RGB(200, 200, 200)); } Эта функция отвечает за инициализацию переменной m hitTDCtrl, которой присваивается значение, соответствующее светло-серому цвету. Функция рх со1ог () осуществляет обмен данными между переменной m hitTDCtrl и свойством HitTDCtrl. Мастер классов создал стандартные реализации функций OnLButtonDown() и OnLButtonUp() .Ниже показано, какие изменения вносятся в эти функции. Функция OnLButtonDown() получает контекст устройства для рисования и вызывает функцию HitTDCtrl(), осуществляющую вывод текущих значений времени и даты. После отпускания левой кнопки мыши функция OnLButtonUp() вызывает функцию InvalidateControl(), что является сигналом системе послать элементу управления сообщение wm paint. void CTDCtrlCtrl::OnLButtonDown(DINT nFlags, CPoint point) { TODO: Здесь добавьте собственный код обработчика CDC* pdc; Отображение даты к времени pdc = GetDC() ; HitTDCtrl(pdc); ReleaseDC(pdc); COleControl::OnLButtonDown(nFlags, point); } void CTDCtrlCtrl::OnLButtonUp(OINT nFlags, CPoint point) TODO: Здесь добавьте собственный код обработчика InvalidateControl(); COleControl::OnLButtonUp(nFlags, point); } Ниже показан код функции HitTDCtrl(), который следует добавить в конец файла TDCTRLCTL.CPP: void CTDCtrlCtrl::HitTDCtrl(CDC* pdc) CBrush* pOldBrush; CBrush hitBrush (TranslateColor(m hitTDCtrl)); CRect re; TEXTMETRIC tm; struct tm *date time; time t timer; Устанавливается прозрачный фон pdc->SetBkMode(TRANSPARENT); GetClientRect(re); pQldBrush = pdc->SelectObject(ShitBrush); Рисование прямоугольника с заливкой pdc->Rectangle(re); Получение даты и времени time(Stimer); date tirae = localtime(stimer); const CStringS strtime = asctime(date time); Получение информации о шрифте и вывод надписи pdc->GetTextMetrics (J.tm); pdc->SetTextAlign(TA CENTER TA TOP); pdc->ExtTextOut((re.left + re.right) /2, (re.top + re.bottom - tm.tmHeight) /2, ETO CLIPPED, re, strtime, strtime.GetLengthO - I, NULL); pdc->SelectObject(pOldBrush); Цвет кисти определяется на основании переменной m hitTDCtrl, которая была модифицирована в функции DoPropExchange(). Заливке подвергается вся область элемента
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |