I’m trying to change the cursor that appears on a standard ListView when the cursor appears over an item. However I am getting a flickering effect as the mouse is changed to a finger cursor, and then back to what I asked it to be.
I’m trying to isolate this flicker/changing to the hand cursor but can’t figure out where it’s occuring or how to stop it. To replicate this…
1) Create a form with a ListView on it. 2) Add an image list and some images. Set the view to the large icon mode. 3) Add some items to the ListView.
Add a MouseMove event to the 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; } }
Execute the app, moving the mouse over an item. You should see the cursor flickering between the No (no entry cursor) and the finger pointer when you’re over an item. The question is how to ensure it just displays the No cursor and to not flicker. (C# .NET).
I’ve tried override both OnMouseMove and OnMouseHover to returning to ensure these don’t set anything. I’ve also tried overriding the Cursor property and saying ‘only set to default or no cursors’ and that didn’t work either.
Any help’s appreciated.
Ian
The problem is that C# ListView Control is basically a wrapper around windows List View Control. So when we set the cursor to Arrow, the underlying listview control always defaulted to Hand cursor while our setting in the C# ListView class wanted it to be an Arrow. That’s why we were getting that flickering, because underlying control was reverting back to Hand.
Here is the code that you need to add:
It’s very important that you call the SendMessage from your Form’s onLoad event because by then the underlying ListView control is completely initialized!
It’s pretty simple actually, Have a great day! 🙂