imaginäre Context Devices



  • Hi.

    Also ich wollte mal fragen, ob es die Möglichkeit gibt, dass ich quasi zwei CDC bemale, aber nur einen sehe.
    Ich will quasi CDC1 sehen und dann auf CDC2 malen/schreiben. Erst wenn ich mit CDC2 fertig bin, soll der aktiv werden und dann CDC1 dieser imaginäre. Hab dieses Prinzip mal in Delphi kennengelernt.
    Hoffe ihr habt meine Frage verstanden. 🕶



  • Stichwort: MemoryDC.

    EDIT: Ooh, es schein, MFC hat das gar nicht als Klasse vorgesehen.

    Schau dir das mal an:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_CDC.3a3a.CreateCompatibleDC.asp

    EDIT2: Und du musst unbedingt dran denken, dass du den erst benutzen kannst, wenn du eine Bitmap der gewünschten Größe eingewählt (selected) hast.
    Sonst ist der DC 1x1 Pixel groß.



  • also, ich wollte etwas haben, das in etwa dem entspricht:

    void CMyClassView::OnDraw(CDC* pDC)
    {
    	CMyClassView* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    
          // Device wird erzeugt
             CDC dc;
    
             dc.Rectangle(...);
             // Device beschreiben/malen etc.
    
          // aktuellen Device laden
             pDC->LoadDevice(dc); // eine ähnliche Funktion suche ich
    }
    

    Meine Absicht ist es, dass ich erst im Hintergrund male und dann erst das Ergebnis ausgebe, damit ich beispielsweise "Flackern" verhindere.



  • Ja, das kannst mit Memory DCs machen.

    Du malst in dem MemDC und dann wenn du fertig bist, kopierst du alles in dein WindowDC mit einem BitBlt.



  • ok, das klingt logisch. ich habe das auch versucht, aber es wird nur ein weißer Bildschirm bei folgendem Code angezeigt:

    void CMyClassView::OnDraw(CDC* pDC)
    {
    	CMyClassDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    
      // Rahmen zeichnen
    	int marginLeft = 50;
    	int marginTop = 30;
    
    	int height = 870 + marginTop;
    	int width = 615 + marginLeft;
    
    	CDC memoryDC;
    	memoryDC.CreateCompatibleDC(pDC);
    
    	memoryDC.Rectangle(marginLeft,marginTop, width, height);
    
    	pDC->BitBlt(0, 0, 2000, 2000, &memoryDC, 0, 0, NOTSRCCOPY);
    
    }
    

    Wahrscheinl. ist das einfach noch ein syntaktischer Fehler, oder?!



  • kann mir hier denn echt keiner helfen???


Anmelden zum Antworten