2010-01-07 7 views
0

TreeView, ListBox에서 또는 내 Google에서 ScrollBar를 검색하는 것으로 보이지만 ScrollBar는 컨트롤의 일부로 간주되지 않습니다.ScrollBar 위로 이동하면 TreeView MouseLeave 이벤트가 발생합니다.

저는 사용자 정의 컨트롤에 넣는 TreeView가 있으며, Dock Fill입니다. 그래서 거기에 우리의 모든 논리를 한 곳에서 관리하는 사용자 정의 TreeView 역할을합니다.

우리 프로그램의 일부에서는 MouseEnter 이벤트를 기반으로 슬라이드 아웃하고 MouseLeave 이벤트로 다시 슬라이드합니다. 그러나 현재 대체 할 타사 라이브러리의 TreeView를 사용하고 있습니다.

그래서 모든 것을 Windows TreeView로 옮겼지만 신뢰할 수있는 MouseLeave 캡처 방법을 찾지 못했습니다. 전체 TreeView, 스크롤바가 포함 된 경우에만 해당됩니다.

여러 픽셀이있는 패널에서 패널을 래핑하고 패널의 MouseLeave를 캡처하는 해킹 된 솔루션을 보았습니다.하지만이 상황에서 Microsoft가 의도 한 바가 거의 없다고 생각합니다. 즉

:

스크롤 컨트롤에 대한 MouseEnter이나하는 MouseLeave을 발생하지 않으며, 즉 스크롤 막대를 사용할 수없는 사용자 이후 사용할 수 없게 제어를 슬라이딩 MouseEnter /하는 MouseLeave를 사용합니다.

이 상황을 처리하는 가장 좋은 방법은 무엇입니까?

답변

1

Spy ++를 실행하고 Treeview 창을 선택하십시오. 마우스를 스크롤 막대 위로 이동하십시오. 거기에 많은 활동, WM_NCMOUSEMOVE는 나에게 좋은 것 같습니다. WndProc() 오버라이드에서 그것을 잡아라.

+0

이것은 .net이고 WndProc 또는 WM_NCMOUSEMOVE에 대한 액세스 권한이 없습니다. –

+1

WndProc()은 파생 클래스에서 오버로드 할 수있는 TreeView 클래스의 메서드입니다. WM_NCMOUSEMOVE는 숫자이며, 0xa0입니다. MSDN 문서를 확인하십시오. –

1

목록 상자 아래에 스크롤 막대를 포함하는 ListBox의 정확한 크기로 패널을 배치하십시오. 그런 다음 mouseleave 이벤트를 패널에 입력하십시오.