komunikat WM_POINTERUP
Wysłana, gdy wskaźnik, który nawiązał kontakt przez obszar klienta okna przerywa kontakt. Ten komunikat wejściowy jest przeznaczony dla okna, w którym wskaźnik tworzy kontakt, a wskaźnik jest w tym momencie niejawnie przechwycony w oknie, tak aby okno nadal odbierało komunikaty wejściowe, w tym powiadomienie WM_POINTERUP wskaźnika, dopóki nie przerwie kontaktu.
Okno odbiera ten komunikat za pośrednictwem funkcji WindowProc.
! [Ważne]
Aplikacje klasyczne powinny mieć świadomość DPI. Jeśli aplikacja nie rozpozna dpi, współrzędne ekranu zawarte w komunikatach wskaźnika i powiązanych strukturach mogą wydawać się niedokładne z powodu wirtualizacji DPI. Wirtualizacja DPI zapewnia automatyczną obsługę skalowania dla aplikacji, które nie obsługują dpi i są domyślnie aktywne (użytkownicy mogą ją wyłączyć). Aby uzyskać więcej informacji, zobacz Pisanie aplikacji win32 High-DPI.
#define WM_POINTERUP 0x0247
Parametry
-
wParam
-
Zawiera informacje o wskaźniku. Użyj poniższych makr, aby pobrać informacje z parametru wParam.
GET_POINTERID_WPARAM(wParam): identyfikator wskaźnika.
IS_POINTER_NEW_WPARAM(wParam): flaga wskazująca, czy ten komunikat reprezentuje pierwsze dane wejściowe wygenerowane przez nowy wskaźnik.
IS_POINTER_INRANGE_WPARAM(wParam): flaga wskazująca, czy ten komunikat został wygenerowany przez wskaźnik w okresie jego istnienia. Ta flaga nie jest ustawiona w komunikatach, które wskazują, że wskaźnik ma zakres wykrywania po lewej stronie
IS_POINTER_INCONTACT_WPARAM(wParam): flaga wskazująca, czy ten komunikat został wygenerowany przez wskaźnik, który jest w kontakcie z powierzchnią okna. Ta flaga nie jest ustawiona dla komunikatów, które wskazują wskaźnik aktywowania.
IS_POINTER_PRIMARY_WPARAM(wParam): wskazuje, że ten wskaźnik został wyznaczony jako podstawowy.
IS_POINTER_FIRSTBUTTON_WPARAM(wParam): flaga wskazująca, czy istnieje akcja podstawowa.
- Jest to analogiczne do lewego przycisku myszy w dół.
- Wskaźnik dotykowy będzie miał ten zestaw, gdy ma kontakt z powierzchnią cyfry.
- Wskaźnik pióra będzie miał ten zestaw, gdy jest w kontakcie z powierzchnią cyfryzatora bez naciśnięcia przycisków.
IS_POINTER_SECONDBUTTON_WPARAM(wParam): flaga wskazująca, czy istnieje akcja pomocnicza.
- Jest to analogiczne do prawego przycisku myszy w dół.
- Wskaźnik pióra będzie miał ten zestaw, gdy jest w kontakcie z powierzchnią cyfry z naciśnięciem przycisku beczki pióra.
IS_POINTER_THIRDBUTTON_WPARAM(wParam): flaga wskazująca, czy istnieją co najmniej jedno akcje tertiarne na podstawie typu wskaźnika; aplikacje, które chcą reagować na akcje tertiarne, muszą pobierać informacje specyficzne dla typu wskaźnika, aby określić, które przyciski tertiarne są naciskane. Na przykład aplikacja może określić stany przycisków pióra, wywołując GetPointerPenInfo i sprawdzając flagi określające stany przycisków.
IS_POINTER_FOURTHBUTTON_WPARAM(wParam): flaga wskazująca, czy określony wskaźnik podjął czwartą akcję. Aplikacje, które chcą odpowiedzieć na czwarte akcje, muszą pobrać informacje specyficzne dla typu wskaźnika, aby określić, czy pierwszy rozszerzony przycisk myszy (XButton1) jest naciśnięty.
IS_POINTER_FIFTHBUTTON_WPARAM(wParam): flaga wskazująca, czy określony wskaźnik podjął piątą akcję. Aplikacje, które chcą odpowiedzieć na piąte akcje, muszą pobrać informacje specyficzne dla typu wskaźnika, aby określić, czy drugi rozszerzony przycisk myszy (XButton2) jest naciśnięty.
Aby uzyskać więcej informacji, zobacz flagi wskaźnika.
Nuta
Wskaźnik aktywowania nie ma ustawionych flag przycisku. Jest to analogiczne do ruchu myszy bez przycisków myszy w dół. Aplikacja może określić stany przycisków pióra aktywowania, na przykład wywołując GetPointerPenInfo i sprawdzając flagi określające stany przycisku.
-
lParam
-
Zawiera lokalizację punktu wskaźnika.
Nuta
Ponieważ wskaźnik może nawiązać kontakt z urządzeniem w obszarze innym niż trywialny, lokalizacja punktu może być uproszczeniem bardziej złożonego obszaru wskaźnika. Jeśli to możliwe, aplikacja powinna używać pełnych informacji o obszarze wskaźnika zamiast lokalizacji punktu.
Użyj poniższych makr, aby pobrać współrzędne ekranu fizycznego punktu.
- GET_X_LPARAM(lParam): współrzędna x (punkt poziomy).
- GET_Y_LPARAM(lParam): współrzędna y (punkt pionowy).
Wartość zwracana
Jeśli aplikacja przetwarza ten komunikat, powinna zwrócić zero.
Jeśli aplikacja nie przetworzy tego komunikatu, powinna wywołać DefWindowProc.
Uwagi
! [Ważne]
Gdy okno utraci przechwycenie wskaźnika i otrzyma powiadomienie o WM_POINTERCAPTURECHANGED, zwykle nie będzie otrzymywać żadnych dalszych powiadomień. Z tego powodu ważne jest, aby nie wprowadzać żadnych założeń w oparciu o parowane równomiernie WM_POINTERDOWN/WM_POINTERUP lub powiadomienia WM_POINTERENTER/WM_POINTERLEAVE.
Każdy wskaźnik ma unikatowy identyfikator wskaźnika w okresie jego istnienia. Okres istnienia wskaźnika rozpoczyna się po pierwszym wykryciu.
Jeśli zostanie wykryty wskaźnik aktywowania, zostanie wygenerowany komunikat WM_POINTERENTER. Komunikat WM_POINTERDOWN, po którym następuje komunikat WM_POINTERENTER, jest generowany, jeśli zostanie wykryty wskaźnik bez aktywowania.
W okresie istnienia wskaźnik może wygenerować serię komunikatów WM_POINTERUPDATE, gdy znajduje się na nim wskaźnik lub kontakt.
Okres istnienia wskaźnika kończy się, gdy nie jest już wykrywany. Spowoduje to wygenerowanie komunikatu WM_POINTERLEAVE.
Po przerwaniu wskaźnika POINTER_FLAG_CANCELED jest ustawiona.
Komunikat WM_POINTERLEAVE może być również generowany, gdy wskaźnik nieuchwycony jest przesuwany poza granice okna.
Aby uzyskać położenie wskaźnika w poziomie i w pionie, użyj następującego polecenia:
Użyj następującego kodu, aby uzyskać położenie poziome i pionowe:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
Makro MAKEPOINTS może również służyć do konwertowania parametru lParam na POINTS struktury.
Funkcja GetKeyState może służyć do określania stanów modyfikatora klawiatury skojarzonych z tym komunikatem. Aby na przykład wykryć, że ALT został naciśnięty, sprawdź, czy GetKeyState(VK_MENU) < 0.
Jeśli aplikacja nie przetworzy tego komunikatu, defWindowProc może wygenerować jeden lub więcej komunikatów WM_GESTURE, jeśli sekwencja danych wejściowych z tego i, być może, inne wskaźniki są rozpoznawane jako gest. Jeśli gest nie zostanie rozpoznany, DefWindowProc może wygenerować dane wejściowe myszy.
Jeśli aplikacja selektywnie używa niektórych danych wejściowych wskaźnika i przekazuje resztę do DefWindowProc, wynikowe zachowanie jest niezdefiniowane.
Użyj funkcji GetPointerInfo, aby pobrać więcej informacji związanych z tym komunikatem.
Przykłady
Poniższy przykład kodu pokazuje, jak pobrać pozycję x i y wskaźnika skojarzonego z tym komunikatem.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
// process pointer up, similar to mouse button up
Poniższy przykład kodu pokazuje, jak uzyskać identyfikator wskaźnika skojarzony z tym komunikatem.
POINTER_INFO pointerInfo;
UINT32 pointerId = GET_POINTERID_WPARAM(wParam);
// Retrieve common pointer information
if (!GetPointerInfo(pointerId, &pointerInfo))
{
// failure, call GetLastError()
}
else
{
// success, process pointerInfo
}
W poniższym przykładzie kodu pokazano, jak obsługiwać różne typy wskaźników skojarzone z tym komunikatem.
POINTER_TOUCH_INFO touchInfo;
POINTER_PEN_INFO penInfo;
POINTER_INFO pointerInfo;
UINT32 pointerId = GET_POINTERID_WPARAM(wParam);
POINTER_TYPE pointerType = PT_POINTER;
// default to unhandled to enable call to DefWindowProc
fHandled = FALSE;
if (!GetPointerType(pointerId, &pointerType))
{
// failure, call GetLastError()
// set PT_POINTER to fall to default case below
pointerType = PT_POINTER;
}
switch (pointerType)
{
case PT_TOUCH:
// Retrieve touch information
if (!GetPointerTouchInfo(pointerId, &touchInfo))
{
// failure, call GetLastError()
}
else
{
// success, process touchInfo
// mark as handled to skip call to DefWindowProc
fHandled = TRUE;
}
break;
case PT_PEN:
// Retrieve pen information
if (!GetPointerPenInfo(pointerId, &penInfo))
{
// failure, call GetLastError()
}
else
{
// success, process penInfo
// mark as handled to skip call to DefWindowProc
fHandled = TRUE;
}
break;
default:
if (!GetPointerInfo(pointerId, &pointerInfo))
{
// failure.
}
else
{
// success, proceed with pointerInfo.
fHandled = HandleGenericPointerMessage(&pointerInfo);
}
break;
}
Wymagania
Wymaganie | Wartość |
---|---|
Minimalny obsługiwany klient |
Windows 8 [tylko aplikacje klasyczne] |
Minimalny obsługiwany serwer |
Windows Server 2012 [tylko aplikacje klasyczne] |
Nagłówek |
|
Zobacz też
-
referencyjne