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

时间:2011-01-27 09:09:08

标签: .net animation menu contextmenu ownerdrawn

我的应用程序是在C#3.5,Winforms中,但是这很可能需要P / Invoke,所以它并不是严格依赖于.NET。

我已通过ContextMenuMenuItem课程创建了所有者绘制的菜单项。一切都很好,但对于一些项目,我想创建一个小动画(显示有一个进程正在运行,与项目相关联)。不幸的是,上面提到的两个类没有提供Invalidate()方法或类似的东西。

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

这看起来有点像哈希,我还没有尝试过,并且想知道是否有更优雅的方式。

1 个答案:

答案 0 :(得分:3)

我可能建议调用GetMenuItemRect function来检索特定菜单项的边界矩形,而不是使用WindowFromDC。然后,您可以将该函数填充的rectangle structure传递给InvalidateRect function

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

如果您真的需要对绘图菜单进行大量控制,那么您可能是为数不多的那些俗气MenuStrip / ContextMenuStrip类实际上更好的人之一。由于它们完全在托管代码中实现,因此ToolStripItem类提供了有效的Invalidate method