Je n'ai rien écrit avec GDI depuis un moment (et jamais avec GDI +), et je travaille juste sur un projet amusant, mais pour la vie de moi, je ne peux pas comprendre comment doubler tampon GDI +
void DrawStuff(HWND hWnd) { HDC hdc; HDC hdcBuffer; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); hdcBuffer = CreateCompatibleDC(hdc); Graphics graphics(hdc); graphics.Clear(Color::Black); // drawing stuff, i.e. bunnies: Image bunny(L"bunny.gif"); graphics.DrawImage(&bunny, 0, 0, bunny.GetWidth(), bunny.GetHeight()); BitBlt(hdc, 0,0, WIDTH , HEIGHT, hdcBuffer, 0,0, SRCCOPY); EndPaint(hWnd, &ps); }
4 Réponses :
Edit: p> Le scintillement est causé par WM_ERASEBKGND, lorsque Vous faites ce p> à l'intérieur de l'appel à BuNTPaint, Windows envoie votre WNDProc A WM_ERASEBKGND message Si elle pense que l'arrière-plan doit être redessiné, si vous ne gérez pas ce message, DEFWINDOWPROC fonctionne en remplissant le rectangle de peinture avec votre brosse de classe, afin d'éviter le scintillement, vous devez le gérer et revenir vrai. P> CreateCompatierdedc (HDC) code> crée un CC avec un bitmap monochrome de 1x1 pixels comme surface de dessin. Vous devez également
CreateCompatibleBitmap CODE> et sélectionner ce bitmap dans le HDCBuffer si vous voulez une surface de dessin plus grande que celle-là.
case WM_ERASEBKGND:
return TRUE; // tell Windows that we handled it. (but don't actually draw anything)
Merci, j'ai ajouté HBMP = CreateCompatibleBitmap (HDC, largeur, hauteur); SelectObject (HDCBuffer, HBMP); au code (et les travaux BitBlt) mais il scintille toujours.
Gardez-vous WM_ERASEBKGND? Je crois que cela est appelé juste avant wm_paint et bloque généralement la couleur de fond de la fenêtre que vous ne voulez probablement pas arriver. P>
Vous pouvez essayer la manière suivante:
void DrawAll(CDC *pDC) { CRect rect; GetClientRect(&rect); Bitmap *pMemBitmap = new Bitmap(rect.Width(), rect.Height()); Graphics* pMemGraphics = Graphics::FromImage(pMemBitmap); Graphics graphics(pDC->m_hDC); // use pMemGraphics do something.... Status status = graphics.DrawImage(pMemBitmap, 0, 0); if (status != Ok) { //some error } delete pMemGraphics; delete pMemBitmap; }
Veuillez ajouter une description à votre code, pour une meilleure explication de votre solution. Nous sommes ici pour apprendre à accéder aux réponses la prochaine fois que nous rencontrerons ce problème, et non comment les copier.
Est-ce que cela ne fuit pas le pmembbitmap?
donné "graphiques graphiques (HDC)", vous semblez Effacer HDC au lieu de HDCBuffer. Assez sûr, cela provoquera un scintillement. P>