Rechtecke auf DIB zeichnen
-
Hallo,
ich schreibe ein C++ Programm mit MFC und habe eine Frage.Ich möchte auf einem DIB-Objekt Rechtecke und Kreise zeichnen
und diese mit dem DIB-Objekt zoomen.
Im folgenden code habe ich das zoomen von DIB-Objekt implementiert.
Anschließend
werden die Rechtecke gezeichnet. Jedoch wenn ich mein Programm starte
und versuch,
die Rechtecke zu zeichnen, verschwinden diese. Ich glaube sie werden in den Hintergrund verschoben.
Kann mir jemand sagen, wie ich die Rechtecke zoomen und über dem DIB zeichnen kann. Ich habe eine Funktion StretchBlt gefunden, weiß aber nicht, wie ich diese bei Rechtecken einsetzen muß und ob das die richtige Funktion ist.void CSecView::OnDraw(CDC* pDC) { FIBITMAP *pFIBitmap = (FIBITMAP*)(m_SecViewHandle[CString (m_tc)]); pDC->SetMapMode(MM_HIMETRIC); ::SetStretchBltMode(pDC->m_hDC, COLORONCOLOR); double dpiX = FreeImage_GetDotsPerMeterX(pFIBitmap), dpiY = FreeImage_GetDotsPerMeterY(pFIBitmap), sizeX, sizeY; int width = (int)FreeImage_GetWidth(pFIBitmap), height = (int)FreeImage_GetHeight(pFIBitmap); if( dpiX==0.0 ) dpiX = 72.0 * 100.0 / 2.54; if( dpiY==0.0 ) dpiY = 72.0 * 100.0 / 2.54; sizeX = m_Zoom * 100.0 * 1000.0 * width / dpiX; sizeY = m_Zoom * 100.0 * 1000.0 * height / dpiY; BYTE *pData = FreeImage_GetBits(pFIBitmap); // stretched ::StretchDIBits(pDC->m_hDC, // x-y-coord of destination upper-left corner 0, 0, // width-height of destination rectangle sizeX, -sizeY, // x-y-coord of source upper-left corner 0, 0, // width-height of source rectangle width, height, pData, // bitmap bits FreeImage_GetInfo(pFIBitmap), // bitmap data DIB_RGB_COLORS, // usage options SRCCOPY // raster operation code ); //******************************************************************** // Zeichnen von Rechtecken und Kreisen //******************************************************************** CBildTransformationDoc* pDoc = GetDocument(); CPen* alterStift = pDC -> SelectObject( pDoc -> gibStift()); CBrush* alterPinsel = pDC->SelectObject(pDoc->gibPinsel()); CPen MarkierungsStift ; MarkierungsStift.CreatePen( PS_SOLID , 5, RGB(128,0,0) ) ; // Markierungssatift: // Durchgezogen, dick, schwarz CObList * liste = pDoc->gibElementeDCT(); // Zeichnen aller Listenelemente POSITION pos = liste->GetHeadPosition(); CGrafikelement* element; while(pos != NULL) { element = (CGrafikelement*)liste -> GetNext(pos);//Element holen if (element ->markiert()) { // Element mit Markierungsstift zeichnen ... pDC -> SelectObject(&MarkierungsStift); element ->zeichne(pDC); // ... und Stift zurücksetzen pDC -> SelectObject( pDoc -> gibStift() ); } else element -> zeichne(pDC);// Element zeichnen } // Alte Gerätekontext-Objekte zurückladen pDC->SelectObject(alterPinsel); }
Die Funktion zeichne(pDC) befindet sich in meiner Doc, wo
die Klassen Rechteck und Kreis von CGrafikelement abgeleitet sind.
FreeImage ist eine Bibliothek zum Arbeiten mit Grafiken, sie spielt bei diesem Problem keine Rolle (glaub ich jedenfalls).Helft mir bitte.
Danke sehr.
Lika