Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Скрытие/отображение курсора при потере/получении фокуса
При потере фокуса программа получает сообщение WM_KILLFOCUS, а при получении — WM_SETFOCUS. Воспользуйтесь ClassWizard и свяжите с сообщением WM_KILLFOCUS новый обработчик. ClassWizard присваивает ему имя OnKillFocus(): void CCaretsView::OnKillFocus(CWnd* pNewWnd) { CView::OnKillFocus(pNewWnd); // TODO: добавьте код обработки сообщения } Данный метод обрабатывает сообщение о потере фокуса, поэтому курсор необходимо скрыть: void CCaretsView::OnKillFocus(CWnd* pNewWnd) { CView::OnKillFocus(pNewWnd); HideCaret(); // TODO: добавьте код обработки сообщения } По аналогии добавьте метод OnSetFocus()для обработки сообщения WM_SETFOCUS и включите в него код для отображения курсора при получении фокуса: void CCaretsView::OnSetFocus(CWnd* pOldWnd) { CView::OnSetFocus(pOldWnd); ShowCaret(); // TODO: добавьте код обработки сообщения } Программа готова. Теперь при получении фокуса курсор появляется, а при потере — исчезает. Мы научились работать с курсором. Пора заняться мышью и организовать вывод текста в том месте клиентской области, которое пользователь выберет щелчком мыши. Работа с мышью В следующем примере пользователь сможет щелкнуть мышью в любом месте клиентской области, после чего курсор переместится в указанную точку. Затем можно ввести текст, и он будет выводиться в выбранной точке. Если пользователь щелкнет в другой точке клиентской области, мы стираем содержимое строки и вводим символы заново, отображая их в новом месте. Давайте посмотрим, как это делается. Использование методов ClassWizard для работы с мышью Создайте проект SDI-программы с именем mouser. Наделите ее теми же функциями работы с клавиатурой, что и предыдущую программу carets; иначе говоря, вводимые пользователем символы должны сохраняться в объекте документа StringData. Кроме того, добавьте методы OnKillFocus() иOnSetFocus()и включите в них вызовы HideCaret()и ShowCaret (), как это было сделано в предыдущей программе (можно скопировать необходимые фрагменты кода). Перейдем к отображению данных, вводимых пользователем. Если пользователь щелкнул мышью в некоторой точке клиентской области, он хочет, чтобы текст выводился в указанном им месте. Мы должны воспользоваться ClassWizard и добавить метод для обработки сообщения Windows WM_LBUTTONDOWN; ClassWizard присваивает ему имя OnLButtonDown(). Запустите ClassWizard. Проследите, чтобы в списке Class name был выбран класс вида CMouserView, и найдите в списке Messagesсообщение WM_LBUTTONDOWN. Дважды щелкните на его имени; при этом создается и выводится в списке Member functions метод OnLButtonDown( ). Дважды щелкните на строке с его именем OnLButtonDown(), чтобы перейти к коду: void CMouserView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: добавьте код обработки сообщения // и/или вызовите обработчик по умолчанию Cview::OnLButtonDown(nFlags, point); } Помимо метода OnLButtonDown(), можно использовать и другие методы для работы с мышью — OnLButtonUp(), отвечающий за обработку отпускания левой кнопки мыши, OnRButtonDown(), соответствующий нажатию правой кнопки мыши, OnRButtonDblClick(), обрабатывающий двойной щелчок левой кнопкой, и т. д. Методы для работы с мышью перечислены в табл. 4.1. Таблица 4.1. Методы Class Wizard для работы с мышью
Методу OnLButtonDown() передаются два параметра, nFlagsи point. Первый содержит информацию о состоянии различных служебных клавиш и может принимать следующие значения: MK_CONTROL Нажата клавиша Ctrl MK_LBUTTON Нажата левая кнопка мыши MK_MBUTTON Нажата средняя кнопка мыши MK_RBUTTON Нажата правая кнопка мыши MK_SHIFT Нажата клавиша Shift Параметр point, объект класса CPoint, содержит текущие координаты указателя мыши. Итак, кнопка мыши нажата. Первым делом необходимо сохранить текущее положение указателя. Мы воспользуемся переменными х и у и присвоим им значения, полученные из переменных х и у объекта point: void CMouserView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: добавьте код обработки сообщения // и/или вызовите обработчик по умолчанию х = point.х; у = point.у; } Переменные для хранения координат объявляются в заголовочном файлевида mouserView.h: // mouserView.h: интерфейс класса CMouserView protected: // создание только при сериализации CMouserVlew(); DECLARE_DYNCREATE(CMouserView) CPoint CaretPoiitlon; boolean CaretCreated: int x, y; Щелчок мышью означает, что текст будет выводиться в новом положении, — для очистки строкового объекта мы воспользуемся методом Empty()класса CString: void CMouserView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: добавьте код обработки сообщения // и/или вызовите обработчик по,умолчанию х = point.х; у = point.у; CMouserDoc* pDoc=GetDocument(); ASSERT_VALID(pDoc); pDoc->StringData.Empty(); } Остается лишь объявить текущее состояние вида недействительным, чтобы перерисовать его и отобразить курсор в новом месте (соответствующий код был добавлен в метод OnDraw()): void CMouserView::OnLButtonDown(UINT nFlags. CPoint point) { // TODO: добавьте код обработки сообщения // и/или вызовите обработчик по умолчанию х = point.х; у = point.у; CMouserDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->StringData.Empty(); Invalidate(); CView::OnLButtonDown(nFlags, point); } Координаты указателя мыши сохранены. Следующий шаг — вывод текста в месте, выбранном пользователем. |
||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2018-04-12; просмотров: 490. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |