2008-11-13 6 views
2

Vista a introduit une nouvelle API pour afficher un texte dans le contrôle Affichage de la liste lorsqu'il ne contient aucun élément. Comme les états de la bibliothèque MSDN, je devrais traiter la notification LVN_GETEMPTYMARKUP.ListView Texte de balisage vide

Dans le contrôle ListView hérité de la méthode WndProc est outrepassée:

protected override void WndProc(ref Message m) { 
    try { 
    if(m.Msg == 78 /* WM_NOTIFY */) { 
     var nmhdr = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR)); 
     if(nmhdr.code == -187 /* LVN_GETEMPTYMARKUP */) { 
     var nmlvemptymarkup = 
      (NMLVEMPTYMARKUP)Marshal.PtrToStructure(m.LParam, typeof(NMLVEMPTYMARKUP)); 
     nmlvemptymarkup.szMarkup = "The ListView is empty."; 
     m.Result = (IntPtr)1; 
     } 
    } 
    } finally { 
    base.WndProc(ref m); 
    } 
} 

Cependant, cela ne fonctionne pas (même si elle ne jette pas une exception). En fait, je ne reçois jamais nmhdr.code est égal à -187. Des idées?

+0

Pourriez-vous publier un lien vers la page sur MSDN? – configurator

+0

http://msdn.microsoft.com/fr-fr/magazine/cc163384.aspx –

Répondre

0

J'ai beaucoup lutté avec celui-ci moi-même.

Pour que le code dans la question d'origine fonctionne, marquez la structure NMLVEMPTYMARKUP avec [StructLayout (LayoutKind.Sequential, CharSet = CharSet.Unicode)] (le CharSet.Unicode est important).

De même, après avoir défini les valeurs de balisage, appelez Marshal.StructureToPtr (nmlvemptymarkup, m.LParam, false) pour recopier les données dans le tampon pointé par LParam.

0

Avez-vous essayé d'appeler SetWindowTheme sur le contrôle, comme indiqué dans this article?

+0

Défini sur "Explorateur". –

0

Une solution alternative (de sorte que vous ne devez pas surveiller le WndProc), serait d'ajouter un gestionnaire de peinture quelque chose comme ceci:

listview_onPaint(object sender, eventargs e) 
{ 
    if (listview.items.count <= 0) 
    { 
    e.graphics.drawstring("The Listview is empty"); //put all the proper args in here! 
    } 
} 

des thats de la mémoire, mais vous devriez obtenir l'idée.

espérons que cela aide.

2

WM_NOTIFY Les messages ne sont pas envoyés au contrôle (listview), mais plutôt au parent (le formulaire). Cela a du sens dans le monde Win32 parce que ces messages sont très utiles pour intercepter mais il était modérément douloureux de sous-classer le contrôle, en particulier lorsque vous vouliez un comportement différent dans chaque cas. Avec .NET ce n'est plus le cas. Commodément, le traitement standard des messages .NET «reflète» le message au niveau du contrôle, de sorte que vous pouvez intercepter le message et le gérer dans le WndProc du contrôle - mais le message reflété n'est plus WM_NOTIFY (0x004E), mais plutôt WM_REFLECT | WM_NOTIFY (0x204E). Par conséquent, si vous modifiez votre WndProc pour rechercher cette valeur à la place, cela devrait fonctionner.

Questions connexes