Grafik einer Dialogbasierten Anwendung aktualisieren

McGreg

Grünschnabel
Da bin ich wieder, mit meinem (hoffentlich) letzten Problem:

Ich habe durch die Klasse CPicture ein Bild ausgegeben, funktioniert super!

Wenn ich jedoch das Fenster durch andere verdecke und dann wieder aktiviere, ist der Inhalt weg.

Gibt es eine Funktion die aufgerufen wird, wenn das fenster aktiv wird (bei Dialogbasierten Anwendungen?)

Ich habe leider nichts vergleichbares hier im Forum gefunden.

Grüße,

McGreg
 
Dafür gibt es WM_PAINT (bzw. OnPaint). Pack das Bild-anzeigen da rein. Immer. Dann wird jedesmal, wenn dein Fenster neu gezeichnet werden soll, deine Funktion aufgerufen.
 
Hmm, irgendwie klappt es trotzdem nicht, ich habs so versucht:

void CDevice::OnPaint()
{
CWnd *t= GetDlgItem(IDC_Image);
CDC *pDC = new CClientDC( t );
CRect imagesize;
t->GetWindowRect(imagesize);
t->ScreenToClient(imagesize);


Picture.Show(pDC, imagesize ); // show the picture
UpdateData(FALSE);
}

leider kein Neuzeichnen :( was fehlt noch?
 
Innerhalb von OnPaint solltest du den CPaintDC verwenden, damit das hinter der Bühne richtig abläuft. Und wenn du den new-est, was du nicht machen solltest, musst du den da auch wieder deleten.
 
Ja, hab ich schon probiert.

ich hab schon am anfang ein PaintDC DC(new); reingemacht, dann mal in der Mitte, dann am ende... klappt alles nicht! Wenn ich einen Breakpoint in der Fkt setze und das fenster z.B. verkleinere und dann wieder aktiviere, geht er gar nicht in die Funktion rein, obwohl er doch musste, oder? Muss ich noch irgendwo was hinzufügen? bis jetzt habe ich halt in der *.h datei das
afx_msg void OnPaint();

und den obengenannten Code in der *.cpp datei.

Muss ich vielelicht bei dem Static Control Feld (dort wo die Grafik angezeigt wird) irgendwelche Eigenschaften verändern?
 
Hast du denn die OnPaint einfach selbst erstellt? Die solltest du über den Class Wizard (VS6) oder die Eigenschaftenseite (ab VS2k) einsetzen lassen.
Sonst hast du nur die Routine, aber keiner ruft die auf.
Du kannst die Funktion auch per Hand in die MessageMap nachtragen (oben in der .cpp, die eingegrauten Teile).
 
Ich weiß, meine Fragen nehmen kein ende:

Also, das mit Grafik aktualisieren klappt leider nicht so ganz :(
Wenn ich die App minimiere und dann aktiviere dann leutet die grafik kurz auf, ist aber dann gleich weg.

lasse ich aber das CPaintDC DC(this); aus der OnPaint funktion raus, wird die grafik IMMER aktualisiert, dafür sind aber alle anderen Steuerelemente des Dialogs nicht mehr zu sehen!


Ich glaub ich dreh langsam durch
 
Ich hab's befürchtet. Das WM_PAINT ist ja für den kompletten Dialog, während du die Bitmap in einem eigenen Child-Control des Dialogs darstellen willst. Eigentlich müsstest du eine Darstellroutine speziell für dieses Control machen: Wenn möglich, einen OWNER-DRAW-Stil setzen (beim Static SS_OWNERDRAW) -> Die Übersetzerdeppen haben "Besitzerzeichnung" draus gemacht. Dann kannst du ein OnDrawItem anlegen lassen; dort prüfen, ob jetzt deine Control neu gezeichnet werden muss, dann dort das Zeichnen machen. Da brauchst du dann auch kein CPaintDC mehr.
Wenn du das machst, brauchst du auch das OnPaint nicht mehr.

Eine Möglich sehe ich noch, am Ende von dem OnPaint wie es jetzt ist; den CPaintDC weglassen (dafür das alte nehmen), aber dafür ein ValidateRect mit dem Rect der Bitmap-Control aufrufen. Dann sollten auch die anderen Controls wieder auftauchen.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück