2011-01-30 10 views
0

AutoScrollの機能をSystem.Windows.Forms.Panelに使用して、スクロール可能なカスタムコントロールを作成しています。スクロールバーの上にカーソルを置くと、カーソルが「ビジー」カーソルに変わるという事実を別にすれば、すべてがうまくいきます。スクロールバーのインスタンスを保持できないので(これは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コントロールの外で親階層の上にトリガーされているように見えるので、このバンダイは今のところトリックです。それを指摘してくれてありがとう! – Phil

関連する問題