Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Zeichnen, aber ohne flickern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
31.05.2008, 16:05 Uhr
cmos



Hallo,
ich zeichne auf einen Bereich in meinem Dialog der ständig neu gezeichnet werden muss.
Es ist eine Webcam angeschlossen, ich erzeuge aus dem ByteArray der Kamera ein Bitmap und zeichne es in der OnPaint Methode an eine bestimmte stelle und an einer anderen
stelle das berechnete Grauwertbild. Beides funktioniert soweit ganz gut.
Um ein Auswahlrechteck zu zeichnen habe ich mir die Methoden für Mousebuttondown, mousemove und mousebuttonup hinzugefügt.
Wenn ich den Dialog starte, also noch keine Verbindung zur Kamera hergestellt habe,
kann ich das Rechteck zeichnen ohne das es flackert.
Starte ich die Kamera, sehe ich das Bild der Kamera und noch daneben das Grauwertbild.
Wenn ich nun das Rechteck über das Kamerabild zeichne funktioniert das auch, nur es flackert. Aber zeichne ich z.b. das Rechteck über das Grauwertbild flackert es dort nicht.

hier meine mouse methoden

C++:
void CDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder
             //benutzen  ie den Standard.
    if(InsideClient(m_LivePosition,point) /*&& m_bMarkArea == TRUE*/)
    {
        m_InArea = TRUE;
        m_RectStart = point;
        m_AreaRect.SetRect(point.x,point.y,point.x,point.y);
        
        //Invalidate(FALSE);
        //SendMessage(WM_ERASEBKGND);

    }

    __super::OnLButtonDown(nFlags, point);
}

void CDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen
             //Sie den Standard.
    if((nFlags& MK_LBUTTON)== MK_LBUTTON  && m_InArea = TRUE)
            {
        int iX = m_RectStart.x;
        int iY = m_RectStart.y;

        m_AreaRect.SetRect(iX,iY,point.x,point.y);
        //Invalidate();
    
                    CRgn rgn;
        rgn.CreateRectRgn(m_AreaRect.TopLeft().x,m_AreaRect.TopLeft().y,m_AreaRect.BottomRight().x,m_AreaRect.BottomRight().y);
        RedrawWindow(&m_AreaRect,&rgn,RDW_INVALIDATE);                                    
    }

    __super::OnMouseMove(nFlags, point);

}

void CDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen
             //Sie den Standard.
    if(m_InArea)
    {
        m_AreaRect.SetRect(m_RectStart.x,m_RectStart.y,point.x,point.y);
    }    
    m_InArea = FALSE;
    m_bMarkArea = FALSE;
    m_IDCBtnArea.EnableWindow(TRUE);
}




meine OnPaint()

C++:
if(IsIconic())
{
   blabla
}
else
{
             // live bild zeichnen
    CPaintDC dc(this);
    dc.SetStretchBltMode(COLORONCOLOR);

    HBITMAP hBmpLive = CreateDDBFromPixel(GetDC()->GetSafeHdc(),
(DWORD)m_iSrcWidth,(DWORD)
                                                                     m_iSrcHeight,24,m_pLiveBuffer);                
    CBitmap* Bitmap = CBitmap::FromHandle(hBmpLive);
            
    CDC cdc;
    cdc.CreateCompatibleDC(&dc);
        
    CBitmap bitmap;
    CBitmap* pOldBitmap = cdc.SelectObject(&bitmap);
                
    cdc.SelectObject(CBitmap::FromHandle(hBmpLive));
        
    dc.BitBlt(m_LivePosition.TopLeft().x,m_LivePosition.TopLeft().y,m_LivePosition.Width(),m_LivePosition.Height(),&cdc,0,0,SRCCOPY);                
    cdc.SelectObject(pOldBitmap);
    ReleaseDC(&cdc);

    DeleteObject(hBmpLive);

             // grauwertbild zeichnen
    HBITMAP hBMP = CreateDDBFromPixel(GetDC()->GetSafeHdc(),
                                                                (DWORD)this->m_iSrcWidth,
                                                                (DWORD)m_iSrcHeight,24,m_pBuffer);                    
    CBitmap* Bitmap = CBitmap::FromHandle(hBMP);
                
    CDC cdc;
    cdc.CreateCompatibleDC(&dc);

    CBitmap bitmap;
    CBitmap* pOldBitmap = cdc.SelectObject(&bitmap);

             cdc.SelectObject(CBitmap::FromHandle(hBMP));
            
    CRect rect;
    m_IDCGreyview.GetWindowRect(&rect);            
    ScreenToClient(&rect);
        
    dc.SetStretchBltMode(COLORONCOLOR);
    dc.StretchBlt(rect.TopLeft().x,rect.TopLeft().y,rect.Width(),rect.Height
                                (),&cdc,0,0,m_iSrcWidth,m_iSrcHeight,SRCCOPY);

        cdc.SelectObject(pOldBitmap);
    ReleaseDC(&cdc);
    DeleteObject(hBMP);



Ich verstehe nicht, warum es bei dem einen Bild flackert und bei dem anderen nicht.
Bei beiden erzeuge ich ein HBitmap in der OnPaint methode und zeichne beide in der gleichen art und weise.
Das Große "bunte" Bild der Kamera zeichne ich mit Bitblt und das kleine Grauwertbild
zeichne ich mit StretchBitBlt. Weiterhin habe ich noch angegeben
StretchBitBlMode(COLORONCOLOR);

Dieser Post wurde am 31.05.2008 um 16:06 Uhr von cmos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.06.2008, 15:36 Uhr
~jencas
Gast


www.codeproject.com/KB/GDI/flickerfree.aspx
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.06.2008, 15:58 Uhr
cmos



Danke für den Link, den kenne ich schon.
Das Problem ist schon gelöst, es lag an etwas anderem.

Grüße,
cmos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: