Domanda
Sono in esecuzione questo codice seguente,
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);
Il codice è più che bene. Ma sto vedendo colore nero attorno a questo rettangolo. Perché? Ecco un immagine di esempio.
Soluzione
La bitmap è più probabile inizializzato per essere tutto nero. Si sono quindi disegnando un rettangolo bianco che tra coordinate x 126 e 624. Quindi, tutto a sinistra di x = 126 e alla destra di x = 624 rimane nero.
Modifica: Il documentazione per CreateCompatibleBitmap
non indica come verrà inizializzato il bitmap, così si dovrebbe inizializzare esplicitamente la bitmap con un colore specifico, come suggerisce Goz, utilizzando 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));
In questo esempio si riempie la bitmap in grigio - potrebbe essere necessario CreateSolidBrush
il proprio pennello se avete bisogno di un colore diverso. (Non dimenticare di chiamare DeleteObject
quando il gioco è fatto.)
Come nota a margine, lo trovo un po 'strano che il bitmap viene impostata ad un'altezza costante di 200 - la cosa normale sarebbe quello di rendere l'altezza della bitmap uguale all'altezza della finestra (come è fatto per la larghezza).
Altri suggerimenti
Potrebbe essere perché non avete inizializzato l'area bitmap di memoria ad un determinato colore? Prova FillRect'ing lo sfondo a un colore diverso quindi attirare la vostra rettangolo bianco su di esso e vedere cosa succede.
Per MSDN http://msdn.microsoft.com/en-us /library/dd162898.aspx :
Il rettangolo è delineato con la penna corrente e riempito utilizzando il pennello corrente.
Si consideri chiamando FillRect
invece, oppure selezionare una penna appropriata prima di chiamare Rectangle
'.
ho usato:
// Fill the background
hdcMem->FillSolidRect(c, hdcMem->GetBkColor());
Proprio come una nota.