Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tej sekcji opisano zadania związane z tym, aby dane wejściowe Windows Touch działały w Twojej aplikacji.
Następujące kroki są zwykle wykonywane podczas pracy z komunikatami Windows Touch:
- Przetestuj możliwości cyfrowego modułu wejściowego.
- Zarejestruj się, aby otrzymywać komunikaty windows Touch.
- Zarządzaj komunikatami.
Komunikat używany dla funkcji Windows Touch jest WM_TOUCH. Ten komunikat wskazuje różne stany kontaktu z digitalizatorem.
Testowanie możliwości narzędzia Input Digitizer
Funkcja GetSystemMetrics może służyć do zapytań dotyczących możliwości cyfrowego wskaźnika wejściowego poprzez przekazanie wartości nIndex dla SM_DIGITIZER. GetSystemMetrics zwraca pole bitowe wskazujące, czy urządzenie jest gotowe, czy urządzenie obsługuje pióro, czy dotyk, czy urządzenie wejściowe jest zintegrowane, czy zewnętrzne, i czy urządzenie obsługuje wiele danych wejściowych (Windows Touch). W poniższej tabeli przedstawiono wartości bitów dla różnych pól.
| Bit | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Wartość | Gotowy do stosu | Wiele danych wejściowych | Zastrzeżony | Zastrzeżony | Pióro zewnętrzne | Zintegrowane pióro | Dotyk zewnętrzny | Zintegrowany dotyk |
Aby przetestować wynik polecenia dla określonej funkcji, możesz użyć operatora bitowego & i określonego testowego bitu. Na przykład, aby przetestować funkcję Windows Touch, należy sprawdzić, czy bit siódmego rzędu jest ustawiony (0x40 w systemie szesnastkowym). Poniższy przykład kodu pokazuje, jak można przetestować te wartości.
#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 */}
W poniższej tabeli wymieniono stałe zdefiniowane w pliku windows.h na potrzeby testowania funkcji dotykowych wejściowego digitizera.
| Nazwa | Wartość | Opis |
|---|---|---|
| KONFIGURACJA_TABLETU_BRAK | 0x00000000 | Cyfrowy przetwornik wejściowy nie obsługuje dotyku. |
| ZINTEGROWANY_DOTYK | 0x00000001 | Zintegrowany digitalizator dotykowy jest używany do wprowadzania danych wejściowych. |
| NID_EXTERNAL_TOUCH | 0x00000002 | Do wprowadzania danych służy zewnętrzny panel dotykowy. |
| NID_INTEGRATED_PEN | 0x00000004 | Zintegrowany pen digitizer służy do wprowadzania danych wejściowych. |
| NID_EXTERNAL_PEN | 0x00000008 | Do wprowadzania danych używa się zewnętrznego cyfrowego pióra. |
| NID_MULTI_INPUT | 0x00000040 | Do wprowadzania danych używany jest digitalizator wejściowy z obsługą wielu wejść. |
| NID_READY | 0x00000080 | Digitalizator wejściowy jest gotowy do wprowadzania. Jeśli ta wartość nie jest ustawiona, może to oznaczać, że usługa tabletu jest zatrzymana, digitalizator nie jest obsługiwany lub nie zainstalowano sterowników digitalizatora. |
Sprawdzanie wartości NID_* jest przydatnym sposobem sprawdzania możliwości komputera użytkownika w celu skonfigurowania aplikacji na potrzeby wprowadzania danych dotykowych, długopisowych lub innych niż tablet. Jeśli na przykład masz dynamiczny interfejs użytkownika (UI) i chcesz automatycznie skonfigurować niektóre z nich, możesz sprawdzić NID_INTEGRATED_TOUCH, NID_MULTITOUCH i uzyskać maksymalną liczbę dotknięcia po raz pierwszy, gdy użytkownik uruchamia aplikację.
Notatka
Istnieją pewne ograniczenia związane z SM_GETSYSTEMMETRICS. Na przykład nie ma obsługi plug and play. Z tego powodu należy zachować ostrożność podczas korzystania z tej funkcji jako środka do stałej konfiguracji.
Rejestrowanie w celu odbierania danych wejściowych z obsługą dotyku systemu Windows
Przed otrzymaniem danych wejściowych windows Touch aplikacje muszą najpierw zarejestrować się, aby odbierać dane wejściowe windows Touch. Rejestrując okno aplikacji, aplikacja wskazuje, że jest zgodna z obsługą dotykową. Po zarejestrowaniu okna przez aplikację powiadomienia ze sterownika Windows Touch są przekazywane do aplikacji po wprowadzeniu danych wejściowych w oknie. Kiedy aplikacja zostaje zamknięta, wyrejestrowuje swoje okno, aby wyłączyć powiadomienia.
Notatka
WM_TOUCH wiadomości są obecnie "chciwe". Po odebraniu pierwszej wiadomości dotykowej w oknie, wszystkie wiadomości dotykowe są wysyłane do tego okna, aż inne okno otrzyma fokus.
Notatka
Domyślnie są odbierane komunikaty WM_GESTURE zamiast komunikatów WM_TOUCH. Jeśli wywołasz RegisterTouchWindow, przestaniesz odbierać komunikaty WM_GESTURE.
Poniższy kod pokazuje, jak aplikacja może zarejestrować się w celu odbierania komunikatów funkcji Windows Touch w aplikacji Win32.
RegisterTouchWindow(hWnd, 0);
Obsługa komunikatów dotykowych systemu Windows
Komunikaty touch systemu Windows można obsługiwać z aplikacji w systemach operacyjnych Windows na wiele sposobów. Jeśli programujesz aplikację graficznego interfejsu użytkownika, dodasz kod w funkcji WndProc, aby obsłużyć interesujące komunikaty. Jeśli programujesz aplikację Microsoft Foundation Class (MFC) lub aplikację zarządzaną, dodajesz procedury obsługi dla komunikatów, którymi jesteś zainteresowany. Poniższy przykład kodu pokazuje, jak komunikaty dotykowe mogą być obsługiwane z aplikacji WndProc w aplikacji opartej na systemie 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;
Poniższy kod pokazuje, jak zaimplementować mapę komunikatów i procedurę obsługi komunikatów. Należy pamiętać, że komunikaty muszą być zadeklarowane na mapie komunikatów, a następnie należy zaimplementować procedurę obsługi komunikatu. Na przykład w aplikacji MFC można to zadeklarować w kodzie okna dialogowego. Należy również pamiętać, że funkcja OnInitDialog dla okna dialogowego musi zawierać wywołanie RegisterTouchWindow, na przykład 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);
... ... ...
}
Dotknięcie okna wskaże dotknięcia pochodzące z okna podręcznego.
Tematy pokrewne