tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
16
ZUGRIFFE
672
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    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
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
     

  3. #3
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    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?
     

  4. #4
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
     

  5. #5
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    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?
     

  6. #6
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    ähhhh, ich meinte natürlich ein CPaintDC DC(this);

     

  7. #7
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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).
     

  8. #8
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    Ja, ich habs selbstständig gemacht.

    Jetzt klappt es. Vielen dank.
     

  9. #9
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    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
     

  10. #10
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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)
     

  11. #11
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    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....
     

  12. #12
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    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?
     

  13. #13
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    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;

    }
     

  14. #14
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Was machst du denn da innerhalb der OnButtonxxx-Routine? Da musst du ja irgendwas aufrufen, das kein HWND hat.
     

  15. #15
    McGreg McGreg ist offline Mitglied
    Registriert seit
    Jan 2005
    Beiträge
    18
    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

  1. Air/Flex-Anwendung aus einer anderen Air/Flex-Anwendung heraus starten
    Von Julian Maicher im Forum Adobe Flex & AIR
    Antworten: 1
    Letzter Beitrag: 07.01.10, 15:01
  2. Antworten: 6
    Letzter Beitrag: 31.05.07, 12:07
  3. Antworten: 12
    Letzter Beitrag: 20.06.06, 19:28
  4. Permanentes Aktualisieren einer Seite?
    Von mhribernik im Forum PHP
    Antworten: 10
    Letzter Beitrag: 22.07.05, 09:58
  5. Antworten: 4
    Letzter Beitrag: 18.04.04, 20:09