Question

Je l'exécution de ce code suivant,

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

Le code est très bien. Mais je vois la couleur noire autour de ce rectangle. Pourquoi donc? Voici un exemple d'image.

Était-ce utile?

La solution

Le bitmap est le plus susceptible d'être initialisé tout noir. Vous êtes alors dessinez un rectangle blanc qui entre x coordonnées 126 et 624. Par conséquent, tout à gauche de x = 126 et à droite de x = 624 reste noir.

Edit: documentation pour CreateCompatibleBitmap ne précise pas comment le bitmap sera initialisé, vous devez donc initialiser explicitement le bitmap avec une couleur spécifique, comme le suggère Goz, en utilisant 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));

Cet exemple remplit le bitmap en gris - vous devrez peut-être CreateSolidBrush votre brosse si vous avez besoin d'une couleur différente. (Ne pas oublier d'appeler DeleteObject lorsque vous avez terminé.)

Comme une note de côté, je trouve un peu étrange que votre bitmap est réglé à une hauteur constante de 200 - la chose normale serait de faire la hauteur du bitmap égale à la hauteur de la fenêtre (comme fait pour la largeur).

Autres conseils

Serait-ce parce que vous ne l'avez pas initialisés la zone bitmap de mémoire à une couleur donnée? Essayez FillRect'ing l'arrière-plan à une couleur différente puis dessinez votre rectangle blanc au-dessus et voir ce qui se passe.

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

  

Le rectangle est décrit à l'aide du stylo en cours et rempli à l'aide de la brosse en cours.

Pensez à appeler FillRect à la place, ou sélectionnez un stylo approprié avant d'appeler Rectangle.

je:

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

Tout comme une note.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top