CImageList Flimmert
-
hi
bin gerade eine Drag 'n' Drop Funktion für mein CListCtrl am schreiben. Das Problem ist aber wenn ich die Mouse mit dem "gedraggten" Item bewege Flimmert es wie sau.
Was kann ich dagegen tun???
-
Nicht dauernd neu zeichnen?

-
hi
ja und wie soll ich das Machen??? Habe die DragMove in die OnMouseMove hineingelegt. Wo soll ich sie statt dessen hinverlegen???
-
Hmm, keine Ahnung. Ich wusste blos, dass so ein Flimmern wohl vom zu oft neu Zeichnen kommt. Vielleicht geht es ja auch, wenn du einen kleineren Bereich neu zeichnest?
Drag & Drop ist sonst leider nicht meine Stärke.
-
hat noch jemand eine Idee???
Könnte man auch eine Klasse von CImageList ableiten und dann die Zeichenfunktion ünerladen und dadurch das Flimmern verhinden???
-
CImageList ist sicher nicht Schuld. Es liegt an dir bzw. an deiner Anwendung. Zeig mal ein bißchen Code.
-
hi hier ist ein bissel Quellcode.
void CXListCtrl::OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen m_nDragIndex = pNMListView->iItem; /* Ein Verschieben von Target Items ist nicht möglich (Anfang)*/ XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA*)CListCtrl::GetItemData( pNMListView->iItem ); if( pXLCD[0].bTargetVolume == TRUE ) { AfxMessageBox("Das verschieben von Rootitems ist nicht möglich", MB_OK, 0); return; } POINT pt; int nOffset = 10; pt.x = nOffset; pt.y = nOffset; /* Old */ //m_pDragImage = this->CreateDragImage( m_nDragIndex, &pt ); //ASSERT( m_pDragImage ); //CBitmap Drag; //Drag.LoadBitmap( IDB_DRAGDROP ); //m_pDragImage->Replace( 0, &Drag, &Drag ); CRect rect, HeaderRect; GetItemRect(m_nDragIndex, rect, LVIR_BOUNDS); //m_HeaderCtrl.GetItemRect( m_nDragIndex, &HeaderRect); // Create bitmap CClientDC dc( this ); CDC memDC; CBitmap bitmap; memDC.CreateCompatibleDC(&dc); bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap ); CFont* pOldFont = memDC.SelectObject(GetFont()); memDC.FillSolidRect( 0, 0, rect.Width(), rect.Height(), RGB(0,255,0)); memDC.SetTextColor(RGB(0,0,0)); for( int i = 0; i < GetColumns(); i++ ) { CRect ClientFull = rect; m_HeaderCtrl.GetItemRect( i, &HeaderRect); ClientFull.left = HeaderRect.left; ClientFull.right = HeaderRect.right; ClientFull.top = 0; ClientFull.bottom = rect.Height(); if( pXLCD[i].nCheckedState != -1 ) { this->DrawCheckbox( m_nDragIndex, i, &memDC, RGB(0,0,0), RGB(0,255,0), ClientFull, pXLCD, FALSE); } else { this->DrawText( m_nDragIndex, i, &memDC, RGB(255,0,0), RGB(0,255,0), ClientFull, pXLCD, FALSE); } } memDC.SelectObject( pOldFont ); memDC.SelectObject( pOldMemDCBitmap ); // Create imagelist m_pDragImage = new CImageList; m_pDragImage->Create(rect.Width(), rect.Height(), ILC_COLOR | ILC_MASK, 0, 1); m_pDragImage->Add(&bitmap, RGB(0, 255, 0)); // Here green is used as mask color m_pDragImage->BeginDrag( 0, CPoint( pNMListView->ptAction.x, nOffset ) ); m_pDragImage->DragEnter( GetDesktopWindow(), pNMListView->ptAction ); // Set Dragging flag and other m_bDragging = TRUE; m_nDropIndex = -1; m_pDragWnd = this; m_pDropWnd = this; SetCapture(); *pResult = 0; }void CXListCtrl::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen if( m_bDragging ) { CPoint pt( point ); ClientToScreen( &pt ); /* Herausfinden ob sich der Mauszeiger am oberen Rand bzw. unteren Rand befindet */ CRect ListClient; CRect HeaderClient; GetClientRect(&ListClient); m_HeaderCtrl.GetClientRect( &HeaderClient); ListClient.top += HeaderClient.bottom; // Befindet sich der Mauszeiger am oberen Rand dann nach oben Scrollen if( ListClient.top == point.y || ListClient.top+5 > point.y) { // WM_TIMER Nachrichten senden SetTimer( 6, 200, NULL); } else { // Wm_TIMER Nachrichten nicht mehr senden KillTimer( 6 ); } // Befindet sich der Mauszeiger am unteren Rand dann nach unten Scrollen if( ListClient.bottom == point.y || ListClient.bottom - 5 < point.y) { // WM_TIMER Nachrichten senden SetTimer( 5, 200, NULL); } else { // Wm_TIMER Nachrichten nicht mehr senden KillTimer( 5 ); } /* Herausfinden ob sich der Mauszeiger am oberen Rand bzw. unteren Rand befindet */ m_pDragImage->DragMove( pt ); m_pDragImage->DragShowNolock( FALSE ); // Get the CWnd pointer of the window that is under the // mouse cursor CXListCtrl* pDropWnd = (CXListCtrl*)WindowFromPoint(pt); ASSERT(pDropWnd); // make sure we have a window // If we drag outside current window we need // to adjust the highlights displayed if( pDropWnd != m_pDropWnd ) { // If we drag over the CListCtrl header, turn off the // hover highlight if( m_nDropIndex != -1 ) { TRACE("m_nDropIndex is -1\n"); CXListCtrl* pList = (CXListCtrl*)m_pDropWnd; VERIFY (pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED)); // redraw item //VERIFY (pList->RedrawItems (m_nDropIndex, m_nDropIndex)); //pList->UpdateWindow (); m_nDropIndex = -1; } else //If we drag out of the CListCtrl altogether { TRACE("m_nDropIndex is not -1\n"); CXListCtrl* pList = (CXListCtrl*)m_pDropWnd; int i = 0; int nCount = pList->GetItemCount(); for(i = 0; i < nCount; i++) { pList->SetItemState(i, 0, LVIS_DROPHILITED); } //pList->RedrawItems(0, nCount); //pList->UpdateWindow(); } } // Save current window pointer as the CListCtrl we are dropping onto m_pDropWnd = pDropWnd; // Convert from screen coordinates to drop target client coordinates pDropWnd->ScreenToClient(&pt); //If we are hovering over a CListCtrl we need to adjust the highlights if(pDropWnd->IsKindOf(RUNTIME_CLASS (CListCtrl))) { UINT uFlags; CXListCtrl* pList = (CXListCtrl*)pDropWnd; // Turn off hilight for previous drop target pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED); // Redraw previous item //pList->RedrawItems (m_nDropIndex, m_nDropIndex); // Get the item that is below cursor m_nDropIndex = ((CListCtrl*)pDropWnd)->HitTest(pt, &uFlags); // Highlight it pList->SetItemState(m_nDropIndex, LVIS_DROPHILITED, LVIS_DROPHILITED); // Redraw item //pList->RedrawItems(m_nDropIndex, m_nDropIndex); //pList->UpdateWindow(); } // Lock window updates m_pDragImage->DragShowNolock(TRUE); } //CListCtrl::OnMouseMove(nFlags, point); }also ich weiß langsam nicht mehr weiter
-
OK
thx Leute hat sich erlädigt. Habe das Problem gefunden. Wenn jemand die Lösung haben will einfach mal posten oder mailen
Gruß
de_Bert