Zeichnen in ein Dialog - Dicke des "Blauen" Streifens
-
Hi Leutz,
ich habe folgendes Problem. Ich möchte innerhalb eines Dialoges, welches in meiner SDI-Anwendung aufpoppt, geometrische Objekte anzeigen lassen. Dazu habe ich ein CPictureCtrl in das Dialogfeld eingefügt. Innerhalb der Dialogfeldklasse frage ich mit GetWindowRect(&Global_Rect) die Bildschirmkoordinaten des Dialoges und zusätzlich noch die Bildschirmkoordinaten des CPictureCtrl ab, in die die Zeichnung integriert werden soll. Wenn ich nun mit MoveTo und LineTo das Objekt zeichnen möchte, so ist meine Darstellung nicht "mittig" in Bezug zu dem CPictureCtrl, obwohl ich den Schwerpunkt bestimmt habe. Spaßeshalber habe ich einige Linien gezeichnet, vom "Ursprung" des Systems meines CDC-Pointers für das Dialog. Das stimmt aber anscheinend nicht mit der linken,oberen Ecke des Dialoges überein, sondern beginnt quasi erst dort, wo der blaue Rand (wo zum Beispiel der Name der Anwendung steht) sowohl oben als auch an der Seite beendet ist. Solange ich nicht die Koordinaten des Nullpunktes für die Zeichenebene in Bezug auf die linke, obere Ecke des Dialoges bestimmen kann, solange kann ich meine Zeichnung nicht richtig zentrieren.
Frage:
Gibt es eine Möglichkeit, die Dicke des oberen und linken Randes zu bestimmen?
Bzw. Kann ich die Position des Punktes (0,0)-> der Zeichenebene dc in Bezug auf
die linke, oberere Ecke des Dialogfeldes bestimmen???Hier noch der verwendete Code:
CRect Global_Rect,Window_Rect; GetWindowRect(&Global_Rect); // globale Koordinaten des MainWindows //Koordinaten des CPictureCtrl CWnd* wndRect2 = GetDlgItem(IDC_DISPLAY_OPERATOR); wndRect2->GetWindowRect(&Window_Rect); //linke, obere Ecke des CPicturectrls in Bezug auf das Dialog-KS int xOrigin = Window_Rect.left-Global_Rect.left; int yOrigin = Window_Rect.top-Global_Rect.top; //Bestimmung des Mittelpunktes des Unterfensters ==> liegt um die Dicke //des blauen Streifens oben zu tief und um die Dicke des blauen Streifens //links zu weit rechts double X = ((Window_Rect.right-Window_Rect.left)/2)+ xOrigin; double Y = ((Window_Rect.bottom-Window_Rect.top)/2)+ yOrigin;Edit by Estartu: Code-Tags
-
Fenster werden normalerweise in eine Client-Area und eine Nonclient-Area unterteilt.
Clientarea: Dort zeichnen sich normalerweise die Anwendungen und es erfolgt die Interaktion der Anwendung mit dem Benutzer ( z.B. durch WM_PAINT )
Nonclient-Area: Der Bereich des Fensters, der z.B. von der Titelzeile und dem Fensterrahmen verwendet wird und normalerweise von Windows gezeichnet wird.
Der Ursprung der Zeichenfläche für einen DC der Client-Area ( z.B. CClientDC oder CPaintDC ) ist immer die linke obere Ecke des Clientbereiches. Die Größe des Client-Bereiches kannst du mit GetClientRect() ermitteln. Diese Funktion liefert dir Client-Koordinaten.
Die Position des Fensters auf dem Desktop ( linke obere Ecke der Nonclient-Area ) kannst du mit GetWindowRect() ermitteln. Dies liefert dir die Position des Fensters in Screen-Koordinaten.
Mehr darüber lesen kannst zu z.B. hier:
About Windows:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/aboutwindows.aspKoordinatensysteme unter Windows
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/cordspac_0jg3.aspDie Größe der Nonclient-Area wird durch die Nachricht NC_CALCSIZE bestimmt und kann bei einem Fenster mit "blauem" Rahmen durch folgende Funktionen ermittelt werden:
GetTitleBarInfo()
AFAIK: GetSystemMetrics( SM_CYBORDER ) + GetSystemMetrics( SM_CYCAPTION )
-
Vielen Dank für Deine Antwort. Leider bin ich noch nicht 100% am Ziel. Ich kann sehr wohl mit GetClientRect, die Größe meines Client-Areas bestimmen, aber eben leider nicht im Bildschirmkoordinatensystem, sondern nur lokal. Wenn ich davon ausgehe, dass der linke und rechte Rand jeweils gleich groß ist, kann ich aus der Differenz zwischen der Non-Clientbreite und der Clientbreite und anschließender Teilung durch 2 die linke Koordinate des Non-Clientbereiches bestimmen. Gehe ich weiterhin davon aus, dass auch der untere Rand identisch zum linken und rechten Rand ist, dann kann ich auch die zweite Koordinate bestimmen. Wie gesagt, solange die Annahmen (Dicke_links = Dicke_rechts = Dicke_unten) stimmen, ist alles in Butter
.Der Befehl GetTitleBarInfo() funzt irgendwie net. Ich rufe ihn mit dem Pointer auf das aktuelle CWnd auf, aber da meldet der Compiler, dass die Funktion kein Bestandteil der Klasse CWnd ist??? Liegt das wieder an Einstellungen, die in der stdafx.h (bzgl. der Kompatiblität für andere Windowsversionen) gemacht werden??

-
Es gibt da noch zwei Funktionen namens ScreenToClient und ClientToScreen damit komme ich eigentlich immer weiter.
-
Achso, noch was: GetTitleBarInfo() ist eine API Funktion (und damit Global) und kein Member von CWnd.