Битблт чернота - PullRequest
       7

Битблт чернота

2 голосов
/ 22 сентября 2009

Я запускаю следующий код,

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);

Код просто отлично. Но я вижу черный цвет вокруг этого прямоугольника. Это почему? Вот пример изображения.

Ответы [ 4 ]

4 голосов
/ 22 сентября 2009

Скорее всего, растровое изображение инициализировано черным. Затем вы рисуете белый прямоугольник между координатами x 126 и 624. Следовательно, все слева от x = 126 и справа от x = 624 остается черным.

Edit: документация для CreateCompatibleBitmap не указывает, как будет инициализироваться растровое изображение, поэтому вам следует явно инициализировать растровое изображение определенным цветом, как предлагает Гоз, используя 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));

Этот пример заполняет растровое изображение серым - вам может понадобиться CreateSolidBrush вашей собственной кисти, если вам нужен другой цвет. (Не забудьте позвонить DeleteObject, когда вы закончите.)

В качестве примечания, я нахожу немного странным, что ваше растровое изображение устанавливается на постоянную высоту 200 - нормальным было бы сделать высоту растрового изображения равной высоте окна (как сделано для ширины).

1 голос
/ 22 сентября 2009

Может быть потому, что вы не инициализировали область растрового изображения памяти для данного цвета? Попробуйте FillRect'ом фон другого цвета, затем нарисуйте белый прямоугольник и посмотрите, что получится.

0 голосов
/ 20 октября 2009

Я использовал:

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

Как примечание.

0 голосов
/ 22 сентября 2009

за MSDN http://msdn.microsoft.com/en-us/library/dd162898.aspx:

Прямоугольник выделяется с помощью текущего пера и заливается с помощью текущей кисти.

Попробуйте вместо этого позвонить FillRect или выберите подходящую ручку до вызова Rectangle '.

...