L
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