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

标签 .net animation menu contextmenu ownerdrawn

我的应用程序采用 C# 3.5、Winforms 编写,但这很可能需要 P/Invoke,因此它与 .NET 的关系并不严格。

我通过 ContextMenuMenuItem 类创建了所有者绘制的菜单项。一切都很好,但对于某些项目,我想创建一个小动画(显示有一个与该项目关联的进程正在运行)。不幸的是,上面提到的两个类没有提供 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/

相关文章:

javascript - 防止点击动画过多的超时功能

html - CSS 子菜单用每个 ul 丢弃一个像素

android - 如何更改 Android 的选项菜单位置

html - 如何在不使用简单的 HTML/CSS 或 XML 中使用 iFrame 或 PHP 的情况下重复菜单?

c# - .NET GZipStream 解压缩生成空流

c# - 使用 RGB 值设置 Excel 单元格颜色

c# - Item 和 this[] - 已声明同名成员

.net - NHibernate 自定义 SQL 对象创建

animation - 带渐变的 CSS3 动画

ios - UIView动画滑入