Mausposition
-
Hi,
ich hab ein Problem bei folgendem code:
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static char szAppName[] = "Name" ; HWND hwnd ; MSG msg ; WNDCLASSEX wndclass ; wndclass.cbSize = sizeof (wndclass) ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ; RegisterClassEx (&wndclass) ; hwnd = CreateWindow (szAppName, "WinAPI", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { char xkoord[10]; char ykoord[10]; switch (iMsg) { case WM_CREATE: return 0; case WM_PAINT: return 0; case WM_KEYDOWN : switch(wParam) { case VK_ESCAPE: SendMessage(hwnd,WM_DESTROY,0,0); break; } return 0 ; case WM_MOUSEMOVE: switch (wParam) { case MK_LBUTTON: itoa( LOWORD(lParam), xkoord, 10 ); itoa( HIWORD(lParam), ykoord, 10 ); MessageBox(0,xkoord,"X",0); MessageBox(0,ykoord,"Y",0); break; } break; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }Das Programm soll bei einem Mausklick die Position in zwei MessageBoxen ausgeben!?
Ich benutzte WinXP und den Dev-CPP
Danke schonmal im Voraus.

-
Kann es sein, daß du die falsche Message abfangen willst? WM_MOUSEMOVE reagiert auf Mausbewegungen, zum Abfangen der Tastendrücke benötigst du WM_*BUTONNDOWN (*=L,M,R oder X je nach überprüfter Taste).
-
erm.... ja kann sein. Aber ich frag ja ab, ob gleichzeitig die Linke Maustaste gedrückt wird durch
switch (wParam) { case MK_LBUTTON:
-
der wParam enthält eine Bitkombination aus mehreren Werten - womöglich ist noch eine andere virtuelle Taste gedrückt (oder eine unbelegte Position wurde mit 1 vorbesetzt) - ändere das am besten in
if(wparam&MK_LBUTTON) { ... }(du kannst ja mal einen Breakpoint vor das Case setzen und nachsehen, was dort wirklich steht)
-
if(wparam&MK_LBUTTON) { ... }geht bei mir nicht....
Gibt es noch eine andere möglichkeit?

-
Was genau heißt "geht nicht"? (wenn der Compiler über einen unbekannten Bezeichner meckert, korrigier' mal die Großschreibung ;))
-
Das wär schon korrekt so. Kanns sein, dass irgendjemand die Maus gecaptured (uhje, denglisch) hat?
MfG SideWinder
-
okay, jetzt lässt sich das programm wenigstens kompiliren.
Aber wenn ich das prog öffne, schliesst es gleich wieder....
-
Ich würde dir empfehlen, am Anfang der WndProc einen BreakPoint zu setzen, um die eingehenden Nachrichten zu überprüfen.
(btw, ich hoffe, du hast das "break;" hinter dem "case WM_MOUSEMOVE:" nicht unterschlagen)
PS: Je länger ich darüber nachdenke, desto ungeeigneter erscheinen mir Message-Boxen für die Ausgabe - schreib die Werte lieber in ein vorhandenes Dialog-Element.
-
Da reicht auch ein kurzes Nachdenken, dass eine MessageBox irgendwie ganz ungeschickt ist, da dieses ja einen Dialog bringt und somit nur der erste Wert angezeigt wird... im schlimmsten Fall kommen tausende MessageBoxen...
Wie CStoll gesagt hat: Zeige den Wert am besten in einem Element Deines Fensters an (oder schreibe Ihn in eine Logdatei, wenn es dich so brennend interessiert...)
-
okay! werd ich ma probieren