2011-01-30 3 views
0

System.Windows.Forms.PanelAutoScroll 기능을 사용하여 사용자 지정 스크롤 가능한 컨트롤을 작성하고 있습니다. 스크롤 막대 위로 마우스를 가져 가면 커서가 '바쁜'커서로 바뀌는 것을 제외하고는 모든 것이 올바르게 작동합니다. 스크롤 바 인스턴스를 가져올 수 없으므로이 동작을 재정의하는 것이 가능하지 않은 것 같습니다 (그들은 ScrollableControl 기본 클래스 안에 있습니다). Application.UseWaitCursor을 false로 설정하려고했지만 아무 것도 변경되지 않습니다.ScrollableControl에서 스크롤 막대 위에 마우스를 놓을 때 바쁜 커서

이 컨트롤은 Outlook 내에서 실행되는 ActiveX 컨트롤 내에서 실행 중임을 언급 할 가치가 있습니다. 다른 모든 것은 예상대로 작동하지만,이 작은 일은 저를 던지고 있습니다.

아이디어가 있으십니까? 모든 도움을 주셔서 감사합니다!

답변

0

Spy ++에서이 문제를 해결하려면 WM_SETCURSOR 메시지에주의하십시오. 스크롤 바는 커서를 변경할 이유가 없으며, FALSE를 반환합니다 (Spy ++ 추적에서 'fHaltProcessing : False'로 표시됨). 어떤 메시지가 컨트롤의 부모에게 보내집니다. 추적을 따라 가면 TRUE를 반환하는 부모 창으로 실행됩니다. 그것이 커서를 변경 한 것입니다.

확률은 Outlook입니다. 질문이 왜 UI가 죽었다고 생각하는지 전혀 모르겠습니다. Panel에서 자신의 클래스를 파생시키고 WndProc()를 재정 의하여 메시지를 잡아내는 것은 일종의 해결 방법입니다. 나는 확실히 Outlook에 우선 초점을 맞출 것이다.

using System; 
using System.Windows.Forms; 

class MyPanel : Panel { 
    protected override void WndProc(ref Message m) { 
     if (m.Msg == 0x20) { // Trap WM_SETCURSOR 
      Cursor.Current = Cursors.Default; 
      m.Result = (IntPtr)1; 
     } 
     else base.WndProc(ref m); 
    } 
} 
+0

한스, 귀하의 조언에 감사드립니다. 나는 Spy ++로 그것을 검사했고, AutoScroll을 가진 윈도우는 TRUE를 반환하는 것으로 보인다. 그러나 나는 WndProc 메시지를 잡을 수있는 것 같지 않습니다 ... – Phil

+0

죄송합니다, 내 잘못 - 나는 그들을 실제로 (WM_SETCURSOR, 0x20) 함정 수 있으며,이 문제를 해결합니다. 원본 메시지는 ActiveX 컨트롤 외부에서 상위 계층 구조로 트리거 된 것처럼 보이므로이 bandaid는 현재 트릭을 수행합니다. 그것을 지적 해 주셔서 다시 한번 감사드립니다! – Phil

관련 문제