Avatar billede xenocypraz Nybegynder
18. august 2004 - 08:58 Der er 2 kommentarer og
1 løsning

Dobbelt Buffering

Hejsa, jeg er som beskrevet i andre spørgsmål i gang med at lave et termometer,

Når termoteret opdaterer kalder det Invalidate(); og derfor kommer skærmen til "flimre". Jeg har fået og vide at nøglen til opgave er at bruge Dobbelt buffering.

Men jeg kan ikke få de til at virke,

http://www.codeproject.com/gdi/flickerfree.asp#xx822717xx

der fra har jeg hentet klassen der skulle virke,

void CTemperatureCtrl::OnPaint()
{
    CPaintDC dc(this);                                    // device context for painting

    CRect cRect;
    GetClientRect(&cRect);                                // Skaffer målene på staticboksen   

    //// SÆTTER STØRRELSEN PÅ STATIC TIL 100 * 300 ///////////
                                                           
    dc.SetMapMode(MM_ANISOTROPIC);                           
    dc.SetWindowExt(100, 300);                               
    dc.SetViewportExt(cRect.Width(), cRect.Height());       
   
    //// DOBBELT BUFFERING /////

//    CMemDC pDC(&dc);
   
    //// DOBBELT BUFFERING /////                                                       

    PaintTermometer(&dc);                                // Tegner termometeret.   
    PaintLines(&dc);                                    // Tegner stregerne og skriver celcius og fahrenheit.
    PaintTemp(&dc);                                        // Tegner temperaturen.

    // Do not call CStatic::OnPaint() for painting messages
}

og sådan ser min onpaint ud,

men når jeg kalder den, bliver størrelsen ikke korrekt, og skærmen bliver bare hvid,

Nogen ideer???

Jeg ved det kan lade sig gøre, og jeg bare skal smide de rigtigte ting med over.

- Nikolaj
Avatar billede xenocypraz Nybegynder
18. august 2004 - 08:59 #1
jeg ved godt jeg har udkommenteret dobbelt buffering i overstående, men det var bare for at teste om det var der fejlen lå
Avatar billede xenocypraz Nybegynder
18. august 2004 - 09:02 #2
her er koden fra dobbelt buffer klassen
    CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
    {
        ASSERT(pDC != NULL);

        // Some initialization
        m_pDC = pDC;
        m_oldBitmap = NULL;
        m_bMemDC = !pDC->IsPrinting();

        // Get the rectangle to draw
        if (pRect == NULL)
        {
            pDC->GetClipBox(&m_rect);
        }
       
        else
       
        {
            m_rect = *pRect;
        }

        if (m_bMemDC)
        {
            // Create a Memory DC
            CreateCompatibleDC(pDC);

            pDC->LPtoDP(&m_rect);

            SetMapMode(pDC->SetMapMode(MM_ANISOTROPIC));

            SetWindowExt(pDC->SetWindowExt(100, 300));
            SetViewportExt(pDC->SetViewportExt(m_rect.Width(), m_rect.Height()));

           
        pDC->DPtoLP(&m_rect);
           
            SetWindowOrg(m_rect.left, m_rect.top);

            m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
            m_oldBitmap = SelectObject(&m_bitmap);

           
           
   

            ///////////////////////////////////////////////////////////////
//            dc.SetMapMode(MM_ANISOTROPIC);                           
//            dc.SetWindowExt(100, 300);                               
//            dc.SetViewportExt(cRect.Width(), cRect.Height());   

               
        ///////////////////////////////////////////////////////////////
        }
       
        else
        {
            // Make a copy of the relevent parts of the current DC for printing
            m_bPrinting = pDC->m_bPrinting;
            m_hDC      = pDC->m_hDC;
            m_hAttribDC = pDC->m_hAttribDC;
        }

        // Fill background
        FillSolidRect(m_rect, pDC->GetBkColor());
    }
   

    ~CMemDC()   
    {       
        if (m_bMemDC) {
            // Copy the offscreen bitmap onto the screen.
            m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
                            this, m_rect.left, m_rect.top, SRCCOPY);           
           
            //Swap back the original bitmap.
            SelectObject(m_oldBitmap);       
        } else {
            // All we need to do is replace the DC with an illegal value,
            // this keeps us from accidently deleting the handles associated with
            // the CDC that was passed to the constructor.           
            m_hDC = m_hAttribDC = NULL;
        }   
    }
   
    // Allow usage as a pointer   
    CMemDC* operator->()
    {
        return this;
    }   

    // Allow usage as a pointer   
    operator CMemDC*()
    {
        return this;
    }
};
Avatar billede xenocypraz Nybegynder
19. august 2004 - 13:11 #3
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester