Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Скрытие/отображение курсора при потере/получении фокуса




При потере фокуса программа получает сообщение 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 для работы с мышью

Метод Назначение
OnLButtonDblClick Вызывается при двойном щелчке левой кнопкой мыши
OnLButtonDown Вызывается при нажатии левой кнопки мыши
OnLButtonUp Вызывается при отпускании левой кнопки мыши
OnMButtonDblClick Вызывается при двойном щелчке средней кнопкой мыши
OnMButtonDown Вызывается при нажатии средней кнопки мыши
OnMButtonUp Вызывается при отпускании средней кнопки мыши
OnMouseActivate Вызывается при нажатии кнопки мыши, когда указатель мыши находится над неактивным окном
OnMouseMove Вызывается при перемещении указателя мыши
OnMouseWheel Вызывается при повороте колеса мыши. Используется в Windows NT 4.0
OnRButtonDblClick Вызывается при двойном щелчке правой кнопкой мыши
OnRButtonDown Вызывается при нажатии правой кнопки мыши
OnRButtonUp Вызывается при отпускании правой кнопки мыши
OnRegisteredMouseWheel Вызывается при повороте колеса мыши. Используется в Windows 95 и Windows NT 3.51
OnSetCursor Вызывается при перемещении указателя мыши в окне/ если мышь не была ранее захвачена приложением

Методу 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 не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...