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

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

Коды виртуальных клавиш позволяют идентифицировать клавиши независимо от кодов, посылаемых клавиатурой конкретной модели. Для буквенных клавиш эти коды совпадают с кодами символов ASCII, например, от 0x41 до 0x5A для английских заглавных букв от A до Z.

Остальные коды виртуальных клавиш определены как константы в файле Winuser. h. Имена констант начинаются с VK_ (см. табл. 6.4).

Таблица 6.4. Некоторые коды виртуальных клавиш

Код виртуальной клавиши

Соответствующая клавиша

Код виртуальной клавиши

Соответствующая клавиша

VK_F1 - VK_F12

Функциональные клавиши F1 - F12

VK_NEXT

PgDn

VK_CANCEL

Ctrl-Break

VK_END

End

VK_RETURN

Enter

VK_HOME

Home

VK_BACK

Backspace

VK_LEFT

стрелка влево

VK_TAB

Tab

VK_UP

стрелка вверх

VK_SHIFT

Shift

VK_RIGHT

стрелка вправо

VK_CONTROL

Ctrl

VK_DOWN

стрелка вниз

VK_MENU

Alt

VK_INSERT

Ins

VK_PAUSE

Pause

VK_DELETE

Del

VK_ESCAPE

Esc

VK_CAPITAL

Caps Lock

VK_SPACE

Spacebar

VK_NUMLOCK

Num Lock

VK_PRIOR

PgUp

VK_SCROLL

Scroll Lock

2.2 Состояние клавиш

Внутри обработчиков клавиатурных сообщений иногда бывает нужно узнать состояние клавиш Shift, Ctrl или Alt. Это можно сделать с помощью функции ::GetKeyState. которой передается код виртуальной клавиши,. Например, чтобы узнать, нажата ли клавиша Shift, надо вызвать функцию:

::GetKeyState( VK_SHIFT )

Она вернет отрицательное значение, если Shift нажата, и неотрицательное – если не нажата (признак нажатия обозначается старшим битом возвращаемого числа). Чтобы выполнить некоторые действия по комбинации клавиш Ctrl+стрелка влево, можно в обработчике OnKeyDown выполнить проверку:

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

if ( (nChar == VK_LEFT) && (::GetKeyState(VK_CONTROL) < 0) )

{

}

Функция ::GetKeyState возвращает состояние клавиши или кнопки мыши на момент генерации клавиатурного сообщения. Чтобы узнать состояние в текущий момент, например, за пределами обработчика сообщения мыши или клавиатуры, можно пользоваться функцией ::GetAsyncKeyState.

2.3 Символьные сообщения

Часто в программах не требуется обрабатывать сообщения о нажатии/отпускании клавиш, но необходимо получать с клавиатуры символы в соответствии с состоянием клавиш Caps Lock, Shift и текущей раскладкой клавиатуры. В данном случае программа может обрабатывать сообщения WM_CHAR. Они генерируются Windows в результате обработки сообщений WM_KEYDOWN/WM_KEYUP системной функцией::TranslateMessage. Эта функция вызывается во внутреннем цикле обработки сообщений MFC.

Для обработки сообщения WM_CHAR надо занести в карту сообщений макрос ON_WM_CHAR и добавить в класс функцию-член OnChar со следующим прототипом:

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

Назначение параметров nRepCnt и nFlags то же, что и у сообщений WM_KEYDONW/WM_KEYUP. Ниже приведен фрагмент исходного текста, обрабатывающий английские буквенные клавиши, клавишу Enter и Backspace:

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

ON_WM_CHAR()

void CMainWindow::OnChar( UINT nChar, UINT nRepCnt, UINT nFlags )

{

if ( ( (nChar >= `A') && (nChar <= `Z') ) ||

( (nChar >= `a') && (nChar <= `z') ) )

{

// Отображение символа

}

else if ( nChar == VK_RETURN )

{

// Действия, связанные с клавишей Enter

}

else if ( nChar == VK_BACK )

{

// Действия, связанные с клавишей Backspace

}

}

3. Основные приемы программирования меню

Строка меню обычно располагается в верхней части главного окна приложения. Это меню называется главным меню (или меню верхнего уровня), а его команды – пунктами главного меню. При выборе пунктов главного меню появляются выпадающие меню, элементы которых называются просто пунктами меню. Пункты меню отличаются друг от друга целочисленными значениями – идентификаторами пунктов меню (идентификаторами команд). Windows также поддерживает всплывающие меню, которые выглядят так же, как выпадающие меню, но могут появляться в любом месте экрана. Примером таких меню являются контекстные меню, вызываемые щелчком правой кнопкой на некотором объекте. Выпадающие меню – это всплывающие меню, которые являются подменю для меню верхнего уровня.

В большинстве окон верхнего уровня есть системное меню с командами перемещения, изменения размеров окна, свертывания и развертывания. Это меню выглядит как маленькая пиктограмма в левой части строки заголовка окна. Меню можно открыть щелчком левой кнопки мыши по пиктограмме или клавишами Alt+пробел.

В MFC меню и сопутствующие функции инкапсулированы в класс CMenu. В нем есть одна открытая переменная-член m_hMenu – дескриптор меню типа HMENU. Среди функций-членов есть CMenu::TrackPopupMenu для вывода контекстного меню и CMenu::EnableMenuItem для разрешения/запрещения пункта меню.

Меню в MFC-приложении можно создать одним из трех способов:

·  Программно, с помощью функций-членов класса CMenu, таких, как CreateMenu и InsertMenu.

·  Поместить описание меню в специальные структуры данных и затем передать эти структуры функции CMenu::LoadMenuIndirect.

·  Создать ресурс меню с помощью редактора ресурсов и загружать это меню во время выполнения программы. Этот метод используется наиболее часто.

3.1 Создание меню

Простейший способ создания меню – добавление шаблона меню в файл ресурсов приложения. Файл ресурсов – это текстовый файл, содержащий описание ресурсов приложения на специальном языке. У этого файла обычно расширение *.rc, поэтому он часто упоминается как "RC-файл". Ресурс – это некоторый массив числовых данных, описывающих, например, меню или пиктограмму. Windows поддерживает ресурсы нескольких типов, в том числе меню, пиктограммы, растровые изображения и строки. Специальная программа, компилятор ресурсов (входит в состав Visual C++), компилирует текстовое содержимое RC-файла в двоичный вид. Затем компоновщик присоединяет эти данные к исполняемому EXE-файлу приложения. Каждому ресурсу в качестве идентификатора присвоена строка или число, например, "MyMenu" (строка) или IDR_MYMENU (целое число). Целочисленным идентификаторам даются более понятные человеку имена-константы, например, IDR_MYMENU. Эти константы определены директивами #define в заголовочном файле. После того, как ресурсу скомпилированы и скомпонованы с EXE-файлом приложения, их можно загружать специальными функциями API или MFC.

Фрагмент описания меню в RC-файле приведен в виде фрагмента 6.1. Подобные описания редко формируются вручную, обычно ресурсы создаются с помощью специальных редакторов ресурсов (в Visual C++ он встроен в среду разработки).

Фрагмент исходного текста 6.1. Часть описания шаблона меню.

IDR_MAINFRAME MENU PRELOAD DISCARDABLE

BEGIN

POPUP "&Файл"

BEGIN

MENUITEM "Созд&ать\tCtrl+N", ID_FILE_NEW

MENUITEM "&Открыть...\tCtrl+O", ID_FILE_OPEN

MENUITEM "&Сохранить\tCtrl+S", ID_FILE_SAVE

MENUITEM "Сохранить &как...", ID_FILE_SAVE_AS

MENUITEM SEPARATOR

MENUITEM "Последние открывавшиеся файлы", ID_FILE_MRU_FILE1,GRAYED

MENUITEM SEPARATOR

MENUITEM "В&ыход", ID_APP_EXIT

END

POPUP "&Правка"

BEGIN

MENUITEM "&Отменить\tCtrl+Z", ID_EDIT_UNDO

MENUITEM SEPARATOR

...

END

Значения ID_..., указанные после названий пунктов меню – это идентификаторы команд меню. Каждому пункту меню должен быть присвоен уникальный идентификатор команды, чтобы приложение могло среагировать на выбор этого пункта. По соглашению, эти идентификаторы определяются как числовые константы (через директивы #define), имена которых начинаются с префикса ID_ или IDM_, за которым заглавными английскими буквами указывается имя пункта меню.

В имени пункта меню амперсанд обозначает горячую клавишу для выбора этого пункта. После символа табуляции принято (если есть) указывать ускоряющую клавишу (например, Ctrl+O в "&Открыть…\tCtrl+O"). Ускоряющая клавиша – это клавиша или комбинация клавиш, нажатие которой аналогично выбору команды меню.

3.2 Загрузка и отображение меню

В начале выполнения программы ресурс меню надо загрузить и присоединить к окну. Меню будет автоматически отображаться вместе внутри окна.

Во-первых, это можно сделать с помощью функции CFrameWnd::Create, которой надо передать идентификатор меню, например (если идентификатором ресурса меню IDR_MAINFRAME):

Из за большого объема этот материал размещен на нескольких страницах:
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