【问题标题】:Non-Square Icon on Windows Form?Windows 窗体上的非方形图标?
【发布时间】:2012-05-08 15:51:44
【问题描述】:

是否可以在 Windows 窗体的左上角显示与标准 16X16 像素图标不同形状的图标?

似乎 Skype 的图标比标准宽得多:

是否可以在 Windows 窗体应用程序中使用?

【问题讨论】:

  • 一些第三方工具当然允许这样做,但我假设你的意思是 vanilla C#?
  • 它可能会捕获一些非客户区窗口消息来执行此操作,例如WM_NCPAINT - 看到这个问题:Draw all the Non-Client area in C#
  • 请注意,Rup 的链接问题是针对 WPF 而这个问题是针对 WinForms。
  • @Joshua 我虽然答案涵盖了两者?尽管没有那么详细。特别是 Ben's answer 用于 WinForms。实际上我收回了一切——听起来汉斯的评论是现在要走的路。

标签: c# .net winforms icons


【解决方案1】:

你可以这样做,但它可能比拥有一个更大的图标更值得。

Hans 发布了一篇文章,粗略地指出了找出答案所需的信息,但没有发布答案本身,所以我会澄清一下。

执行此操作的旧(Vista 之前)方法是覆盖表单上的WndProc 方法并处理WM_NCPAINT 消息。请注意,这意味着您现在负责绘制 整个 窗口框架(窗口边框、标题、关闭/恢复图标等...),而不仅仅是图标 - 即这是很多努力做一件相对较小的事情。

较新的(Vista 后)方法是 use the DWM API - 请注意,此 API 不直接通过 .Net 框架公开,因此您需要在 C# 中为此使用 P/Invoke。您要做的一点是标题为“在扩展框架窗口中绘图”的部分,您可以在其中将负责绘制的区域扩展到正常客户区域之外并进入窗口框架。这比以前少了麻烦(你不必画关闭按钮之类的东西),但仍然意味着你要对很多你通常不会做的事情负责,比如调整大小的命中盒测试和移动。

基本上它远没有提供更大的图标那么简单,而且对于大多数应用程序来说,它可能比它的价值要付出更多的努力,但是你可以在 C# 中做到这一点,如果你真的想尝试一下,那篇文章应该可以帮助你开始.

【讨论】:

    【解决方案2】:

    我知道您正在寻找一种纯代码方式来执行此操作,但我邀请您查看 DevExpress manged(是的,这是第三方,请原谅我),只需 google 即可。我看到了这个帖子,我开始在 devexpress 上提问并获得了一些您可能感兴趣的令人印象深刻的结果。

    这是我放入的票...http://www.devexpress.com/Support/Center/Issues/ViewIssue.aspx?issueid=Q399941

    这是结果...http://www.devexpress.com/Support/Center/GetSCAttachment.ashx?id=684270b5-faed-415e-9010-64338523f8cf

    到目前为止,我在 Xp、Vista 和 Windows 7 上使用了它,仅使用 winforms 没有问题。

    如果 Windows API 在不同版本的 Windows 上无法如您所愿,我希望这对您有所帮助或为您提供另一种选择。

    谢谢, 大卫

    【讨论】:

      【解决方案3】:

      不要认为它是一个图标,如果你指的是 ICO 图像格式。 考虑到 Skype 窗口绝对是 ownerdraw 窗口,该图像可能是您想要的任何格式。

      诀窍基本上是渲染图像,跳过“图标”的某种颜色(背景颜色)的像素,因此以“透明度”渲染它。

      这篇文章可以给你一个提示:

      Drawing Transparent Images and Shapes using Alpha Blending

      它很旧,但总是很好。

      【讨论】:

      • 是的,你可以这样做。但这不会让它进入窗口的标题/标题栏。
      • @CodyGray:你确定在 Skype 窗口(提供为示例)它是标题栏吗?或者它是一个表现类似于标题栏的表面?
      • 哦,这绝对是定制的标题栏,不是标准的。 Windows 决定了标准标题栏上显示的图标的大小——它始终等同于SM_CXSMICON by SM_CYSMICON。但它看起来像一个,你并没有真正解释如何实现这种效果。
      【解决方案4】:

      是的。覆盖 WndProc 并实现 WM_NCPAINT。

      【讨论】:

      • 不,很久以前就停止工作了。 Windows 主题不再支持此功能。
      • @HansPassant“停止工作”?我看不到任何证据表明 documentation 不再支持此功能,尽管现在似乎有更好的方法来实现这一点。
      • @Justin - 它与 Aero 不同。
      • 停止工作是什么意思?如果你处理 WM_NCPAINT 你只是在你的窗口上禁用了主题。
      • 在这种情况下,我可以称 Office 2007 已损坏。这是同一枚硬币的两面。
      猜你喜欢
      • 2013-02-08
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多