2009-09-13 54 views
4

在使用常見控件的listview中繪製網格線時出現問題6.當我嘗試向下滾動列表頁面或使用鼠標上翻頁面時,會發生此問題。Listview網格線問題

screenshot http://files.rsdn.ru/11470/screen1.png

我只能找到這個討論http://www.ureader.com/msg/1484143.aspx,但解決方案並不完美

  1. LVS_EX_DOUBLEBUFFER不爲我
  2. 禁用平滑滾動工作不工作對我來說
  3. 上無效滾動不起作用,但閃爍不好
  4. 禁用網格線確實有效,但如果沒有它們,列表看起來不太正常。

還有其他的選擇嗎? 謝謝!

+0

這可能不是一個真正的選擇,但是* *不依賴6年前的技術呢? – MusiGenesis 2009-09-13 03:57:50

+1

即使我使用.NET和WinForms,我也會遇到同樣的問題,因爲WinForms依賴於WinApi並使用與我一樣的Listview。 你說得對,這不是一個選項。我不打算重寫整個軟件。我只需要解決這個問題。 – Fedor 2009-09-13 14:09:00

回答

2

ObjectListView - 一個圍繞純.NET .NET WinForms ListView的開源包裝 - 修復了這個問題(以及其他許多問題)。

如果您想在自己的代碼中修復它,您需要監聽LVN_ENDSCROLL的反映通知。在處理程序結束滾動,做這樣的事情:

protected void HandleEndScroll(ref Message m) { 
    // There is a bug in ListView under XP that causes the gridlines to be 
    // incorrectly scrolled when the left button is clicked to scroll. 
    // This is supposedly documented at KB 813791, but I couldn't find it. 
    if (!ObjectListView.IsVista && 
     Control.MouseButtons == MouseButtons.Left && 
     this.GridLines) { 
     this.Invalidate(); 
     this.Update(); 
    } 
} 

沒有與此略有閃爍,但它比具有網格線完全搞砸了要好得多。

1

我選擇子類ListView和過程WM_VSCROLL消息:

WORD x=LOWORD(wParam); 
    if(iMsg==WM_VSCROLL && (x==SB_PAGEDOWN || x==SB_PAGEUP || x==SB_LINEDOWN || x==SB_LINEUP)) 
    { 
    InvalidateRect(hDlg, 0, true); 
    UpdateWindow(hDlg); 
    } 
+1

使用LVN_ENDSCROLL的好處在於,只要listview滾動(主要是),就會發送它。 WM_VSCROLL僅在滾動條被操縱時發送。使用鼠標滾輪滾動將發送LVN_ENDSCROLL,但不是WM_VSCROLL。但是這個問題只發生在單擊鼠標時,所以使用WM_VSCROLL消息也可以。 – Grammarian 2009-09-15 07:31:17

0

這是自2001年以來的Win32新聞組常見問題,請參閱谷歌羣組:Win32的列表視圖,C代碼(MS)

0

我有一個項目轉換從VB6到MS Vs2005,當從項目屬性 - >應用程序設置啓用「啓用XP視覺樣式」時,它具有相同的問題。 然後我禁用該功能,並解決了問題。

+2

這是正確的,但禁用XP視覺樣式通常不是一種選擇。 – Fedor 2009-10-22 02:09:35

0

不能讓你控制無效,並讓它在用戶完成滾動時重繪?我不記得如何做到這一點,但我以前有過類似的問題,那就是我如何處理它。

+0

這正是我所做的。見上面的答案。不管怎麼說,還是要謝謝你! – Fedor 2011-03-06 04:02:50