Punkte & Linien auf einem (OffScreen) Bitmap malen

Hallo,

ich arbeite mit Visual C++ 6 -MFC. Ich schreibe gerade an einer Diagramm-Funktion, die extrem viele Datenpunkte auf einem dafür eigentlich viel zu kleinen Display ausgeben soll. Es kommt auch nicht darauf an, dass man die einzelnen Punkte unterscheiden kann, vielmehr kann man aus der Gesamtform des dann fast schwarz gefüllten Datenbereiches die gewünschte Information ablesen.

Wenn ich diese Datenpunkte nun in einer OnPaint Funktion einzeln male, dann dauert das viel zu lange, da sich auch sehr viele Datenpunkte auf dem kleinen Display überdecken! Daher kam ich auf den Gedanken, die Daten nicht direkt auf den Screen auszugeben, sondern sobald sie generiert sind in ein Bitmap zu malen und dieses Bitmap in der OnPaint dann auf den Bildschirm auszugeben/kopieren.

Dieses Bitmap sollte somit die ganze Zeit in Benutzung sein und es werden regelmäßig neue Punkte darauf gesetzt.

Jetzt die Frage dazu:
Wie erstelle ich ein solches Bitmap?
Bei
CBitmap bmp = CreateCompatibleBitmap(&dc, Breite, Hoehe);
habe ich das Problem, dass ich diesen Befehl gerne außerhalb der OnPaint-Funktion aufrufen würde und ich somit erstmal keinen dc habe. Muss ich mir der dann vorher mit CClientDC erstellen?
Und wenn ich dann ein Bitmap habe, wie kann ich dann so darauf malen, dass die Punkte im Bitmap gespeichert bleiben?
Oder ist für meine Anwendung etwas anderes als ein Bitmap besser geeignet?

Ich hoffe ich habe mich verständlich ausgedückt.
Vielen Dank an alle, die bis hier gelesen haben!
Freue mich auf Anregungen!
Gruss
Martin

Hallo,

Bei
CBitmap bmp = CreateCompatibleBitmap(&dc, Breite, Hoehe);
habe ich das Problem, dass ich diesen Befehl gerne außerhalb
der OnPaint-Funktion aufrufen würde und ich somit erstmal
keinen dc habe. Muss ich mir der dann vorher mit CClientDC
erstellen?

Hallo,

wozu soll das Ding kompatibel sein? Wenn es der Bildschirm ist, kannst du dir ja mit GetDC (0) jederzeit einen DC besorgen.

Gruss Reinhard

Hallo Reinhard,

die GetDC() Funktion war mir so bis jetzt nicht bekannt.
Funktioniert aber prima!
Nur hilft es mir noch nicht, die Punkte in mein Bitmap zu malen.
Im Grund bräuchte ich eine Funktion, wie:

CBitmap::MoveTo(x1,y1);
und
CBitmap::LineTo(x2,y2);

Gruss
Martin

Hallo,
so oder so ähnlich müßte es gehen.
Gruß Tobias

CBitmap MemoryBitmap;

// BITMAP ERZEUGEN

CDC\* dc = GetDC();
CDC MemoryDC;

MemoryDC.CreateCompatibleDC(dc);
MemoryDC.SaveDC();

MemoryBitmap.CreateCompatibleBitmap(dc, r.Width(), r.Height());

MemoryDC.RestoreDC(-1);
MemoryDC.DeleteDC();

// PUNKTE MALEN

CDC\* dc = GetDC();

CDC MemoryDC;
MemoryDC.CreateCompatibleDC(dc);
MemoryDC.SaveDC();

MemoryDC.SelectObject(&MemoryBitmap);

// hier deine Punkte malen.

MemoryDC.RestoreDC(-1);
MemoryDC.DeleteDC();

// BITMAP AUSGEBEN

CDC\* dc = GetDC();

CDC MemoryDC;

MemoryDC.CreateCompatibleDC(dc);
MemoryDC.SaveDC();

MemoryDC.SelectObject(&MemoryBitmap);

dc-\>BitBlt(r.left, r.top, r.Width(), r.Height(), &MemoryDC, 0, 0, SRCCOPY);

MemoryDC.RestoreDC(-1);
MemoryDC.DeleteDC();