Auf Bitmap zeichnen

Mr_P1nk

Grünschnabel
Also mein Problem ist, das ich gerne eine Bitmap darstellen würde (Landkarte) und darauf zeichnen kann (Weg darstellen).

Meine Funktionen:

Code:
void CTestDlg::OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct )
   {
     if ( nIDCtl == IDC_STATICMap )
     {
   	HDC	hdcImage = CreateCompatibleDC( lpDrawItemStruct->hDC );
   
   	HBITMAP hbmOld = (HBITMAP)::SelectObject( hdcImage, m_Bitmap );
   
   	BitBlt( lpDrawItemStruct->hDC, 0, 0, 660, 540, hdcImage, m_lox, m_loy, SRCCOPY );
   
   	SelectObject( hdcImage, hbmOld );
   	DeleteDC( hdcImage );
   
   	return;
     }
   }

Code:
 void CTestDlg::OnBUTTONShowData() 
   {
   
   	m_Bitmap.LoadBitmap(IDB_Map);
   
   	m_lox = 0;
   	m_loy = 0;
   
   	m_map.Invalidate();
   
   	CClientDC dc(this);
   	CPen lblackpen(PS_SOLID, 1, RGB(255, 0, 0));
   	dc.SelectObject(&lblackpen);
   	CBrush lwhitebrush(RGB(0, 255, 255));
   	dc.SelectObject (&lwhitebrush);
   
   	int xkoord = 400;
   	int ykoord = 400;
   
   	dc.Rectangle(xkoord, ykoord, xkoord + 50, ykoord + 30);
   	dc.TextOut(xkoord+20, ykoord+5, "Hi");
   
   	UpdateData(false);
   }

Das Problem ist nur das die Bitmap immer über dem gezeichneten liegt, egal in welcher Reihenfolge das bitmap darstellen und zeichen aufgerufen wird. Gibts da irgendwo eine Einstellung mit der ich das festlegen kann oder geht das auf diese Weise prinzipiell nicht.

Ich arbeite in MFC ... sorry hab erst nachher gesehen das dafür ein eigenes Topic gibt
 
Du musst das Zeichnen einfach zusammen machen; also nach dem BitBlt die Linien auf den (C)DC malen. OnDrawItem ist bereits der richtige Ort dafür.
 
Danke für die schnelle Antwort. Das hat auch so geklappt.

Allerdings hab ich jez das Problem, das wenn ich ein 2tes m_map.Invalidate() aufrufe eine Fehlermeldung kommt (Debug Assertion Failed). Mir gehts dabei darum das ich die koordinaten ändern will. Das liegt aber nicht am darüber zeichnen, das war vorher auch schon so nur is es mit nicht aufgefallen.

p.s.: kann man vielleicht auch irgendwo einen zoomfaktor einstellen?
 
Zuletzt bearbeitet:
Wenn du die Assertation bekommst, bei welchem Befehl war er da grade? Ein übliches ASSERT ist bei einem Invalidate, dass das HWND ungültig ist. Oder bei OnDrawItem die Basisklassen-Implementation aufgerufen wird.

Du kannst einen Zoomfaktor mit StretchBlt einrichten. Allerdings musst du hier aufpassen: Wenn der überlappende (bzw. nicht direkt dargestellte Bereich) wesentlich grösser wird als der angezeigte, machen manche Grafikkartentreiber nicht mit bzw. beim StretchBlt passiert nichts mehr. Ich meine, bei 16fach wäre Schluss gewesen.
 
Ich weiss nicht genau bei welchem Befehl er da is, wenn ich debugge komm ich zu irgendwelchen Assembler Befehlen und dann kommt auf einmal die Fehlermeldung
 
Beim Debuggen müsstest du einen Call Stack oder ähnlich genannt finden. Der zeigt einem an, innerhalb welcher Routine welche andere Routine aufgerufen wird und so weiter. Wenn du dort von der Assembler-Stelle ein bisschen nach oben gehst, müsste er irgendwo zu einem Code-Teil von dir kommen.
 
Danke ... ich bin jetzt draufgekommen. Es war einfach weil ich die Bitmap ein 2tes mal geladen habe.

Und das Zoomen geht auch. thx für deine hilfe
 
Zurück