Frage

Ich führe diesen folgenden Code aus,

HDC hdc;
HDC hdcMem;
HBITMAP bitmap;
RECT c;
GetClientRect(viewHandle, &c);
// instead of BeginPaint use GetDC or GetWindowDC
hdc = GetDC(viewHandle); 
hdcMem = CreateCompatibleDC(hdc); 
// always create the bitmap for the memdc from the window dc
bitmap = CreateCompatibleBitmap(hdc,c.right-c.left,200);

SelectObject(hdcMem, bitmap);

// only execute the code up to this point one time
// that is, you only need to create the back buffer once
// you can reuse it over and over again after that

// draw on hdcMem
// for example  ...
Rectangle(hdcMem, 126, 0, 624, 400);

// when finished drawing blit the hdcMem to the hdc
BitBlt(hdc, 0, 0, c.right-c.left,200, hdcMem, 0, 0, SRCCOPY);

// note, height is not spelled i before e

// Clean up - only need to do this one time as well
DeleteDC(hdcMem);
DeleteObject(bitmap);
ReleaseDC(viewHandle, hdc);

Der Code ist in Ordnung. Aber ich sehe schwarze Farbe in diesem Rechteck. Warum ist das so? Hier ist ein Beispielbild.

War es hilfreich?

Lösung

Die Bitmap wird höchstwahrscheinlich als schwarz initialisiert. Sie zeichnen dann ein weißes Rechteck, das zwischen X-Koordinaten 126 und 624. Daher links von x = 126 und rechts von x = 624 schwarz bleibt.

Bearbeiten: die Dokumentation für CreateCompatibleBitmap Gibt nicht an, wie die Bitmap initialisiert wird, sodass Sie die Bitmap mit einer bestimmten Farbe, wie Goz vorschlägt, explizit initialisieren sollten FillRect:

RECT rc;

rc.left=0;
rc.top=0;
rc.right=c.right-c.left;
rc.bottom=200;

FillRect(hdcMem, &rc, (HBRUSH)GetStockObject(GRAY_BRUSH));

Dieses Beispiel füllt die Bitmap in Grau - Sie müssen möglicherweise CreateSolidBrush Ihr eigener Pinsel, wenn Sie eine andere Farbe benötigen. (Vergessen Sie nicht anzurufen DeleteObject wenn du fertig bist.)

Als Randnotiz finde ich es ein bisschen seltsam, dass Ihre Bitmap auf eine konstante Höhe von 200 festgelegt wird - das Normale wäre, die Höhe der Bitmap gleich der Höhe des Fensters zu machen (wie es für die getan wird Breite).

Andere Tipps

Könnte es daran liegen, dass Sie den Speicherbitmap -Bereich nicht in eine bestimmte Farbe initialisiert haben? Versuchen Sie, den Hintergrund in eine andere Farbe zu füllen, dann zeichnen Sie Ihr weißes Rechteck darüber und sehen Sie, was passiert.

Pro msdn http://msdn.microsoft.com/en-us/library/dd162898.aspx:

Das Rechteck wird durch die Verwendung des aktuellen Stifts umrissen und mit dem aktuellen Pinsel gefüllt.

Rufen Sie an FillRect Stattdessen oder wählen Sie vor dem Anruf einen geeigneten Stift aus Rectangle'.

Ich benutzte:

    // Fill the background
    hdcMem->FillSolidRect(c, hdcMem->GetBkColor());

Genau wie eine Notiz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top