[GDI] Wie bekomme ich Grösse eines DCs?
-
Hi,
versuch mich gerade an der Grafikausgabe mit der WinAPI. Hab allerdings ein paar Probleme mit der Dokumentation. Im Netz hab ich ein paar gute Links gefunden, aber bei konkreten Problemen hilft's nicht weiter. Auch das MSDN ist mir da zu unübersichtlich, also ich finde einfach nicht was ich suche..
Mein Problem:
Ich habe ein HDC und möchte die Grösse des DCs herausfinden und dann darauf zeichnen. Allerdings nicht innerhalb WM_PAINT-Nachricht.(1) Wie erhalte ich die Größe des DCs usw.?
(2) Gibt's eine GDI-Referenz (außer MSDN) ?Danke,
don_basto.
-
don_basto schrieb:
Hi,
Mein Problem:
Ich habe ein HDC und möchte die Grösse des DCs herausfinden und dann darauf zeichnen. Allerdings nicht innerhalb WM_PAINT-Nachricht.Warum denn nicht?
Wird schwierig. Die WM-PAINT veranlaßt Windows, das Fenster neu zu zeichnen, einschließlich aller darin enthaltenen Zeichnungs-Elemente. Einen anderen Weg hat mir noch niemand gesagt, nicht einmal Petzold.
don_basto schrieb:
(1) Wie erhalte ich die Größe des DCs usw.?
Für gewöhnlich legst Du den Zeichenbereich (Client Area) selbst mit einer rect-Struktur fest. Wenn Du dann die Größe brauchst, mußt Du nur Deine eigenen Werte oder eben die Eintragungen aus der rect-Struktur verrechnen.
Im Zweifelsfall würde ich mal unter GetSystemMetrics() schauen.
-
Elektronix schrieb:
don_basto schrieb:
Hi,
Mein Problem:
Ich habe ein HDC und möchte die Grösse des DCs herausfinden und dann darauf zeichnen. Allerdings nicht innerhalb WM_PAINT-Nachricht.Warum denn nicht?
Weil ich darauf nich zugreifen kann, aber ich bekomme zum Zeichnen einen HDC, auf dem ich arbeiten kann. Das funktioniert grundsätzlich auch, im Moment sind noch ein paar Fehler drin.
Elektronix schrieb:
Wird schwierig. Die WM-PAINT veranlaßt Windows, das Fenster neu zu zeichnen, einschließlich aller darin enthaltenen Zeichnungs-Elemente. Einen anderen Weg hat mir noch niemand gesagt, nicht einmal Petzold.
Bei den MFC kann man, afaik, den DC irgendwo ändern, muss dann aber InvalidateXXX() für diesen Bereich aufrufen.
Elektronix schrieb:
don_basto schrieb:
(1) Wie erhalte ich die Größe des DCs usw.?
Für gewöhnlich legst Du den Zeichenbereich (Client Area) selbst mit einer rect-Struktur fest. Wenn Du dann die Größe brauchst, mußt Du nur Deine eigenen Werte oder eben die Eintragungen aus der rect-Struktur verrechnen.
Mir ist der Ansatz mit dem Clientbereich nicht klar, ich dachte der HDC zeigt nur auf einen Bereich des Fensters. Ausserdem hab ich auch kein Interesse in die Titelzeile etc. zu zeichnen.
-
Weil ich darauf nich zugreifen kann, aber ich bekomme zum Zeichnen einen HDC, auf dem ich arbeiten kann.
Wieso kannst Du auf den hDc nicht zugreifen?
Hier die gängige Methode:
hDC = BeginPaint(hWnd, &ps); { //entsprechender Code zu den Zeichenoperationen } EndPaint(hWnd, &ps);Das Ganze zu finden in
http://www.win-api.de/tutorials.php?tutid=4Mit MFC kenn ich mich nicht aus, ist ja schließlich auch ein API-Forum.
Der hDC zeigt auf einen Device-Context, also auf ein Ausgabegerät. In welchem Client-Bereich Du arbeiten willst, legst Du selbst fest. Dazu auch der Link.
Andere gute Tutorials gibt es unterhttp://www.henkessoft.de/C++/WinAPI/WinAPI_GDI/WinAPI_7_GDI.htm
-
Die größe des DCs bezogen auf den Display ist immer die horizentale und vertikale Auflösung des Displays. Das kannst du mit GetSystemMetrics() herausfinden. Du kannst zwar außerhalb einer WM_PAINT-Nachricht zeichnen, aber die Zeichnung ist dann nach einer neuen WM_PAINT-Nachricht weg. Es ist äußerst unsauber außerhalb von WM_PAINT zu zeichnen.
-
Meines Wissens nach gibt es für ein Fenster zwei DCs, den WindowDC und den ClientDC. Ich denke Du meinst den ClientDC, dieser ist genauso groß, wie die Clientarea des Fensters. Wie groß die ist kannst Du mit GetClientRect über das hWnd herausfinden. Bei Memory-DCs könntest Du evtl. auch über GetObject das Bitmap holen und die Breite und Höhe des Bitmaps sollte der des DCs entsprechen, da man den DC ja über das Bitmap resized.
Ob das mit dem Bitmap bei normalen Fenster-DCs auch funktioniert müsstest Du mal ausprobieren, da bin ich überfragt und im Moment auch zu faul für, um es auszuprobieren.
-
ein dc besitzt überhaupt keine größe! ein dc ist nur eine schnittstelle für die durchführung von grafikoperationen auf ein anderes objekt. wenn das andere objekt, wie in deinem fall der arbeitsbereich eines fensters ist, dann mußt du die größe mit GetClientRect() vom fenster holen. würdest du einen compatible-dc verwenden um damit in eine bitmap zu zeichnen, dann müsstes du die größe mit GetBitmapDimensionsEx() von der bitmap holen etc.
-
Danke für die Antworten.

Ich nahm an, dass ein DC eine Größe besitzen müsste, da im MSDN ClientDC und WindowDC unterschieden werden.
Ich habe in bei meiner Schnittstelle Zugriff auf ein HDC und ein HWND, so dass ich die darstellbare Größe über GetClientRect() herausbekomme.
Grüße,
don_basto.
-
[quote="Konfusius"]ein dc besitzt überhaupt keine größe! ein dc ist nur eine schnittstelle für die durchführung von grafikoperationen auf ein anderes objekt. wenn das andere objekt, wie in deinem fall der arbeitsbereich eines fensters ist, dann mußt du die größe mit GetClientRect() vom fenster holen. würdest du einen compatible-dc verwenden um damit in eine bitmap zu zeichnen, dann müsstes du die größe mit GetBitmapDimensionsEx() von der bitmap holen etc.[/quote]
so ist es