Mauskoordinaten im Fenster ausgeben
-
Guten Abende,
Ich wollt in meinem Fenster oben links die Maus koordinaten ausgeben lassen.
Leider klappt dies nicht korrekt.
Code:#include<windows.h> //Prototyp der NachrichtenFunktion LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Instance HINSTANCE hInstGlobal; //Hauptblock int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //constante für titel const char szT[] = "Steuerelemente"; //übergabe des Fenster hInstance an hInstGlobal hInstGlobal = hInstance; //Windowsfensterklasse WNDCLASS wc; //Fensterhandle HWND hWnd; //Nachrichtenstruktur MSG msg; //Fenstereigenschaften über Klasse bearbeiten wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = "WinProg"; wc.lpszMenuName = 0; wc.style = 0; //Fensterklasse registrieren RegisterClass(&wc); //Fenster über handle erstellen hWnd = CreateWindow("WinProg", szT, WS_OVERLAPPEDWINDOW, 0, 0, 330, 400, NULL, NULL, hInstance, NULL); //Fensterzeigen ShowWindow(hWnd, nCmdShow); //Femster aktualisieren UpdateWindow(hWnd); //überprüfen ob Nachricht ansteht while(GetMessage(&msg, NULL, 0, 0)) { //Nachricht an WndProc senden; zur bearbeitung DispatchMessage(&msg); } //wParam return return msg.wParam; } //Nachrichten verarbeitungs Funktion LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { RECT rect; rect.left = 20; rect.right = 330; rect.bottom = 100; rect.top = 20; int xPos, yPos; xPos = 0; yPos = 0; int x, y; x = 160; y = 50; char xPosc[5] = {0, 0, 0, 0, 0}; //nachrichten wahl switch (message) { //Fenster kreieren case WM_CREATE: //handle für buttons(childwindows) HWND hButton; //Fontbutton erstellen hButton = CreateWindow("Button", "", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 80, 150, x, y, hWnd, (HMENU) 1, hInstGlobal, NULL); return 0; case WM_MOUSEMOVE: xPos = LOWORD(lParam); // horizontal position of cursor yPos = HIWORD(lParam); // vertical position of cursor InvalidateRect(hWnd, &rect, NULL); return 0; case WM_PAINT: HDC hdc; PAINTSTRUCT ps; wsprintf(xPosc, "%i", xPos); hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 20, 20, xPosc, 5); EndPaint(hWnd, &ps); return 0; //wenn das fenster geschlossen wird case WM_DESTROY: PostQuitMessage(0); return 0; //sonstige Nachrichten default: return DefWindowProc(hWnd, message, wParam, lParam); } }
Ich vermute den Fehler hier:
wsprintf(xPosc, "%i", xPos);
oder beim Textout.
Ich hoffe ihr könnt mir helfenMFG hosti
-
Du solltest die beiden ints xPos und yPos static deklarieren. Sonst sind die doch bei jedem WndProc-Aufruf wieder 0.
Außerdem solltest du sie mit 0 initialisieren und nicht bei jedem Aufruf 0 zuweisen:static int xPos = 0; static int yPos = 0;
char xPosc[5] = {0, 0, 0, 0, 0};
Das ist auch überflüssig, eine 0 in den geschwungenen Klammern reicht völlig. Das bewirkt sogar genau das gleiche.
btw:
Sinnlose Kommentare würde ich weglassen.
Solche Kommentare helfen nicht:hosti schrieb:
//übergabe des Fenster hInstance an hInstGlobal hInstGlobal = hInstance; //Fensterzeigen ShowWindow(hWnd, nCmdShow); //Femster aktualisieren UpdateWindow(hWnd); // etc.
-
hosti schrieb:
int xPos, yPos; xPos = 0; yPos = 0;
Diese Variablen musst du als static deklarieren, damit sie ihren Wert zwischen den einzelnen Aufrufen Behalten. Außerdem darfst du sie nicht immer wieder mit 0 initialisieren. Also dann so:
static int xPos = 0; static int yPos = 0;
Hm, zu langsam - dafür kannst du dir jetzt sicher sein, dass es stimmt
-
ICH LIEBE EUCH!!!
Vielen dank,
frage am rande...
wurde bei mir xPos(yPos) immer neu mit Null initialisiert??
-
Hallo,
schon wieder was neues:TextOut(hdc, 50, 20, xPosc, sizeof(xPosc) - 1);
Ich wollt damit nur die koordinaten ausgeben, klappt aber nicht, ich hab immer noch so komische Zeichen die da nichts zu suchen haben
-
Was übergibst du denn da als letzten Parameter an TextOut?
Lass den lieber auf -1, dann berechnet sich TextOut die Länge des Strings selbst.Welche IDE benutzt du, Visual C++? Borland Builder? Beide haben nämlich sehr leistungsfähige Debugger, die du dir vielleicht mal ansehen solltest.
-
afaik musst du bei TextOut die Länge übergeben. Bei DrawText war das doch mit dem -1.
Statt sizeof würde ich strlen nehmen...
-
dein Code ist äquivalent zu sizeof(int)-1
also 3
-
schliess doch mal den string mit \0 ab.
msp
-
msp schrieb:
schliess doch mal den string mit \0 ab.
Das wird bereits durch wsprintf erledigt.
-
Danke für eure Antworten.
Die idee war ja, denn string abschluss(\0) mit -1 abzuziehen und nur die koordinaten auszugeben.Das mit strlen funktioniert einwandfrei,
was ist den der unterschied?Die Koordinaten die ich erhalte sind etwas komisch,
wenn ich die Maus von oben nach unten runterziehe kommen kordinaten...
in dieser reihen folge:
Oben --> start
0-900
0-900
..
Unten --> Stop
was denn das?
-
D.h., es verändert sich gar nichts
-
vertikal geht meine Anzeige von 0 - 990 und beginnt nochmal von 0 auf 990 und dann nochmal.
Das erste mal entsprich etwa 20 Pixel,
dass zweite mal vieleicht 80 pixel,
und das letzte mal gehts von 80 pixel runter auf den rand..horizontal das selbe...
EDIT:
Das ist ja interessant, ich hab den Button in ein Funktion gepackt und jetzt läuft es.void button(HWND hWnd, HWND hButton, int x, int y) { hButton = CreateWindow("Button", "", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 80, 150, x, y, hWnd, (HMENU) 1, hInstGlobal, NULL);
-
Ok, ich werd verarscht jetzt gehts wieder nicht!!
Komisch, Ich möchte gern ein prog. das jeh nach mauspos. im Fenster einen Button in der Grösse ändert.
Das hab ich jetzt:#include<windows.h> #include<string.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void groesse(int xPos, int y); void button(HWND hWnd, HWND hButton, int x, int y); HINSTANCE hInstGlobal; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { const char szT[] = "Steuerelemente"; hInstGlobal = hInstance; WNDCLASS wc; HWND hWnd; MSG msg; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = "WinProg"; wc.lpszMenuName = 0; wc.style = 0; RegisterClass(&wc); hWnd = CreateWindow("WinProg", szT, WS_OVERLAPPEDWINDOW, 0, 0, 330, 400, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static int xPos = 0; static int yPos = 0; static int x = 160; static int y = 40; char xPosc[5] = {0}; char yPosc[5] = {0}; static HWND hButton; switch (message) { case WM_CREATE: return 0; case WM_MOUSEMOVE: xPos = LOWORD(lParam); // horizontal position of cursor yPos = HIWORD(lParam); // vertical position of cursor groesse(xPos, y); InvalidateRect(hWnd, NULL, NULL); UpdateWindow(hWnd); return 0; case WM_PAINT: button(hWnd, hButton, x, y); HDC hdc; PAINTSTRUCT ps; wsprintf(xPosc, "%i", xPos); wsprintf(yPosc, "%i", yPos); hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 10, 20, "xPos:", 5); TextOut(hdc, 10, 40, "yPos:", 5); TextOut(hdc, 50, 20, xPosc, strlen(xPosc)); TextOut(hdc, 50, 40, yPosc, strlen(yPosc)); EndPaint(hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } } void button(HWND hWnd, HWND hButton, int x, int y) { hButton = CreateWindow("Button", "", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 80, 150, x, y, hWnd, (HMENU) 1, hInstGlobal, NULL); } void groesse(int xPos, int y) { if(xPos > 50) y = 100; else y = 200; }
aber irgendwie klappt nix
-
Du erstellst ja jedesmal bei WM_PAINT einen neuen Button
und deine groesse Funktion ist auch nicht sehr sinnvoll! - schonmal was von Pointern * und Referenzen & gehört?
Wenn nicht würde ich dir dringend raten, die erstmal noch ein wenig mit C/C++ auseinanderzusetzenZum Verschieben: MoveWindow oder SetWindowPos
-
Ach schei.. diese blöden Variablen kopien!!
Denke ich werds mit ner Ref lösen.Aber wie würdest du den den Button aktualisieren?
-
Was meinst du mit aktualisieren? Neu zeichnen lassen? -> InvalidateRect. Verschieben hab ich ja schon geschrieben.
-
irgendiwe klappt's nicht.
hab jetzt damit begonnen sinlos Updates zu machen aber es will nicht:#include<windows.h> #include<string.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void groesse(int *yPos, int *y); void button(HWND hWnd, HWND hButton, int x, int y); void move(int *laenge, int *breite, HWND hWnd); HINSTANCE hInstGlobal; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { const char szT[] = "Steuerelemente"; hInstGlobal = hInstance; WNDCLASS wc; HWND hWnd; MSG msg; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = "WinProg"; wc.lpszMenuName = 0; wc.style = 0; RegisterClass(&wc); hWnd = CreateWindow("WinProg", szT, WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static int xPos = 0; static int yPos = 0; static int x; static int y; char xPosc[5] = {0}; char yPosc[5] = {0}; static int yy = 150; static int xx = 80; HWND hButton; switch (message) { case WM_CREATE: x = 140; y = 20; button(hWnd, hButton, x, y); return 0; case WM_MOUSEMOVE: xPos = LOWORD(lParam); // horizontal position of cursor yPos = HIWORD(lParam); // vertical position of cursor groesse(&yPos, &y); InvalidateRect(hWnd, NULL, NULL); InvalidateRect(hButton, NULL, NULL); return 0; case WM_PAINT: HDC hdc; PAINTSTRUCT ps; wsprintf(xPosc, "%i", xPos); wsprintf(yPosc, "%i", yPos); hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 10, 20, "xPos:", 5); TextOut(hdc, 10, 40, "yPos:", 5); TextOut(hdc, 50, 20, xPosc, strlen(xPosc)); TextOut(hdc, 50, 40, yPosc, strlen(yPosc)); EndPaint(hWnd, &ps); move(&xx, &yy, hButton); ShowWindow(hButton, NULL); UpdateWindow(hButton); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } } void move(int *laenge, int *breite, HWND hButton) { MoveWindow(hButton, 80, 150, *laenge, *breite, FALSE); } void groesse(int *yPos, int *y) { if(*yPos > 300) {*y = 150;} else {*y = 20;} } void button(HWND hWnd, HWND hButton, int x, int y) { hButton = CreateWindow("Button", "", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 80, 150, x, y, hWnd, (HMENU) 1, hInstGlobal, NULL); }
yy und xx hab ich um die Movefunk zu Testen aber sie möchte anscheinend nicht recht
-
Du hast auch ein paar Fehler im Code! (z.B. bei hButton oder bei InvalidateRect)
Was soll denn das Programm im Endeffekt machen?
-
Wenn's dann fertig ist soll sich die Button grösse zur Mausposition ändern
y-Mausposition == 100 --> Button 20 Pixel hoch
y-Mausposition == 200 --> Button 40 Pixel hochkannst du mir mit den Fehlern helfen?