Grafik im Dialog aktualisieren wenn Dialog druch andere Fenster überdeckt wird?



  • Habe ein Dialog, in dem ich eine Grafik zeichne.

    Ich will nun die grafik altuallisieren wenn sie durch andere fenster üer deckt wurde, oder das dialog vom hinter grund in vordergrund kommt etc.

    Welceh message wird aufgerufen wenn sich sowas ändert ???



  • OnPaint() wird aufgerufen



  • hmm super das geht schonmal:)

    aber wen ich das fenster nun aufm bilschrim rumschiebe.. wird es immer aktualisiert, obwohl die grafik eigentlich nimmer neu gezeichent werden müsste wie kann man das abfragen??



  • Also ich habs nicht ausprobiert, aber ich glaube, Windows muss trotzdem neu zeichnen, sonst hast du ein leeres Fenster.

    Du kannst es aber ausprobieren und bei der Nachricht WM_SIZE (OnSize()) eine Variable setzen zB.:
    m_bSizing = true;
    und im OnPaint
    if(m_bSizing)
    {
    Neuzeichnen();
    }
    m_bSizing = false;

    Dann siehst du ja was passiert



  • Fast richtig. Du müsstest die Methoden OnSizing()+OnSize() (für Größenänderungen) bzw. OnMoving()+OnMove() (für Bewegungen) implementieren, um das Zeichnen zwischenzeitlich abzuschalten (die erste wird jeweils während der laufenden Operation aufgerufen, die zweite nach der Änderung):

    void OnSizing(UINT nSide,LPRECT pRect)
    {
      m_sizing=true;
      CWnd::OnSizing(nSide,pRect);
    }
    void OnSize(UINT nType,int cx,int cy)
    {
      m_sizing=false;
      CWnd::OnSize(nType,cx,cy);
    }
    void OnPaint()
    {
      if(m_sizing)
      {
        //gerade in Größenänderung - nur Rahmen o.ä. zeichnen
      }
      else
      {
        //normale OnPaint()-Bearbeitung
      }
    }
    


  • ók verstanden, müsste ich das gleiche dann mit onMove +onMoving machen??

    weil ich die größe nicht veränder , sonder nur da fenster verschiebe!!



  • void CDlgWorkflow::OnPaint(){
    
    	if(!m_Moving)
    		m_Graphic->update();
    
    }
    
    void CDlgWorkflow::OnMove(int x,int y){
    
    	m_Moving=false;
    
    	CDialog::OnMove(x,y);
    }
    void CDlgWorkflow::OnMoving(UINT nSide,LPRECT lpRect){
    
    	m_Moving=true;
    
    	CDialog::OnMoving(nSide,lpRect);
    }
    

    Trodzem flattern
    P.S. WM_ON_MOVE() und WM_ON_MOVING() hab auch implementiert


Anmelden zum Antworten