2009-02-27 5 views
4

J'essaie de changer le curseur qui apparaît sur un ListView standard lorsque le curseur apparaît sur un élément. Cependant, je reçois un effet de scintillement lorsque la souris est changée en curseur de doigt, puis de nouveau à ce que je lui ai demandé d'être.ListView Changement de curseur et scintillement

J'essaie d'isoler ce scintillement/changement au curseur de la main, mais je ne peux pas comprendre où il se produit ou comment l'arrêter. Pour répliquer ceci ...

1) Créez un formulaire avec un ListView dessus. 2) Ajouter une liste d'images et quelques images. Réglez la vue sur le mode icône large. 3) Ajouter des éléments à ListView.

Ajouter un événement MouseMove au 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 l'application, en déplaçant la souris sur un élément. Vous devriez voir le curseur clignotant entre le No (pas de curseur d'entrée) et le pointeur du doigt lorsque vous êtes sur un élément. La question est de savoir comment s'assurer qu'il affiche simplement le curseur No et de ne pas scintiller. (C# .NET).

J'ai essayé de surcharger OnMouseMove et OnMouseHover pour revenir à s'assurer que ceux-ci ne définissent rien. J'ai également essayé de surcharger la propriété Cursor et de dire 'only set to default or no cursors' et cela n'a pas fonctionné non plus.

Toute aide est appréciée.

Ian

+0

Cela arrive-t-il ailleurs? Par exemple, lorsque vous naviguez sur des hyperliens ou dans d'autres applications? Ou est-ce * seulement * que cela se produit dans votre application? Si c'est le cas, c'est probablement plus un problème de système d'exploitation ... – Razzie

+0

Il s'agit d'une application multiplateforme. Si vous lisez mon commentaire à teknohippy ... Le problème est exagéré avec le dessin manuel d'éléments et le hottracking. J'ai essayé de remplacer WndProc pour retourner si le (m.Msg == 0x020) pour changer le curseur. Quelque chose change la main, mais je ne sais pas quoi. – Ian

+0

À quoi la propriété Activation de ListView est-elle définie? Si c'est OneClick, le contrôle lui-même changera le curseur en curseur de la main lorsque vous passez la souris sur un élément. – EricLaw

Répondre

7

Le problème est que C# ListView Control est fondamentalement un wrapper autour du contrôle d'affichage de liste de fenêtres. Ainsi, lorsque nous positionnons le curseur sur Arrow, le contrôle listview sous-jacent est toujours défini par défaut sur le curseur Hand tandis que notre paramètre dans la classe C# ListView veut que ce soit une flèche. C'est pourquoi nous avions ce scintillement, parce que le contrôle sous-jacent revenait à Hand.

Voici le code que vous devez ajouter:

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); 

Il est très important que vous appelez la SendMessage de l'événement onLoad de votre formulaire, car alors le contrôle ListView sous-jacente est complètement initialisé!

C'est assez simple en fait, passez une bonne journée! :)

+0

MTG. Merci pour cela, je vais y jeter un coup d'oeil et l'essayer. Si ça marche, ça va marquer la réponse pour le futur :) Je suppose qu'une autre façon serait de remplacer WndProc en utilisant la même uint ... – Ian

+0

Surcharge WndProc ne fera rien. SendMessage est utilisé pour mettre à jour les propriétés de Windows Common Control. LVM_SETHOTCUROSR est une propriété Pas un message Windows, donc wndproc override ne sera pas utile du tout. –

+0

Très bien. Puis-je demander d'où vous avez trouvé cette information? Jamais trouvé un endroit agréable pour localiser toutes ces valeurs constantes magiques ... – Ian

0

Sans avoir essayé, les curseurs sont normalement modifiés en réponse à WM_ setCursor, alors peut-être que vous êtes en conflit avec le traitement par défaut WM_ setCursor de ListView. Je voudrais essayer de créer un nouveau UserControl dérivant de ListView, puis piéger WM_ SETCURSOR dans WndProc et voir si cela aide.

Questions connexes