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 helfen

    MFG 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++ auseinanderzusetzen 😉

    Zum 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 hoch

    kannst du mir mit den Fehlern helfen?


Anmelden zum Antworten