2008-11-13 5 views
2

Vista에는 항목이 없을 때 목록보기 컨트롤에 텍스트를 표시하는 새로운 API가 도입되었습니다. MSDN 라이브러리 상태로, 나는 LVN_GETEMPTYMARKUP 알림을 처리해야합니다. 상속 ListView 제어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

+0

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

답변

0

나는 이것으로 많은 어려움을 겪었습니다.

원래 질문의 코드를 작동 시키려면 NMLVEMPTYMARKUP 구조체를 [StructLayout (LayoutKind.Sequential, CharSet = CharSet.Unicode)] (CharSet.Unicode가 중요 함)로 표시하십시오.

또한 마크 업 값을 설정 한 후 Marshal.StructureToPtr (nmlvemptymarkup, m.LParam, false)을 호출하여 LParam이 가리키는 버퍼로 데이터를 다시 복사하십시오.

0

this article에 표시된대로 SetWindowTheme을 컨트롤에 호출 해 보았습니까?

+0

"탐색기"로 설정하십시오. –

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

이잖아,하지만 당신은 아이디어를 얻을 것이다.

몇 가지 도움이 되길 바랍니다.

2

WM_NOTIFY 메시지는 컨트롤 (목록보기)이 아니라 부모 (양식)로 보내집니다. 이것은 Win32 세계에서 의미가 있습니다. 왜냐하면 이러한 메시지는 요격하기에 매우 유용하기 때문에 컨트롤을 서브 클래 싱하는 것은 다소 힘들었습니다. 특히 각 경우마다 다른 동작을 원할 때 그렇습니다. 더 이상 .NET이 아닙니다.

편리하게도 표준 .NET 메시지 처리는 메시지를 가로 채어 컨트롤의 WndProc에서 처리 할 수 ​​있도록 메시지를 다시 반영합니다. 그러나 반영된 메시지는 더 이상 WM_NOTIFY (0x004E)이 아니며 하지만 오히려 WM_REFLECT | WM_NOTIFY (0x204E).

그래서 WndProc을 수정하여 그 값을 찾으면 작동합니다.