Recheck auf eingelesenes Bitmap zeichnen
-
Hallo,
ich möchte auf ein Bitmap, welches ich in eine PictureBox lade, ein Rechteck bzw. verschiedene grafische Elemente mit der Maus zeichnen. Die Anwednung soll dialogbasierend sein.
Ich hab mit die Funktionen mousmove, lbuttondown und lbuttonup zunutze gemacht. Wenn ich den linken button drücke, wird ein flag gesetzt. Ist diese Flag true, wird in der Funktion OnMouseMove zunächst das Bitmap in einen DC geladen. Auf diesen zeichne ich dann auch das Rechteck, basierend auf der aktuellen Mausposition. Bei lbuttonup setzt ich das flag auf false.
Das funktioniert irgendwie auch. Nur ist es sau langsam. Ich denke mal, weil ich ständig das Bild laden muss. Lade ich das Bild aber z.B. in der OninitDialog, dann bleiben alle Rechtecke erhalten. Im Prinzip will ich folgendes:
In der "mousemove"-Fkt soll auf eine zuvor geladenes Bitmap ein Rechteck gezeichnet werden. Das geht wohl so, dass ich das Rechteck in den selben DC male, in den ich das bitmap geladen habe. Danach wird der DC mit Bitblt in den DC der PictureBox kopiert. Richtig funktionieren tut das aber nicht. Wie gesagt, die alten Rechtecke bleiben sichtbar ....
Ich hoffe ihr könnt mir helfen. Bin nicht an dem Rechner mit dem Code. Also falls nötig kann ich morgen den code posten. Aber vielleicht wisst ihr ja auch so wie es geht bzw. was ich falsch mache !
-
Ok
ich versuche es mal zu präzisieren:Sobald die Funktion OnMouseMove ausgeführt wird, mache ich folgendes:
Ich lade ein Bitmap aus einer Datei:
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL,m_sFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); CBitmap pCBmp = CBitmap::FromHandle(hBitmap);
Dieses Bild lade ich dann in einen Speicher-DC:
CDC *pDC1 = this->GetDC(); CDC *dcMem = new CDC; dcMem->CreateCompatibleDC(pDC1); dcMem->SelectObject(pCBmp);
In diesen DC mal ich nun ein Rechteck:
dcMem->SelectStockObject(NULL_BRUSH); CPen lPen(PS_SOLID, 1, RGB(255, 0, 0)); dcMem->SelectObject(&lPen); dcMem->Rectangle(Rechteck) //CRect Rechteck wird vorher anhand der Mausposition bestimmt)
Anschließen kopiere ich den Speicher DC:
pDC1->BitBlt(0, 0,Picture.Width(),Picture.Height(),dcMem, 0, 0,SRCCOPY);
Wenn ich nun die Maus bewege, dann verändert sich das Rechteck so wie es soll. Das Problem ist, dass das ganz wirlich extrem langsam ist.
Ich denke mal, das liegt daran, dass ständig das Bild neu aus der Datei geladen wird. Also habe ich versucht, das Bild in der OnInitDialog zu laden. Dann geht zwar alles schneller, allerdings werden dann die alten Rechtecke nicht mehr gelöscht.
Gibt es eine Möglichkeit, das Bild irgendwie in den Speicher zu lesen, so dass ich bei jedem neuen Durchgang der OnMouseMove das original-Bild zur Verfügung habe und dann darauf "frisch" zeichnen kann ?