2011-01-27 28 views
3

我的應用程序使用C#3.5,Winforms,但是這很可能需要P/Invoke,所以它不是嚴格依賴於.NET。如何在自繪菜單項中提供動畫?

我已經通過ContextMenuMenuItem類創建了自繪菜單項。一切運作良好,但對於一些項目,我想創建一個小動畫(顯示有一個流程正在運行,與該項目相關聯)。不幸的是,上述兩類不提供Invalidate()方法或類似的東西。

到目前爲止,我的最好主意是在第一個OnDraw上P/Invoke WindowFromDC(),保存生成的句柄,然後定期在句柄上調用InvalidateRect(),直到菜單關閉。

雖然這看起來還挺有趣,但我還沒有嘗試過,並想知道是否有更優雅的方式。

回答

3

而不是使用WindowFromDC,我可能會建議調用GetMenuItemRect function來檢索特定菜單項的邊界矩形。然後,您可以將由該函數填充的rectangle structure傳遞給InvalidateRect function

我同意這個解決方案對它有一些「駭客」的感覺,但我懷疑這是因爲Windows API提供的菜單沒有設計爲動畫。由.NET Framework提供的菜單包裝類不包含Invalidate函數,因爲這是一個相對罕見的用例。通常,每次顯示彈出式菜單時(通過處理WM_INITMENUPOPUP message),自繪菜單項就可以更改。據我所知,上述提案是做你想做的事情最「正確」的方式。

如果您確實需要對繪圖菜單進行大量的控制,那麼您可能是爲數不多的幾個人中的一員,這些人實際上更喜歡這些類。由於它們完全是在託管代碼中實施的,因此ToolStripItem課程提供了一個工作Invalidate method

+1

是的,但他們在完全自主提取時遇到問題。至少這就是人們在網上說的話,我也無法把它畫出來。在我的情況下,我正在做一些非常沉重的自定義 - 兩行不同字體的文本;大的最好動畫圖標;也許別的東西。菜單項甚至不是全部相同的高度(有些只有一行文本)。 – 2011-01-27 09:51:09