9
votes

GDI + double tampon en C ++

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


0 commentaires

4 Réponses :


9
votes

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à.

Edit: p>

Le scintillement est causé par WM_ERASEBKGND, lorsque Vous faites ce p> xxx pré>

à 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>

case WM_ERASEBKGND:
   return TRUE; // tell Windows that we handled it. (but don't actually draw anything)


1 commentaires

Merci, j'ai ajouté HBMP = CreateCompatibleBitmap (HDC, largeur, hauteur); SelectObject (HDCBuffer, HBMP); au code (et les travaux BitBlt) mais il scintille toujours.



2
votes

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.


0 commentaires

3
votes

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


2 commentaires

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?



0
votes

donné "graphiques graphiques (HDC)", vous semblez Effacer HDC au lieu de HDCBuffer. Assez sûr, cela provoquera un scintillement.


0 commentaires