Fensternullpunktverschiebung
-
Hallo zusammen,
bin langsam am verzweifeln und komme einfach nicht mehr weiter.
Ich schreibe gerade in C (als Projektarbeit) ein Programm das die Schnittpunkte einer Geraden und eines Kreises berechnen soll und deren Abstand zueinander.
Gezeichnet werden die beiden Elemente über Koordinateneingabe oder Mausclicks.
Mein Problem besteht darin, dass der Nullpunkt standardmäßig oben links sitzt und ich diesen gerne verschieben möchte und zwar in die Mitte des Fensters, weil dort auch der Nullpunkt meines Koordinatensystems ist.
Das mache ich aktuell in einem Unterprogramm so:
fenstergroesse (hwnd); //besteht nur aus "GetClientRect (hwndMain, &Rect);" double dx, dy; dx=Rect.right/2; //x-Achse bei halber Pixellaenge in x-Richtung dy=Rect.bottom/2; //y-Achse bei halber Pixellaenge in y-Richtung HDC hdc ; PAINTSTRUCT ps ; InvalidateRect (hwndMain, NULL, TRUE) ; hdc = BeginPaint (hwndMain, &ps) ; SetViewportOrgEx(hdc, dx, dy, NULL); //Verschiebung des Fensternullpunkts ...
Jedoch muss ich jetzt jedesmal die Koordinaten der Mausclicks umständlich umrechnen, weil die Nullpunktverschiebung erst in einem Unterprogramm stattfindet und somit die Koordinaten der Clicks sich noch auf den alten Fensternullpunkt oben linke im Fenster beziehen...
Ich habe keine Ahnung wie ich in meinem normalen Anwendungsfenster den Nullpunkt gleich zu beginn an verschieben kann, wenn ich meinen Quellcode aus dem Unterprogramm hier einfüge:
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { char zeilentext[80]; POINT punkt; switch (msg) { /*@@3->@@*/ case WM //hier füge ich meinen Quellcode ein... z.B. SetViewportOrgEx(hdc, 500, 500,NULL);
passiert leider überhaupt nichts, ich lasse mir oben im Fenster die Koordinaten anzeigen aber es sind immer noch die alten.
Hoffe ihr könnt mir helfen, komme einfach nicht vorwärts und es hängt nur an dieser einen Stelle.
Viele grüße
Incster
-
Ich würde das umgekehrt machen und beim Zeichnen berücksichtigen, dass dein Nullpunkt woanders liegt. Ist ja jetzt nicht schwierig, beim Zeichnen einen Offset draufzurechnen.
-
Die MFC macht das an der Stelle relative geschickt.
Bau Dir eine Funktion PrepareDC. Sie setzt den Mappingmode und die ViewPorts etc.
Den DC benutzt Du dann beim Zeichnen. Und wen ein Mausklick erfolgt, dann besorghst Du dir den Fenster DC, rufst Dein PrepareDC auf und kannst mit LptoDp und DPtoLP Deine Punkte im Fenster in Koordinaten umrechnen.
Nicht vergessen den DC wieder freizugeben.