OnDraw erzeugt Exception



  • Hallo Experten!

    Habe eine SDI Anwendung mit FormView. In der OnDraw Methode wird nach ein paar Minuten Laufzeit eine Ausnhame erzeugt (bei FillRect()). CPP-Tutor.de machts aber genauso.

    void CabktoolView::OnDraw(CDC* pDC)
    {
    	// TODO: Fügen Sie hier Ihren spezialisierten Code ein, und/oder rufen Sie die Basisklasse auf.
    	int nSavedDC = pDC->SaveDC();    // Hier aktuellen Zustand des DCs retten
    
    	CBrush* pOldBrush;
    	CBrush green(RGB(0,255,0));
    
    	pOldBrush = pDC->SelectObject(&green);
    	CRect rect;
    
    	GetDlgItem(IDC_TEMP_BAR_0)->GetClientRect(&rect);
    	rect.DeflateRect(1,1,1,1);
    	CDC* dc = GetDlgItem(IDC_TEMP_BAR_0)->GetDC();
    	dc->FillRect(rect, &green);
    
    	pDC->SelectObject(pOldBrush);
    	pDC->RestoreDC (nSavedDC);       // Originalzustand wieder herstellen
    }
    

    Der Debugger bleibt hier in Zeile 2 stehen:

    _AFXWIN_INLINE void CDC::FillRect(LPCRECT lpRect, CBrush* pBrush)
    	{ ASSERT(m_hDC != NULL); ::FillRect(m_hDC, lpRect, (HBRUSH)pBrush->GetSafeHandle()); }
    

    Wer findet den Fehler? 🙄


  • Mod

    Kein Wunder:

    CDC* dc = GetDlgItem(IDC_TEMP_BAR_0)->GetDC();
    

    Das erzeigt jedesmal einen neuen DC. der niemals freigegeben wird.

    Das ist natürlich auch Quatsch, sich in OnPaint eines Views sich den DC eines anderen Controls zu besorgen und darin zu zeichnen.
    BTW: Dein Viewbekommt doch einen DC! Warum nimmst Du den nicht?

    Regel: Zeichne immer nur im OnPaint Handler des eigenen Controls.



  • Hallo Martin!

    Ja sowas konnte es ja nur sein.

    Am Anfang habe ich in meinem DC gezeichnet. Aber da stimmen die Koordinaten nicht!

    Folgende Situation: ich brauche eine einfache Progressbar, bei der ich die Farbe ändern kann und die durchgehend gezeichnet wird (siehe auch der andere, alte Thread von mir!). Also selbst ist der Mann und zeichnet sich ein Rechteck. Damit die Größe dynamisch bleibt habe ich ein PictureControl plaziert, welches sozusagen der Rahmen für den Balken wird.

    Jetzt stimmen aber die Koordinaten, welche im Editor unten rechts angezeigt werden, aus irgendeinem Grund nicht mit den Zeichenkoordinaten überein. Warum? ClientToScreen etc. habe ich schonmal gelesen.


  • Mod

    Dan solltest Du das Picture Control subclassen und dessen OnPaint benutzen.
    Und nicht im OnPaint des Views zeichnen.

    Jedes Control soll sich selbst zeichnen.

    BTW: Wegen dem anderen Thread.
    Bau mal ein Minisample und gib mir einen Link. Dann sehe ich mirmal an, warum der Progressbar in Klötzchen angezeigt wird.



  • Dann kann ich das "neue" PictureControl aber nicht mehr mit dem Editor im FormView platzieren oder?

    Das mit dem Link mach ich mal...


  • Mod

    protonmw schrieb:

    Dann kann ich das "neue" PictureControl aber nicht mehr mit dem Editor im FormView platzieren oder?

    Aber klar kannst Du das. Du musst das Control einfachnur subclassen. Dafür ist Subclassing ja da...


Log in to reply