Вопрос

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

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

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

Это было полезно?

Решение

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

Редактировать:В документация для CreateCompatibleBitmap не указывает, как будет инициализировано растровое изображение, поэтому вы должны явно инициализировать растровое изображение определенным цветом, как предлагает Goz, используя 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 - нормальной вещью было бы сделать высоту растрового изображения равной высоте окна (как это делается для ширины).

Другие советы

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

Согласно MSDN http://msdn.microsoft.com/en-us/library/dd162898.aspx:

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

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

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

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

Просто в качестве примечания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top