Zu viele DC's



  • Ich hab ne Mini-Grafikanwendung geschrieben. Und jedesmal wird ein neues DC erstellt. Nach ca. 1000 Aufrufen ist das Programm aber meist überlastet und stürzt ab, und der Windowsspeicher ist auch gleich voll.

    Wie kann ich das Problem anders lösen?

    Ich mach das im moment so:

    void CPaintDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    	// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
    	if((nFlags & MK_LBUTTON) == MK_LBUTTON)
    	{
    		if(point.x<=grenze+dicke/2)
    			point.x=grenze+dicke/2;
    		if(m_iPrevX<=grenze+dicke/2)
    			m_iPrevX=grenze+dicke/2;
    
    		CClientDC dc(this);
    		Pen.CreatePen(NULL,dicke,RGB(r,g,b));
    		CPen* pOldPen = dc.SelectObject(&Pen);		
    		dc.MoveTo(m_iPrevX,m_iPrevY);
    		dc.LineTo(point.x, point.y);
    		dc.SelectObject(pOldPen);
    
    		m_iPrevX=point.x;
    		m_iPrevY=point.y;
    	}
    	CDialog::OnMouseMove(nFlags, point);
    }
    

    Ein "CClientDC dc(this)" kann man ja leider nicht als Membervariable erstellen. Habt ihr ne Idee?



  • Meinst du nicht, dass es eher an deinem Pen liegt? Du rufst jedesmal Create auf, zerstörst den erstellten Pen aber nie ...



  • Aloha,

    das Problem ist nicht die DC, sondern die unendlichen Pens, die Du erschaffst.

    Hast Du Win 2k oder XP kannst Du über den Taskmanager schön beobachten, wie Du Dir selbst ins Knie schießt. 🙂

    Schau Dir mal die Registerkarte GDI-Objekte an, die Anzahl sollte immer dann ansteigen, wenn Du den linken Button der Mause drückst und dieselbe bewegst.

    Der Pen muß gelöscht werden mit

    Pen.DeleteObject();
    

    Grüße

    BOA



  • Mist, zu langsam....

    Allerdings könnte man mal mit ReleaseDC auch mal die DC am Ende löschen.
    Da bin ich mir aber net sicher, ob die nicht automatisch gelöscht wird, wenn die Funktion zu Ende is... 😕

    Naja, lösche erstmal die Pens und beobachte die GDI-Objekte.

    Grüße

    BOA



  • Es liegt an den Pens:

    MSDN schrieb:

    The CClientDC class is derived from CDC and takes care of calling the Windows functions GetDC at construction time and ReleaseDC at destruction time. This means that the device context associated with a CClientDC object is the client area of a window.



  • Guter Mann,

    dann schließt sich DC aus. Also, hau wech die Pens....

    Wie gesagt öffne mal parallel den Taskmanager und beobachte die GDI-Objekte vor und nachdem Du

    Pen.DeleteObject()
    

    eingefügt hast.

    Grüße

    BOA



  • DANKE, hat funktioniert:)
    Darauf hätte ich ja auch selbst kommen können 🙄


Anmelden zum Antworten