2012-05-14 112 views
1

我有一個WinForms應用程序和一個用戶控件,其中我根據其位置動態更改光標。創建我的自定義光標作爲用戶控制的靜態成員,像這樣:光標未在Windows窗體中更新

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

然後在OnMouseMove覆蓋我設置相應光標,就像這樣:

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

當我啓動應用程序,它工作正常。但是,在幾次光標更改(大約20)之後,它會保留默認(箭頭)位圖,並且不會再進行更改。但最奇怪的是,在發生這種情況後,我檢查當前Cursor值的Handle屬性,它等於_openHandCursor對象的句柄!所以看起來屬性的值仍然被正確設置,但屏幕上的光標位圖不會被更新。有關這種奇怪行爲的任何建議?

+0

這個代碼有些神祕。遊標作爲byte []嵌入到資源中,而不是任何具有Handle屬性的東西。手動編輯Resources.Designer.cs文件嗎? –

+0

@HansPassant查看我的評論@ max的答案 - 我最初使用的資源是一個Icon。 –

回答

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屬性獲取器創建),因此它將被垃圾收集。 Cursor類定義了終結器,它通過調用DestroyCursor()銷燬句柄,使其無效。現在您創建的Cursor具有相同的句柄,但它不知道句柄不再有效。 當您嘗試設置無效光標時,OS只使用默認光標。

+0

很好的答案,謝謝。我在'Cursor'構造函數中使用的資源最初是一個'Icon',顯然這是不正確的。我改變了它,所以現在有一個正確的'.cur'文件(以'byte []'形式),然後在'Cursor'構造函數重載中使用'System.IO.MemoryStream'對象。 –

0

嘗試更改UserControls的MouseEnterMouseLeave事件中的光標。

的僞代碼:

MouseEnter Event

Change mouse cursor to hand

MouseLeave Event

Change mouse cursor to normal

here