.net 如何在所有者绘制的菜单项中提供动画?

.net 如何在所有者绘制的菜单项中提供动画?,.net,animation,menu,contextmenu,ownerdrawn,.net,Animation,Menu,Contextmenu,Ownerdrawn,我的应用程序是C#3.5,Winforms,但这很可能需要p/Invoke,所以它与.NET没有那么严格的联系 我已经通过ContextMenu和MenuItem类创建了所有者绘制的菜单项。这一切都很好,但对于某些项目,我想创建一个小动画(显示有一个进程正在运行,与该项目相关)。不幸的是,上述两个类没有提供Invalidate()方法或任何类似的方法 到目前为止,我最好的办法是在第一个OnDraw上p/InvokeWindowFromDC(),保存生成的句柄,然后定期调用句柄上的invalida

我的应用程序是C#3.5,Winforms,但这很可能需要p/Invoke,所以它与.NET没有那么严格的联系

我已经通过
ContextMenu
MenuItem
类创建了所有者绘制的菜单项。这一切都很好,但对于某些项目,我想创建一个小动画(显示有一个进程正在运行,与该项目相关)。不幸的是,上述两个类没有提供
Invalidate()
方法或任何类似的方法

到目前为止,我最好的办法是在第一个OnDraw上p/Invoke
WindowFromDC()
,保存生成的句柄,然后定期调用句柄上的
invalidate()
,直到菜单关闭


这似乎有点骇人,但我还没有尝试过,我想知道是否有更优雅的方法。

与其使用
WindowFromDC
,不如调用来检索特定菜单项的边框。然后,可以将该函数填充的内容传递给

我同意这个解决方案有点“黑客”的感觉,但我怀疑这是因为Windows API提供的菜单不是设计成动画的。NET Framework提供的菜单包装器类不包括
Invalidate
函数,因为这是一个相对罕见的用例。通常,每次显示弹出菜单(通过处理)时,用户绘制的菜单项都可以更改。据我所知,上述建议是做你想做的事情的最“正确”的方式


如果您真的需要对绘图菜单进行如此多的控制,那么您可能是为数不多的几个人之一,对他们来说,俗气的
MenuStrip
/
ContextMenuStrip
类实际上更好。由于它们完全是在托管代码中实现的,
ToolStripItem
类提供了一个工作模式。

是的,但是它们在完全拥有绘制时存在问题。至少人们在网上是这么说的,我也没法把它全部画出来。在我的例子中,我正在做一些非常繁重的定制——两行不同字体的文本;大型动画图标;也许是别的。菜单项的高度甚至不尽相同(有些只有一行文字)。@Vilx:Hmm,这很有趣。老实说,我真的不是一个很会招牌的人。我已经做了很多标准菜单的所有者绘图来获得图标(呻吟),但是我已经从我的工具箱中删除了
MenuStrip
及其伙伴。我在网上读到的内容似乎表明,它们提供了比API菜单更好的可定制性/所有者吸引支持。它们的主要优点是它们具有正确的体系结构,实际上是面向对象的,这意味着您可以将
ToolStripItem
子类化,并根据需要绘制自己的图形。您可能试图将
ToolStripMenuItem
子类化,这是一个更有限的子类。啊,可能是这样。我确实尝试过将
ToolStripMenuItem
子类化。但是
ContextMenuStrip
是否可以包含除
ToolStripMenuItem
之外的项目?@Vilx:我不知道。它直接从
ToolStrip
控件继承,该控件返回
ToolStripItemCollection
。所以在理论上,是的。但我不确定它是否不需要
ToolStripItem
的某个子类。有时候,人们会把OOP搞错