Eine Benötigte Ressource ist nicht verfügbar



  • Hallo!

    Ich zeichne ziemlich viel auf einem CView-Objekt und erhalte relativ schnell die obige Meldung, oder einen ASSERT-Error, bei CDC->m_hDC==NULL.

    Woher kommt das und wie kann ich das beheben?

    Ich tippe darauf, daß es ein Problem gibt, weil ich so viel zeichne, weiß es aber nicht! Würde mich aber sehr über eine Hilfe freuen!

    Gruß, Tobias



  • Hi,

    also zuerst solltest du überprüfen, ob du auch alle Resourcen (Dev-Contexte, Pens, Object usw.) wieder richtig freigibst.

    Dann besteht auch noch ein Unterschied, ob du in Antwort einer WM_PAINT Nachricht zeichnest(dort ist der Context ja schon eingerichtet), oder an anderer Stelle.

    Und für häufiges Zeichnen gibt es dann noch die Möglichkeit, einen "dauerhaften" Context zu erstellen, der stets dem Fenster gehört. Das musst du dann bei der Registration der Fensterklasse angeben.
    Stichwort: CS_OWNDC



  • hi,

    kann gut sein, daß ich das nicht mache!

    Wie gibt man die denn wieder frei??

    Gruß, Tobias



  • ich mache ziemlich häufig sowas wie:

    pDC->SelectObject(...)

    Muß man diese Pens auch freigeben?
    Wenn ja, wie geht das?

    Ich kenne nur ReleaseDC(...)

    DANKE!

    Gruß, Tobias



  • Mit SelectObject() erstellst du keine Objecte.
    Sondern mit den GDI Create* Funktionen.
    Oder mit GetStockObject(), obwohl die ja dann nicht manuell freigegeben werden müssen.

    Freigeben geht mit DeleteObject(), du musst es aber vorher "entwählt" haben

    MSDN schrieb:

    Do not delete a drawing object (pen or brush) while it is still selected into a DC.

    (mit SelectObject das vorherrige Objekt wiederwählen)



  • ok, also muss ich da nichts tun?
    Aber:
    Warum hab ich dann nach einigen Neuzeichnungen (vielleicht 20) diese Meldung?



  • Das Beste wird wohl sein, du kopierst mal deine Zeichenroutine mit Funktionskopf( OnPaint ???) und wodurch sie aufgerufen wird, hier rein. Sonst kann man nur raten.



  • hi, das ist einigermaßen aufwendig, da ich viele Objekte, Klassen, etc. verwende.
    Aber:
    Im Großen und Ganzen wird zuerst ein Bild mit Stretchlt gezeichnet und dann kommen 3 Funktionen, die ziemlich gleich aufgebaut sind:
    (werden von OnDraw() aufgerufen!)

    // Punkte zeichnen
    void CNodeManagerView::OnDrawPoints(CDC* pDC) {
    	pl = db->rs->p;
    	check = showP & SHOW;
    	if( check==0 ) return;
    	for(int i=0;i<pl->getnPunkte();i++) {
    		p   = pl->getPunkte(i);
    		if( select->countPoint(p) ) {
    		  cp = getCanvasPixel( getImageFromProzent(p) ); // Umrechnung
    		  if( selt==DSP && seli==i ) pDC->SelectObject(&cbPointS);
    	   	  else                       pDC->SelectObject(&cbPoint);
    		  if( !rangeTest( cp.x, cp.y, cW, cH ) ) continue;
    		  // Knoten malen
    		  drawPoint(cp,pDC);
    		}
    	}
    }
    

    Unschwer zu erkennen ist, daß ich sehr oft SelectObject aufrufe!
    Ich denke, daran könnte gut ein Haken liegen.
    In der Funktion drawPoint wird nur eine Ellipse gezeichnet:
    pDC->Ellipse

    Hilft Dir das irgendwie dabei mit zu helfen??

    Gruß, Tobias



  • Hallo,
    ich habe das gleiche Problem und brauche dringend Hilfe.

    http://www.c-plusplus.net/forum/viewtopic.php?t=91007


Anmelden zum Antworten