3

我的应用程序在 C# 3.5 Winforms 中,但无论如何这很可能需要 P/Invoke,因此它与 .NET 并没有那么严格的联系。

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

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

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

4

1 回答 1

3

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

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

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

于 2011-01-27T09:29:16.280 回答