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