2008-11-13 4 views
2

Vista представила новый API для отображения текста в элементе управления представлением списка, когда у него нет никаких элементов. Как заявляет библиотека MSDN, я должен обработать уведомление LVN_GETEMPTYMARKUP.ListView Empty Markup Text

В унаследованной ListView управления метод WndProc является перекрываться:

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

Тем не менее, он не работает (хотя это не выбрасывает любое исключение). На самом деле я никогда не получаю nmhdr.code равно -187. Есть идеи?

+0

Не могли бы вы разместить ссылку на страницу на MSDN? – configurator 2008-11-13 15:52:05

+0

http://msdn.microsoft.com/en-us/magazine/cc163384.aspx – 2008-11-13 16:30:42

ответ

0

Я много боролся с этим.

Чтобы получить код в исходном вопросе для работы, отметьте структуру NMLVEMPTYMARKUP с помощью [StructLayout (LayoutKind.Sequential, CharSet = CharSet.Unicode)] (важно CharSet.Unicode).

Кроме того, после установки значений разметки вызовите Marshal.StructureToPtr (nmlvemptymarkup, m.LParam, false), чтобы скопировать данные обратно в буфер, на который указывает LParam.

0

Альтернативное решение (так что вам не придется следить за WndProc), будет добавить обработчик краски что-то вроде этого:

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! 
    } 
} 

Thats из памяти, но вы должны получить идею.

надеюсь, что это поможет.

2

WM_NOTIFY сообщения не отправляются в элемент управления (список), а скорее в родительский (форма). Это имело смысл в мире Win32, потому что эти сообщения очень полезны для перехвата, но это было умеренно болезненно для подкласса элемента управления, особенно когда вы хотели различного поведения в каждом случае. С .NET это уже не так.

Удобно, что стандартная обработка сообщений .NET «отражает» сообщение обратно в элементе управления, так что вы можете перехватывать сообщение и обрабатывать его в WndProc элемента управления, но отраженное сообщение больше не WM_NOTIFY (0x004E), но WM_REFLECT | WM_NOTIFY (0x204E).

Так что если вы измените свой WndProc, чтобы искать это значение, вместо этого он должен работать.

 Смежные вопросы

  • Нет связанных вопросов^_^