2010-08-02 2 views
5

문제를 해결할 수 없어서이 질문을 다시 게시하고 있습니다 (원래 here).컨트롤의 ScrollBar 위로 이동할 때 MouseLeave 이벤트가 발생합니다.

TreeView, ListBox 또는 내 Google 검색에서 ScrollBar가있는 것으로 보이지만 ScrollBar는 컨트롤의 일부로 간주되지 않습니다.

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

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

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

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

:

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

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

이전 질문에서 Spy ++를 사용하고 WndProc()에 첨부하여 ScrollBar의 MouseEnter/MouseLeave를 처리하려고 조언을 받았습니다.

그러나 이것은 Spy ++가 폼 수준이나 제어 수준에서 WndProc()에서 실행되지 않았 음을 보여주는 메시지로 작동하지 않았습니다. .NET에서 ScrollBar를 볼 수없는 것입니다.

WndProc()를 사용하면 이러한 단순한 요청에 비현실적인 것처럼 보입니다. 다른 방법이 있습니까? 아니면 WndProc()이 유일한 방법 일 텐데요, 실제로 이걸 달성하고 어떻게 보여줄 수 있습니까?

답변

4

깨끗한 해결책은 없습니다. 패널 트릭이 작동하지 않습니다. 사용자가 마우스를 빠르게 움직이면 완전히 빠져 나옵니다.

풋트. MouseEnter를 얻으면 200 밀리 초 타이머를 시작하십시오. Tick ​​이벤트에서 마우스가 여전히 트리보기를 가리키고 있는지 확인하십시오. 예를 들면 다음과 같습니다.

private void treeView1_MouseEnter(object sender, EventArgs e) { 
     timer1.Enabled = true; 
     treeView1.Width = 220; 
    } 

    private void timer1_Tick(object sender, EventArgs e) { 
     Point pos = treeView1.PointToClient(Cursor.Position); 
     if (!treeView1.DisplayRectangle.Contains(pos)) { 
      timer1.Enabled = false; 
      treeView1.Width = 50; 
     } 
    } 

Application.Idle 이벤트가 너무 길어서 약간 어색합니다.

+0

이것은 완벽하게 작동했습니다. 감사합니다! –

2

팁에 동일한 문제가 발생했기 때문에 timer_tick 이벤트를 수정하여 너비에 20을 추가하여 스크롤바를 포함 시켰습니다.

private void tmrListPos_Tick(object sender, EventArgs e) 
    { 
     Point posLB = clbPlants.PointToClient(Cursor.Position); 
     Rectangle rectPlants = clbPlants.DisplayRectangle; 
     rectPlants.Width = rectPlants.Size.Width + 20; 
     if (!rectPlants.Contains(posLB)) 
     { 
      tmrListPos.Enabled = false; 
      clbPlants.Size = clbPlants.MinimumSize; 
     } 
    } 
관련 문제