Начало работы с сообщениями Windows Touch
В этом разделе описываются задачи, связанные с получением входных данных Windows Touch для работы в приложении.
Следующие действия обычно выполняются при работе с сообщениями Windows Touch:
- Проверьте возможности входного дигитайзера.
- Зарегистрируйтесь для получения сообщений Windows Touch.
- Обработка сообщений.
Сообщение, используемое для Windows Touch, WM_TOUCH. Это сообщение указывает на различные состояния контакта с дигитайзером.
Тестирование возможностей входного дигитайзера
Функцию GetSystemMetrics можно использовать для запроса возможностей входного дигитизатора путем передачи значения nIndex SM_DIGITIZER. GetSystemMetrics возвращает битовое поле, указывающее, готов ли устройство, поддерживает ли устройство перо или сенсорный ввод, является ли устройство встроенным или внешним, а также поддерживает ли устройство несколько входных данных (Windows Touch). В следующей таблице показаны биты для различных полей.
бит | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
Значение | Готово к стеку | Много входные данные | Зарезервировано | Зарезервировано | Внешнее перо | Встроенное перо | Внешний сенсорный касание | Интегрированный сенсорный интерфейс |
Чтобы проверить результат команды для определенной функции, можно использовать побитовый оператор и конкретный бит, который вы тестируете. Например, чтобы протестировать Windows Touch, необходимо проверить, задан ли бит седьмого порядка (0x40 в шестнадцатеричном режиме). В следующем примере кода показано, как можно проверить эти значения.
#include <windows.h>
// test for touch
int value = GetSystemMetrics(SM_DIGITIZER);
if (value & NID_READY){ /* stack ready */}
if (value & NID_MULTI_INPUT){
/* digitizer is multitouch */
MessageBoxW(hWnd, L"Multitouch found", L"IsMulti!", MB_OK);
}
if (value & NID_INTEGRATED_TOUCH){ /* Integrated touch */}
В следующей таблице перечислены константы, определенные в windows.h для тестирования возможностей сенсорного ввода дигитайзера.
Имя. | Стоимость | Описание |
---|---|---|
TABLET_CONFIG_NONE | 0x00000000 | Входной дигитайзер не имеет возможностей сенсорного ввода. |
NID_INTEGRATED_TOUCH | 0x00000001 | Интегрированный сенсорный дигитизатор используется для ввода. |
NID_EXTERNAL_TOUCH | 0x00000002 | Внешний сенсорный дигитайзер используется для ввода. |
NID_INTEGRATED_PEN | 0x00000004 | Интегрированный дигитизатор пера используется для ввода. |
NID_EXTERNAL_PEN | 0x00000008 | Внешний дигитизатор пера используется для ввода. |
NID_MULTI_INPUT | 0x00000040 | Входной дигитизатор с поддержкой нескольких входных данных используется для ввода. |
NID_READY | 0x00000080 | Входной дигитайзер готов к входным данным. Если это значение не задано, это может означать, что служба планшетов остановлена, дигитайзер не поддерживается или драйверы дигитайзера не установлены. |
Проверка значений NID_* — это полезный способ проверка возможности компьютера пользователя, чтобы настроить приложение для сенсорного ввода, пера или не планшета. Например, если у вас есть динамический пользовательский интерфейс и требуется автоматически настроить некоторые из них, можно проверка для NID_INTEGRATED_TOUCH, NID_MULTITOUCH и может получить максимальное количество касаний при первом запуске приложения.
Примечание.
Существуют некоторые ограничения для SM_GETSYSTEMMETRICS. Например, нет поддержки подключаемых модулей и воспроизведения. По этой причине используйте осторожность при использовании этой функции в качестве средства для постоянной настройки.
Регистрация для получения входных данных Windows Touch
Прежде чем получать входные данные Windows Touch, приложения должны сначала зарегистрировать для получения входных данных Windows Touch. Регистрируя окно приложения, приложение указывает, что оно совместимо с сенсорным подключением. После регистрации окна уведомления от драйвера Windows Touch перенаправляются приложению при входе в окно. Когда приложение завершит работу, оно отменяет регистрацию окна, чтобы отключить уведомления.
Примечание.
WM_TOUCH сообщения в настоящее время "жадны". После получения первого сенсорного сообщения в окне все сенсорные сообщения отправляются в это окно, пока другое окно не получит фокус.
Примечание.
По умолчанию вы получаете WM_GESTURE сообщения вместо WM_TOUCH сообщений. При вызове RegisterTouchWindow вы перестанете получать сообщения WM_GESTURE .
В следующем коде показано, как приложение может зарегистрировать для получения сообщений Windows Touch в приложении Win32.
RegisterTouchWindow(hWnd, 0);
Обработка сообщений Windows Touch
Сообщения Windows Touch можно обрабатывать из приложений в операционных системах Windows различными способами. Если вы программируют приложение графического интерфейса, добавьте код в WndProc
функцию для обработки сообщений, интересующих вас. Если вы программируют класс Microsoft Foundation (MFC) или управляемое приложение, добавьте обработчики для сообщений, интересующих вас. В следующем примере кода показано, как можно обрабатывать сенсорные сообщения из WndProc в приложении под управлением Windows.
LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam ){
BOOL bHandled = FALSE;
UINT cInputs = LOWORD(wParam);
PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
if (pInputs){
if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
for (UINT i=0; i < cInputs; i++){
TOUCHINPUT ti = pInputs[i];
//do something with each touch input entry
}
bHandled = TRUE;
}else{
/* handle the error here */
}
delete [] pInputs;
}else{
/* handle the error here, probably out of memory */
}
if (bHandled){
// if you handled the message, close the touch input handle and return
CloseTouchInputHandle((HTOUCHINPUT)lParam);
return 0;
}else{
// if you didn't handle the message, let DefWindowProc handle it
return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
// pass touch messages to the touch handler
case WM_TOUCH:
OnTouch(hWnd, wParam, lParam);
break;
В следующем коде показано, как реализовать карту сообщений и обработчик сообщений. Обратите внимание, что сообщения должны быть объявлены на карте сообщений, а затем обработчик сообщения должен быть реализован. Например, в приложении MFC это может быть объявлено в коде диалога. Обратите внимание, что OnInitDialog
функция для диалогового окна потребуется включить вызов RegisterTouchWindow , например RegisterTouchWindow(m_hWnd, 0)
.
// Class implementations within a dialog
LRESULT TestDlg::OnTouch( WPARAM wParam, LPARAM lParam ){
//Insert handler code here to do something with the message or uncomment the following line to test
//MessageBox(L"touch!", L"touch!", MB_OK);
return 0;
}
// The message map
BEGIN_MESSAGE_MAP()
ON_WM_CREATE()
... ... ...
ON_MESSAGE(WM_TOUCH, OnTouch)
END_MESSAGE_MAP()
BOOL TestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
RegisterTouchWindow(m_hWnd, 0);
... ... ...
}
Касание окна будет указывать на касания из всплывающего окна.
См. также