DoModal() Dialoge werden nicht angezeigt, gehen irgendwie im Hintergrund auf...
-
Grüße an das Forum!
Da dies mein erster Post ist, erstmal an alle ein herzliches Hallo. Ich hab schon viel Hilfe hier gefunden, da ich vor einer Weile mit MFC angefangen habe, aber dennoch... Fragen über Fragen...Zum momentanen problem: Ich habe bei einer Dialog-basierten Anwendung 2 weitere Fenster, die über Buttons mit DoModal() aufgehen (sollen). Das tun sie aber erst, wenn ich den Tab-Key drücke. Sie gehen also irgendwie auf, werden aber nicht angezeigt. Es muss glaube ich irgendwie mit dem Neuzeichnen zusammen hängen, kann auch nicht an den Dialogen selbst liegen, da sich beide gleich verhalten, aber ich bin noch zu sehr Neuling, um zu wissen, was dahinter stecken kann.
In dem 'Haupt'-Dialog befindet sich ein static-Window, in das ich hineinzeichne. Komischerweise, nachdem da etwas hineingezeichnet wurde, gingen die anderen beiden Dialoge problemlos auf. Inzwischen ist das zeichnen ersetzt durch die Darstellung einer Bitmap. Seit dem gehen die beiden anderen fenster wieder nur 'im Hintergrund' auf.
Ich will jetzt nicht alle 40 Seiten des codes hier posten, aber wenn jemand evtl eine Vermutung hat, sagt mir bitte, was ihr sehen müsst, um das Problem zu finden.
Zumindest hier ist die OnPaint-Funktion des static-fensters, also als eigene Klasse und member vom Haupt-Dialog:
void CMyStaticWnd::OnPaint() { if (this->pm_BitmapCreated) { CDC dcBitmapBuffer; CClientDC dc (this); dcBitmapBuffer.CreateCompatibleDC( &dc ); dcBitmapBuffer.SelectObject (this->pm_Bitmap); dc.BitBlt (0, 0, this->m_arX, this->m_arY, &dcBitmapBuffer, 0, 0, SRCCOPY ); } }
(pm_Bitmap wird übrigends vom Hauptdialog aus erzeugt (ein Apfelmännchen
) und auch wieder gelöscht - und funktioniert soweit, aber vielleicht kann man da auch etwas verbessern(?).)
Vielleicht kann ja jemand aus der Ferne sagen, was bei den Dialogen falsch läuft, weshalb sie nicht so aufgehen, wie sie sollen.
Vielen Dank schonmal im Voraus,
beste Grüße
Tobi
-
eigentlich wenn du die OnPaint von CStatic überlädst wird die doch automatisch ein DC erzeugt, denn da steht eigentlich die Zeile
CPaintDC dc(this);
und das ist auch der einzige DC mit bzw auf dem du zeichnen kannst. Der CClientDC ist nicht zum zeichnen gedacht, ob dass dein Problem jetzt lösst kann ich nicht sagen, könnte noch was anderes sein.
Die Größe von deinem Zeichenbereich, also wenn es das ganze CStatic-Object ist bekommst du auch mit
CRect rect; GetClientRect(&rect);
-
Hallo CTecS,
vielen vielen Dank! Ja, am falschen DC hats gelegen! Supi supi
danke für die schnelle Antwort!
Und damit ist auch ein anderes (weniger gravierendes aber nerviges) Problem gelöst.
Und btw, die Größe von der Zeichenfläche hole ich mir schon mit GetClientRect(&rect) im OnInitDialog(), nach der wird dann ja auch das Feld angelegt, und die X/Y-Werte initialisiert.
hehe, so einfach gelöst, man muss nur wissen...
also nochmals Danke und viele Grüße,
Tobi