我的应用程序采用 C# 3.5、Winforms 编写,但这很可能需要 P/Invoke,因此它与 .NET 的关系并不严格。
我通过 ContextMenu
和 MenuItem
类创建了所有者绘制的菜单项。一切都很好,但对于某些项目,我想创建一个小动画(显示有一个与该项目关联的进程正在运行)。不幸的是,上面提到的两个类没有提供 Invalidate()
方法或类似的方法。
到目前为止,我最好的想法是在第一个 OnDraw 上 P/Invoke WindowFromDC()
,保存生成的句柄,然后定期在该句柄上调用 InvalidateRect()
,直到菜单关闭。
这看起来有点hackish,我还没有尝试过,想知道是否有更优雅的方法。
最佳答案
我可能建议调用GetMenuItemRect
function,而不是使用WindowFromDC
检索特定菜单项的边界矩形。然后,您可以通过rectangle structure由该函数填充到 InvalidateRect
function .
我同意这个解决方案有点“hackish”的感觉,但我怀疑这是因为 Windows API 提供的菜单不是设计成动画的。 .NET Framework 提供的菜单包装类不包含 Invalidate
函数,因为这是一个相对罕见的用例。通常,每次显示弹出菜单时更改所有者绘制的菜单项就足够了(通过处理 WM_INITMENUPOPUP
message )。据我所知,上述建议是最“正确”的方式,可以做你想做的事。
如果您确实需要对绘制菜单进行如此多的控制,那么您可能是少数几个认为俗气的 MenuStrip
/ContextMenuStrip
类实际上更好的人之一。由于它们完全在托管代码中实现,ToolStripItem
类提供了一个有效的 Invalidate
method .
关于.net - 如何在所有者绘制的菜单项中提供动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4814434/