2009-02-27 85 views
4

我試圖改變光標出現在標準ListView上,當光標出現在一個項目上時。不過,當鼠標變成手指光標時,我會產生閃爍的效果,然後回到我問它的位置。ListView光標變化和閃爍

我試圖隔離這個閃爍/改變到手形光標,但無法找出它發生的地方或如何阻止它。要複製此...

1)創建一個帶有ListView的窗體。 2)添加圖像列表和一些圖像。將視圖設置爲大圖標模式。 3)添加一些項目到ListView。

一個MouseMove事件添加到ListView

private void listView1_MouseMove(object sender, MouseEventArgs e) 
{ 
    ListViewItem selected = this.listView1.GetItemAt(e.X, e.Y); 
    if (selected == null) 
    { 
     base.Cursor = Cursors.Default; 
    } 
    else 
    { 
     base.Cursor = Cursors.No; 
    } 
} 

執行的應用程序,在一個項目上移動鼠標。當你在一個項目上時,你應該看到光標在No(沒有輸入光標)和手指指針之間閃爍。問題是如何確保它只顯示No遊標並且不閃爍。 (C#.NET)。

我試着重寫OnMouseMove和OnMouseHover來返回,以確保這些不設置任何東西。我也嘗試覆蓋Cursor屬性,並說'只設置爲默認或沒有遊標',也沒有工作。

任何幫助的讚賞。

伊恩

+0

它發生在其他地方嗎?例如,在超鏈接或其他應用程序中導航時?或者它只在你的應用程序中發生? 如果是這樣,它可能更多是一個操作系統問題... – Razzie 2009-02-27 10:49:34

+0

它是跨平臺,跨應用程序。如果你閱讀我的評論teknohippy ...這個問題被誇大手工繪製物品和hottracking。我試過覆蓋WndProc返回,如果(m.Msg == 0x020)改變光標。有些東西將它切換到一隻手,但我不確定是什麼。 – Ian 2009-02-27 11:12:54

回答

7

問題是,C#ListView控件基本上是Windows列表視圖控件的一個包裝。因此,當我們將光標設置爲箭頭時,基礎列表視圖控件總是默認爲手形光標,而我們在C#ListView類中的設置則希望它成爲箭頭。這就是爲什麼我們得到這種閃爍,因爲潛在的控制恢復到手。

下面是你需要添加代碼:

public const uint LVM_SETHOTCURSOR = 4158; 

[DllImport("user32.dll")] 
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

SendMessage(listView1.Handle, LVM_SETHOTCURSOR, IntPtr.Zero, Cursors.Arrow.Handle); 

這是非常重要的,你因爲屆時基礎ListView控件是完全初始化從表格的onLoad事件調用SendMessage函數!

其實很簡單,祝你有個美好的一天! :)

0

,而不必試了一下,光標響應WM_正常的setCursor改變,也許你在使用默認WM_處理的setCursor ListView中的衝突。我會嘗試創建一個從ListView派生的新UserControl,然後在WndProc中捕獲WM_ SETCURSOR並查看是否有幫助。