Mauskoordinaten im Fenster ausgeben
-
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?
-
Ist auch alles noch sehr unsauber bzw. unschön, aber meinst du irgendwie so:
#include<windows.h> #include<string.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void groesse(int yPos, int &y); HWND button(HWND hWnd, 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; static HWND hButton; switch (message) { case WM_CREATE: x = 140; y = 20; hButton = button(hWnd, x, y); ShowWindow(hButton, TRUE); return 0; case WM_MOUSEMOVE: xPos = LOWORD(lParam); // horizontal position of cursor yPos = HIWORD(lParam); // vertical position of cursor move(xPos/10, yPos/10, hButton); //groesse(yPos, y); InvalidateRect(hWnd,NULL, TRUE); //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); 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;} } HWND button(HWND hWnd, int x, int y) { return CreateWindow("Button", "", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 80, 150, x, y, hWnd, (HMENU) 1, hInstGlobal, NULL); }
-
Im Prinzip schon, danke
Gute lösung mit der Button Funktion (Return)Bei Mausbewegung erklärst du ja das Hauptfenster für ungültig(hWnd).
Wieso nicht den Button?
-
Wozu denn? Es geht doch eigentlich hauptäschlich darum, dass die Maus-Position neu ins Fenster geschrieben werden muss
-
was soll die move() funktion???
-
es geht um die variable grösse des buttons, die koordinaten hab ich nur um die LO- HiWORD Makros zu testen
-
Dann kannst du das InvalidateRect ganz weglassen und bei MoveWindow für den letzten Parameter TRUE einsetzen
-
Is ja klasse, mein "fast" eigenes Winapiprog ist (schonwieder) "fast" fertig.
Hab mal was über buffer gelesen, mal gucken ob ich das finde