[C++] Auf den Bildschirm malen

Carndret

Erfahrenes Mitglied
Ich schreibe gerade ein Programm bei dem unteranderem ein Teil dabei sein soll, der mir etwas schwerer zu realisieren scheint.
Und zwar: sobald ich die mittlere Maustaste drücke (egal wo) fängt mein Programm diese Nachricht ab. Nun soll, solange die Taste gedrückt ist, auf dem Bildschirm gemalt werden. Also wie bei Paint mit dem Stift.
Ich hatte mir gedacht, dass ich einfach ein Fenster mache, das so groß ist wie der Bildschirm und ich dann da drauf zeichne. Allerdings müsste dieses Fenster im Vordergrund bleiben und durchsichtig sein...

Hat jemand vielleicht eine andere, bessere Idee, wie man das machen könnte?
 
Das müsste mit systemweiten Maushooks gehen, bei denen Du jeden Tastendruck und jede Bewegung abfängst.

http://www.fantastic-software.de/tutorials/hook.htm
Vielleicht hilft Dir das erstmal etwas weiter. Google findet auch noch etliches mehr dazu. ;)

Ansonsten könntest Du auch einfach die Nachricht WM_MOUSEMOVE abfangen und dann mit GetCursorPos() die Position des Mauszeigers auslesen. An die Stelle malst Du dann einfach einen Punkt.
 
dazu brauch man nichtmal ein mousehook...
if(GetAsyncKeyState(VK_MBUTTON)), funktioniert global, ohne das dass programm im vordergrund läuft, genauso wie GetCursorPos();
natürlich lässt sich das auch abfragen, ob es im vordergrund ist, oder nicht...
 
ja, ok aber wie genau zeichne ich auf den Bildschirm? Die Mauskoordinaten bekomme ich, nur weiß ich nicht wie ich einen Pixel bzw. eine Linie ziehen kann.
 
vergiss das mit dem GetCursorPos() wieder, das ist zu umständlich, weil das die mausposition von windows ist, und nicht direkt die position in deinem programm, da müsste man noch ein paar berechnungen machen, is aber zu umstädnlich... hier ein beispiel:

Code:
#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static int lastx, lasty, x, y;
	static HDC hdc;

	switch(message)
	{
		case WM_MBUTTONDOWN:
			lastx = LOWORD(lParam);
			lasty = HIWORD(lParam);
			break;

		case WM_MOUSEMOVE:
			if(wParam & MK_MBUTTON)
			{
				hdc = GetDC(hwnd);
				x = LOWORD(lParam);
				y = HIWORD(lParam);

				MoveToEx(hdc, lastx, lasty, NULL);
				LineTo(hdc, x, y);

				lastx = x;
				lasty = y;
				ReleaseDC(hwnd, hdc);
			}
			break;
		case WM_CLOSE:
			PostQuitMessage(0);
			break;
	}
	return false;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)		
{ 
	DialogBox (hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, (DLGPROC) WndProc);
	return 0;
}
 
Zurück