Pergunta

Estou executando este código a seguir,

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

O código está bem. Mas estou vendo a cor preta em torno deste retângulo. Por que é que? Aqui está uma imagem de exemplo.

Foi útil?

Solução

O bitmap provavelmente é inicializado para ser todo preto. Você está desenhando um retângulo branco que entre as coordenadas X 126 e 624. Portanto, tudo à esquerda de x = 126 e à direita de x = 624 permanece preto.

Editar: o documentação para CreateCompatibleBitmap Não indica como o bitmap será inicializado, então você deve inicializar explicitamente o bitmap com uma cor específica, como sugere goz, usando 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));

Este exemplo preenche o bitmap em cinza - você pode precisar CreateSolidBrush seu próprio pincel, se você precisar de uma cor diferente. (Não se esqueça de ligar DeleteObject quando você acabar.)

Como nota lateral, acho um pouco estranho que seu bitmap esteja sendo definido para uma altura constante de 200 - o normal seria tornar a altura do bitmap igual à altura da janela (como é feito para o largura).

Outras dicas

Pode ser porque você não inicializou a área de bitmap de memória para uma determinada cor? Tente encher o fundo do fundo para uma cor diferente e desenhe seu retângulo branco sobre ele e veja o que acontece.

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

O retângulo é descrito usando a caneta atual e preenchido usando o pincel atual.

Considere ligar FillRect em vez disso, ou selecione uma caneta apropriada antes de ligar Rectangle'.

Eu usei:

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

Apenas como uma nota.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top