Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Таблица 6.2. Макросы карты сообщений и имена обработчиков для сообщений мыши, связанных с клиентской областью окна.

Сообщение

Макрос карты сообщений

Имя функции-обработчика

WM_xBUTTONDOWN

ON_WM_xBUTTONDOWN

OnxButtonDown

WM_xBUTTONUP

ON_WM_xBUTTONUP

OnxButtonUp

WM_xBUTTONDBLCLK

ON_WM_xBUTTONDBLCLK

OnxButtonDblClk

WM_MOUSEMOVE

ON_WM_MOUSEMOVE

OnMouseMove

Прототипы у всех обработчиков сообщений мыши, например, OnLButtonDown, одинаковы и имеют следующий вид:

afx_msg void OnMsgName( UINT nFlags, CPoint point )

point содержит координаты указателя в момент возникновения события мыши. Эти координаты задаются в физической системе координат, связанной с левым верхним углом клиентской области окна. При необходимости их можно преобразовать в логические координаты контекста устройства с помощью функции CDC::DPtoLP.

Параметр nFlags содержит состояние кнопок мыши и клавиш клавиатуры Shift и Ctrl в момент генерации сообщения. Состояние конкретной кнопки или клавиши можно извлечь из параметра nFlags с помощью операции побитового ИЛИ и масок, перечисленных в табл. 6.3.

Таблица 6.3. Возможные флаги, составляющие значение параметра nFlags

Битовый флаг

Когда флаг установлен

MK_LBUTTON

Нажата левая кнопка мыши

MK_MBUTTON

Нажата средняя кнопка мыши

MK_RBUTTON

Нажата правая кнопка мыши

MK_CONTROL

Нажата клавиша Ctrl

MK_SHIFT

Нажата клавиша Shift

Сообщения мыши, связанные с неклиентской областью, аналогичны описанным выше, только в именах констант добавляются символы NC (от слова nonclient). Например, вместо WM_LBUTTONDOWN – WM_NCLBUTTONDOWN. Но эти сообщения обрабатываются в приложениях значительно реже.

НЕ нашли? Не то? Что вы ищете?

1.2 Режим захвата мыши

Выше была упомянута проблема, возникающая, когда программе требуется обрабатывать сообщения и о нажатии. и об отпускании кнопки мыши (например, при рисовании или при выделении с помощью "резинового контура"). Если пользователь отпустил кнопку мыши, когда указатель находится за пределами окна, то окно не получит сообщение об отпускании кнопки. Тогда, например, рисование не закончится вовремя или "резиновый контур" окажется в неопределенном состоянии.

Для решения данной проблемы в Windows предусмотрен режим "захвата" мыши. Приложение (точнее, окно приложения) может захватить мышь при получении сообщения о нажатии кнопки. Это окно будет получать все сообщения мыши, независимо от того, где находится указатель. При получении сообщения об отпускании кнопки приложение может "освободить" мышь.

Захват мыши выполняется функцией CWnd::SetCapture, а освобождение – функцией API ::ReleaseCapture. Обычно вызовы этих функций располагаются в обработчиках нажатия и отпускания кнопки мыши, например:

// Фрагмент карты сообщений CMainWindow

ON_WM_LBUTTONDOWN()

ON_WM_LBUTTONUP()

void CMainWindow::OnLButtonDown( UINT nFlags, CPoint point )

{

SetCapture();

}

void CMainWindow::OnLButtonUp( UINT nFlags, CPoint point )

{

::ReleaseCapture();

}

Между этими сообщениями, CMainWindow будет получать сообщения WM_MOUSEMOVE, даже если указатель выйдет за пределы окна. В таком случае координаты указателя мыши могут стать отрицательными или превышать размеры клиентской области окна.

У класса CWnd есть функция CWnd::GetCapture, возвращающая указатель на окно, захватившее мышь (как на объект CWnd). В Win32 GetCapture возвращает NULL, если мышь не захвачена или захвачена окном другого потока. Наиболее часто GetCapture применяется для определения, захватило ли текущее окно мышь, следующим образом:

if ( GetCapture() == this )

1.3 Изменение формы указателя мыши

Изменить форму указателя мыши при прохождении над клиентской областью окна можно с помощью обработчика сообщения WM_SETCURSOR, посылаемого окну в качестве запроса для настройки формы указателя. В этом обработчике можно вызвать функцию::SetCursor с дескриптором указателя в качестве параметра. Допустим, дескриптор указателя мыши хранится в переменной-члене CMainWindow::m_hCursor. Тогда включить этот указатель над клиентской областью CMainWindow можно так:

// Фрагмент карты сообщений CMainWindow

ON_WM_SETCURSOR()

BOOL CMainWindow::OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message)

{

if ( nHitTest == HTCLIENT )

{

::SetCursor( m_hCursor );

return TRUE;

}

return CFrameWnd::OnSetCursor( pWnd, nHitTest, message );

}

Дескриптор указателя мыши генерируется либо при загрузке стандартного указателя, либо указателя, нарисованного в редакторе пиктограмм Developer Studio. Загрузка стандартных указателей (у них есть предопределенные числовые идентификаторы, например IDC_ARROW или IDC_CROSS) выполняется функцией CWinApp::LoadStandardCursor, которой передается один из идентификаторов стандартных указателей. При вызове:

AfxGetApp()->LoadStandardCursor( IDC_ARROW );

будет возвращен дескриптор указателя-стрелки, наиболее часто используемого в Windows. Полный список стандартных указателей можно получить в справке по функции CWinApp::LoadStandardCursor. Функции CWinApp::LoadCursor можно передать идентификатор указателя, который вы самостоятельно разработали в редакторе пиктограмм Developer Studio.

В приложениях принято во время выполнения длительных действий показывать указатель в виде песочных часов, обозначающий, что приложение "занято". Для песочных часов есть стандартный указатель с идентификатором IDC_WAIT. Такой указатель можно создать даже проще, чем функцией LoadStandardCursor – с помощью специального класса MFC CWaitCursor. Можно создать объект этого класса в стеке, например:

CWaitCursor wait;

В конструкторе CWaitCursor указатель в форме песочных часов выводится на экран, а в деструкторе восстанавливается предыдущий указатель. Если вы хотите восстановить форму указателя еще до выхода из области видимости объекта CWaitCursor, то можно просто вызвать функцию-член CWaitCursor::Restore. Например, это надо делать перед выводом диалогового или информационного окна.

2. Получение данных с клавиатуры

Приложения Windows узнают о клавиатурных событиях так же, как и о событиях мыши: посредством сообщений. Как и мышь, клавиатура является ресурсом, который с помощью операционной системы разделяется между несколькими приложениями. Сообщения мыши посылаются окну, над которым находится указатель. Сообщения клавиатуры посылаются окну, находящемуся в "фокусе ввода". Такое окно может быть только одно.

При каждом нажатии или отпускании клавиши приложение в "фокусе ввода" получает сообщение. Если требуется знать, когда нажата или отпущена конкретная клавиша, например, PgUp, программа может выполнять обработку сообщений WM_KEYDOWN/WM_KEYUP с проверкой кода клавиши, сопровождающего это сообщение. Если же программе требуются не коды клавиш, а символы, то она должна игнорировать сообщения о нажатии/отпускании клавиш, а обрабатывать сообщения WM_CHAR, в которых передаются печатаемые символы. Они уже сформированы с учетом раскладки клавиатуры, текущего языка и состояния клавиш Shift и Caps Lock.

Текстовый курсор в Windows называется caret.. Обычно курсор выглядит как вертикальная мерцающая черточка. Приложения, которые пользуются им, должны включать курсор при получении фокуса (сообщение WM_SETFOCUS) и выключать при потере (WM_KILLFOCUS). В классе CWnd есть набор функций для работы с текстовым курсором, например, ShowCaret (включение курсора), HideCaret (выключение курсора) и SetCaretPos (задание позиции курсора). Эти функции используются довольно редко, поэтому подробно не рассматриваются.

2.1 Сообщения о нажатии клавиш

Windows информирует окно, находящееся в фокусе ввода, о нажатии и отпускании клавиш сообщениями WM_KEYDOWN и WM_KEYUP. Эти сообщения генерируются всеми клавишами, кроме Alt и F10 – "системных" клавиш, выполняющих в Windows служебные действия. Эти клавиши генерируют сообщения WM_SYSKEYDOWN и WM_SYSKEYUP. При нажатой клавише Alt любые другие клавиши тоже генерируют сообщения WM_SYSKEYDOWN и WM_SYSKEYUP (вместо WM_KEYDOWN/WM_KEYUP).

Обработчики клавиатурных сообщений в MFC называются OnKeyDown, OnKeyUp, OnSysKeyDown и OnSysKeyUp (им соответствуют макросы карты сообщений ON_WM_KEYDOWN, ON_WM_KEYUP, ON_WM_SYSKEYDOWN и ON_WM_SYSKEYUP). Этим обработчикам передается вспомогательная информация, в том числе код клавиши. Все клавиатурные обработчики имеют одинаковый прототип:

afx_msg void OnMsgName( UINT nChar, UINT nRepCnt, UINT nFlags )

nChar – это код виртуальной клавиши, которая была нажата или отпущена, nRepCnt – количество повторений нажатия/отпускания (обычно равно 1 для WM_KEYDOWN и всегда равно 1 для WM_KEYUP). Большинство программ nRepCnt игнорируют. Значение nFlags содержит аппаратный скан-код клавиши и, возможно некоторые битовые флаги, например, признак нажатой клавиши Alt.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32