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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top