Ich möchte ein Bitmap verwenden, um die aktuelle Ansicht Fenster zu lesen, machen einige Änderungen daran und geben die Bitmap auf die Ansicht zurück. Das Programm soll ein weißes Fenster lesen und vor diesem Hintergrund ein Quadrat zeichnen. Das Bild, das ich im letzten Fenster sehe, ist jedoch ein Quadrat in einem schwarzen Hintergrund.mfc Bitmap liest eine vollständig schwarze Bitmap
void CScribbleView::OnLButtonDown(UINT, CPoint point)
{
//CClientDC dc(this);
//OnPrepareDC(&dc);
HBITMAP initialMap;
RECT t;
BITMAP bmpScreen;
GetClientRect(&t);
initialMap = CreateCompatibleBitmap(GetDC()->m_hDC,t.right-t.left,t.bottom-t.top);
HDC tempDC = CreateCompatibleDC(GetDC()->m_hDC);
SelectObject(tempDC,initialMap);
SelectObject(tempDC,getStockObject(BLACK_PEN);
SelectObject(tempDC,GetStockObject(WHITE_BRUSH));
Rectangle(tempDC,100,100,200,200);
BitBlt(GetDC()->m_hDC,clientR.left,clientR.top,clientR.right-clientR.left,t.bottom-clientR.top,tempDC,0,0,SRCCOPY);
}
ich, dass die Bitmap vermuten nicht richtig von meiner ursprünglichen DC gelesen wurde. Also entschied ich mich später, eine andere Methode zum Abrufen von DC, den CClientDC, anstelle von GetClientDC() -> m_hDC zu verwenden.
void CScribbleView::OnLButtonDown(UINT, CPoint point)
{
CClientDC dc(this);
OnPrepareDC(&dc);
HBITMAP initialMap;
RECT t;
BITMAP bmpScreen;
GetClientRect(&t);
initialMap = CreateCompatibleBitmap(dc.m_hDC,t.right-t.left,t.bottom-t.top);
HDC tempDC = CreateCompatibleDC(dc.m_hDC);
SelectObject(tempDC,initialMap);
SelectObject(tempDC,getStockObject(BLACK_PEN);
SelectObject(tempDC,GetStockObject(WHITE_BRUSH));
Rectangle(tempDC,100,100,200,200);
BitBlt(dc.m_hDC,clientR.left,clientR.top,clientR.right-clientR.left,t.bottom-clientR.top,tempDC,0,0,SRCCOPY);
}
Jetzt zeigt das neue Programm nichts; Es ist der gleiche weiße Hintergrund, mit dem ich ursprünglich angefangen hatte. Was ist der Unterschied zwischen diesen beiden DC's und wie kann ich mein Problem beheben?
Okay, scheint es, dass CreateCompatibleBitmap Funktion keine Bitmap erstellen, die das gleiche Bild enthalten, das in dem Client-Fenster ist. Stattdessen wird nur ein Bild erstellt, das der Größe des Clientfensters entspricht, bei dem alle Pixelfarben auf Null initialisiert sind (was schwarz ist). – varimax
Das aktuelle Ansichtsfenster zu lesen ist sowieso eine schlechte Idee. Was versuchst du eigentlich zu erreichen? –
Es ist eine lange Geschichte. Ich mache ein Zeichenprogramm wie Paint. Im Moment arbeite ich daran, Rechtecke zu zeichnen. Ursprünglich, wenn ich meine Maus drücke und ziehe, würde ich ein neues Rechteck in der OnMouseMove-Funktion zeichnen. Dies hinterlässt jedoch eine Reihe von verzögerten Rechtecken. Also entschied ich mich, die Client-Ansicht in einer Bitmap zu speichern, sobald die Maus gedrückt wird. In der OnMouseMove-Funktion würde ich einfach über die Ansicht, die ich gespeichert hatte, zeichnen und das vorherige Rechteck abdecken, das beim Ziehen erstellt wurde. – varimax