ERLEDIGT
JA
JA
ANTWORTEN
16
16
ZUGRIFFE
672
672
EMPFEHLEN
-
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?
-
ähhhh, ich meinte natürlich ein CPaintDC DC(this);
-
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).
-
Ja, ich habs selbstständig gemacht.
Jetzt klappt es. Vielen dank.
-
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.Geändert von Endurion (09.02.05 um 14:23 Uhr)
-
Ok, vielen dank, ich bin schon einen ganzen Schritt der Lösung näher.
Hab das so gemacht:
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
CRect clrect;
ImageControl.GetWindowRect(&clrect);
ScreenToClient(&clrect);
ValidateRect(clrect);
CPaintDC DC(this);
delete pDC;
}
Aber es war doch zu erwarten das was nicht klappt
Also, erstmal (ich denke das ist das kleinere Problem) zeigt er mir am Anfang das Bild nicht, erst nach einem durchlaufen der OnPaint Funktion.
Das schlimmere aber ist, das er mir einen Assert ausgibt nach dem drücken des OK buttons, und zwar ist mein HWnd = NULL, also kommt u.a. ein assert in der wincore.cpp mit
ASSERT(hWnd != NULL);
Tja, da stehe ich nun....
-
Ahh, den fehler findet man immer dann raus, nachdem man schon gepostet hat!
Also der assert kam deswegen, weil ich den modify style gemacht habe... ohne ihn funktioniert aber alles auch ziemlich gut, wozu brauche ich es überhaupt?
-
Klappt alles!
Ach, laß uns regenbogen malen und bunte pillen schlucken!
Vielen dank Endurion!
Das war ne schwere Geburt!
Also wenn ich das ImageControl.Invalidate() weglasse, wird auch am anfang das Bild angezeigt.
So sieht der fertige Code aus:
void CDevice::OnPaint()
{
CWnd *t= GetDlgItem(IDC_Image); //Pointer auf das Static Feld IDC_Image holen
CDC *pDC = new CClientDC( t ); //CDC dem Pointer zuweisen
CRect imagesize;
t->GetWindowRect(imagesize);
t->ScreenToClient(imagesize);
CPaintDC DC(this);
Picture.Show(pDC, imagesize ); // show the picture
CRect clrect;
ImageControl.GetWindowRect(&clrect); //Koordinaten holen...
ScreenToClient(&clrect);//..und Umrechnen
ValidateRect(clrect);
delete pDC;
}
-
Was machst du denn da innerhalb der OnButtonxxx-Routine? Da musst du ja irgendwas aufrufen, das kein HWND hat.
-
Nun, da der Assert nach dem OK Button kam, meinst du wahrscheinlich diesen...
tja, da war nix, oder halt nur das Windows standart OnOk();
Aber wie gesagt, es muss an dem modify style aufruf gelegen haben
Ähnliche Themen
-
Air/Flex-Anwendung aus einer anderen Air/Flex-Anwendung heraus starten
Von Julian Maicher im Forum Adobe Flex & AIRAntworten: 1Letzter Beitrag: 07.01.10, 15:01 -
(c++)Probleme beim Verwenden einer Bibliothek in einer Windows Forms Anwendung
Von SchindlerD im Forum C/C++Antworten: 6Letzter Beitrag: 31.05.07, 12:07 -
Grafik über einer anderen Grafik mit sensitiven verweisen bewegen
Von matthoz im Forum Javascript & AjaxAntworten: 12Letzter Beitrag: 20.06.06, 19:28 -
Permanentes Aktualisieren einer Seite?
Von mhribernik im Forum PHPAntworten: 10Letzter Beitrag: 22.07.05, 09:58 -
[Visual C++] Standard-Schriftgröße eines dialogbasierten Programms
Von smallone im Forum VisualStudio & MFCAntworten: 4Letzter Beitrag: 18.04.04, 20:09





Zitieren
Login






