1

カーソルの位置に基づいて動的にカーソルを変更するユーザー コントロールを備えた WinForms アプリケーションがあります。次のように、カスタム カーソルをユーザー コントロールの静的メンバーとして作成します。

private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );

次に、OnMouseMoveオーバーライドで、次のように適切なカーソルを設定します。

this.Cursor = <some condition> ? _openHandCursor : Cursors.Default;

アプリケーションを起動すると、正しく動作します。ただし、カーソルを数回 (約 20 回) 変更した後は、デフォルト (矢印) のビットマップのままで、それ以上変更されません。しかし、最も奇妙なことは、これが発生した後Handle、現在の値のプロパティを確認すると、オブジェクトCursorのハンドルと等しいことです! _openHandCursorしたがって、プロパティの値はまだ正しく設定されているようですが、画面上のカーソル ビットマップは更新されません。この奇妙な動作について何か提案はありますか?

4

2 に答える 2

1

変化する

private static Cursor _openHandCursor = new Cursor( Properties.Resources.openHand.Handle );

private static Cursor _openHandCursor = Properties.Resources.openHand;

Cursorオブジェクト ( )を作成するnew Cursor (<Handle>)と、リソースからのカーソルと同じハンドルが再利用されます。元のカーソル(プロパティゲッターによって作成された)への参照を保存しないためProperties.Resources.openHand.Handle、ガベージコレクションが行われます。 Cursorclass は、 を呼び出してハンドルを破棄し、DestroyCursor()無効にするファイナライザーを定義します。作成した は同じハンドルを持っていますCursorが、ハンドルが無効であることを認識していません。無効なカーソルを設定しようとすると、OSはデフォルトのカーソルを使用します。

于 2012-05-14T13:16:00.930 に答える
0

UserControlsのMouseEnterおよびイベントでカーソルを変更してみてください。MouseLeave

疑似コード:

MouseEnter Event

Change mouse cursor to hand

MouseLeave Event

Change mouse cursor to normal

こちらをご覧ください

于 2012-05-14T13:14:33.117 に答える