Pregunta

Me postulo este siguiente código:

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

El código está muy bien. Pero yo estoy viendo de color negro alrededor de este rectángulo. ¿Porqué es eso? Aquí está una imagen de ejemplo.

¿Fue útil?

Solución

El mapa de bits más probable es inicializado a ser todo negro. Luego se le dibuja un rectángulo blanco que entre las coordenadas x 126 y 624. Por lo tanto, todo a la izquierda de x = 126, y hacia la derecha de x = 624 estancias negro.

Edit: El documentación para CreateCompatibleBitmap no indica cómo se inicializa el mapa de bits, por lo que debe inicializar explícitamente el mapa de bits con un color específico, como sugiere 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));

En este ejemplo se llena el mapa de bits en color gris - puede que tenga que CreateSolidBrush su propio cepillo de si necesita un color diferente. (No se olvide de llamar DeleteObject cuando ya está.)

Como nota al margen, me resulta un poco extraño que el mapa de bits se ajusta a una altura constante de 200 - lo normal sería hacer que la altura del mapa de bits igual a la altura de la ventana (como es hecho por la anchura).

Otros consejos

¿Podría ser porque no se ha inicializado el área de mapa de bits de memoria a un color determinado? Trate FillRect'ing el fondo a un color diferente, entonces llamar su rectángulo blanco sobre ella y ver qué pasa.

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

  

El rectángulo se describe mediante el uso de la pluma actual y llenó usando el cepillo actual.

Considere llamar FillRect vez, o seleccionar una pluma apropiada antes de llamar Rectangle'.

He utilizado:

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

Así como una nota.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top