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