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.aspEDIT2: 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???