2011-01-30 95 views
0

我在System.Windows.Forms.Panel中使用AutoScroll功能来构建自定义的可滚动控件。一切工作正常,除了当我将鼠标悬停在滚动条上时,光标变为“忙碌”游标。似乎没有可能重写此行为,因为我无法获得滚动条实例(它们在ScrollableControl基类中)。我尝试将Application.UseWaitCursor设置为false,但这不会改变任何内容。鼠标悬停在ScrollableControl的滚动条上时忙光标

可能值得一提的是,此控件在ActiveX控件内运行,而ActiveX控件又在Outlook内运行。其他一切都按预期工作,只是这个小东西让我失望...

任何想法?所有帮助赞赏!

回答

0

用Spy ++对此进行故障排除,注意WM_SETCURSOR消息。滚动条没有任何理由改变游标,你会看到它返回FALSE(在Spy ++跟踪中显示为'fHaltProcessing:False)。这导致消息被发送到控件的父级。跟踪跟踪,最终你会碰到一个返回TRUE的父窗口。这是改变光标的那个。

赔率是体面的,这将是Outlook。不知道你的问题为什么它认为用户界面已经死亡。从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 2011-01-30 18:52:43