RedrawWindow() und Invalidate()



  • Hallo zusammen,

    habe mich lange durchs Forum gekämpft und nix wirklich passendes zu meinem Problem gefunden.

    WinXP Prof., MS C++ 6.0, MFC
    Zu meinem Problem:
    Ich habe eien SDI Anwendung und öffne mit Hilfe eines Menüpunktes einen Dialog.
    Aus diesem dialog heraus erstelle ich im Hauptfenster der SDI Anwendung einen dynamischen Button:
    void CMainFrame::OnEinstellungenDmpferchillerAnmelden()
    {
    if (m_Anmeldung.DoModal() == IDOK)
    {
    CHoverButtonEx* m_pMoveButton = new CHoverButtonEx;
    CHoverButtonEx* pMoveButton = m_pMoveButton;
    pMoveButton->Create("Name", WS_VISIBLE|BS_PUSHBUTTON|BS_BITMAP,
    CRect(110,50,200,150), this, 1);
    }
    }
    Es wird also beim Ordnungsgemäßen verlassen des Dialogs der Button erstellt.
    Wenn ich nun in der Task Leiste z.b. auf Windows Explorer klicke und meine SDI Anwenung nicht mehr zu sehen ist, und ich sie anschließend wieder aufrufe...dann sieht man den Button nicht mehr.Gleiches passiert wenn man das Fenster maximiert, oder die Größe verändert.

    Ich weiß ich muss irgendwie RedrawWindow() oder Invalidate() einbauen.
    Oder funktioniert es mit der OnPaint()???
    Ich weiß auch nicht wie/was ich dann da reinschreiben soll, oder wo ich es aufrufen kann.

    Ich weiß es hört sich bissl viel an...
    Vielen Dank für Eure Hilfe
    MfG Dippi



  • Ich weiß nicht, ob es etwas bringt, aber du solltest den Button nicht als lokale Variable lagern, sonst weiß nach Ende der Funktion niemand mehr, daß (und vor allem wo) er existiert:

    class CMainFrame
    {
      CHoverButtonEx* m_Button;
      void OnAnmelden();
    };
    
    void CMainFrame::OnAnmelden()
    {
      CAnmeldeDlg dlg;
      if(dlg.DoModal()==IDOK)
      {
        m_Button=new CHoverButtonEx;
        m_Button->Create(...);
      }
    }
    

    (Eventuell mußt du noch OnPaint überschreiben, um dort ein "if(m_Button)m_Button->Paint();" zu ergänzen)



  • Zuerst danke, so funktioniert das bisherige Programm genauso, aber mein Problem ist nicht behoben.

    Nochmal kurze Zusammebfassung:
    Wie kann ich bei einem Fenster(SDI Anwendung Hauptfenster) wenn es z.B. maximiert wird, es anschließend wieder "RedrawWindow"
    Problem, welches ich habe:
    Alle dynamisch erstellten Buttons verschwinden wenn man an der Fenstergröße spielt...

    Vielen Dank
    MfG Dippi



  • Du musst die in der Regel immer wieder neu zeichnen lassen.
    Würde vorschlagen, dass du in der WM_SIZE - Nachricht die Positionen neuberechnest und in der OnPaint()/OnDraw() - Methode deine Buttons zeichnest.
    Dann sind sie auch beim Maximieren wieder da.
    In der WM_SIZE - Nachrichtenbehandlungsmethode rufst du natürlich dann auch ein Invalidate() auf.


Anmelden zum Antworten