2009-02-27 21 views
4

カーソルが項目の上に現れるときに、標準のListViewに表示されるカーソルを変更しようとしています。しかし、マウスが指のカーソルに変わってから、私が尋ねたものに戻ってきたら、ちらつきの効果が出てきます。ListViewカーソルの変更とちらつき

私はこのちらつき/ハンドカーソルへの変更を分離しようとしていますが、発生している場所や停止方法を特定できません。これを複製するには...

1)ListViewでフォームを作成します。 2)イメージリストといくつかのイメージを追加します。ビューを大きなアイコンモードに設定します。 3)ListViewにいくつかの項目を追加します。

ListViewMouseMoveイベントを追加します。

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

他の場所で発生しますか?たとえば、ハイパーリンクや他のアプリケーションをナビゲートする場合は、それともあなたのアプリケーションでのみ*起こりますか? もしそうなら、おそらくOSの問題です。 – Razzie

+0

クロスプラットフォームのクロスアプリケーションです。あなたが私のコメントをteknohippyに読んだら...問題は、手作業によるアイテムの描きやホットラッキングでは誇張されています。私は(m.Msg == 0x020)カーソルを変更する場合、返すWndProcをオーバーライドしようとしました。何かが手に変わるが、私は何がわからない。 – Ian

+0

ListViewのActivationプロパティをどのように設定していますか? OneClickの場合、アイテム上にカーソルを置くと、コントロール自体がカーソルをハンドカーソルに変更します。 – EricLaw

答えて

7

問題は、C#ListView Controlは基本的に、WindowsのList View Controlを包むラッパーです。したがって、カーソルをArrowに設定すると、C#ListViewクラスの設定でArrowを使用していたのに対し、基になるリストビューコントロールは常にHand cursorにデフォルト設定されていました。そのため、根底にあるコントロールが手に戻ってきたので、私たちはそれがちらついているのです。ここで

は、あなたが追加する必要があるコードは次のとおりです。

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

MTG。ありがとう、私はそれを見て、それを試してみましょう。それが動作する場合は、将来のための答えとしてそれをマークします:)私は同じ方法を使用してWndProcをオーバーライドする別の方法を推測している... – Ian

+0

WndProcをオーバーライドしても何も行われません。 SendMessageは、Windows共通コントロールのプロパティを更新する方法として使用されます。 LVM_SETHOTCUROSRはWindowsメッセージではないプロパティなので、wndprocをオーバーライドすることはまったく役に立ちません。 –

+0

非常に良い。この情報がどこにあるのか尋ねることはできますか?これらの魔法の定数値を見つけるのに最適な場所は決して見つけられませんでした。 – Ian

0

それを試みなくても、カーソルは通常ので、多分あなたは、リストビューのデフォルトのWM_のはsetCursorハンドリングと競合している、WM_のSetCursorに応じて変更されています。 ListViewから派生した新しいUserControlを作成し、WndProcのWM_ SETCURSORをトラップして、それが役立つかどうかを確認します。