Windows窗体上的非正方形图标?

10

有没有可能在Windows Form的左上角显示一个不同于标准16X16像素图标形状的图标?

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

enter image description here

在Windows Forms应用程序中是否可能实现这一点?


一些第三方工具肯定可以实现这个功能,但我猜你是指原生的C#? - KingCronus
1
可能是通过捕获一些非客户区窗口消息来实现的,例如 WM_NCPAINT - 参见此问题:在 C# 中绘制所有非客户区域 - Rup
5
我可以翻译这篇文章。这是一份有关Windows API的文档,旨在帮助开发人员了解如何使用操作系统的各种功能。该文档的内容包括函数、结构和常量的定义以及它们的使用方法。阅读此文档可以帮助开发人员编写能够与Windows操作系统交互的应用程序。 - Hans Passant
请注意,Rup的链接问题是针对WPF,而这个问题是针对WinForms。 - Joshua
@ Joshua 我认为答案都涵盖了?尽管没有详细说明。特别是Ben's answer,它是针对WinForms的。实际上,我撤回我的所有说法 - 现在看来Hans的评论是正确的方式。 - Rup
显示剩余2条评论
4个回答

4
你可以这样做,但为了获得更大的图标而付出的努力可能不值得。
Hans发布了一篇文章,大致指出了需要找到答案所需的信息,但并没有发表答案,因此我会进行澄清。
旧的(Vista之前)方法是覆盖窗体上的 WndProc 方法并处理 WM_NCPAINT 消息。请注意,这意味着您现在负责绘制整个窗口框架(窗口边框、标题、关闭/还原图标等),而不仅仅是图标 - 也就是说,这需要花费很多精力才能完成相对较小的事情。
较新的(Vista之后)做法是使用DWM API - 请注意,该API未直接通过.Net Framework公开,因此您需要在C#中使用P / Invoke。您想要做的部分是标题为“在扩展框架窗口中绘图”的部分,在该部分中,您将扩展您负责绘制的区域,超出正常客户区域并进入窗口框架。这比以前要容易得多(您无需绘制关闭按钮之类的东西),但仍意味着您需要负责许多通常不会负责的事情,例如调整大小和移动的命中框测试。
基本上,这远不像提供更大的图标那么简单,对于大多数应用程序而言,这可能比它所值得的要花费更多的精力,但是您可以在C#中实现这一点,如果您真的想尝试一下,那么该文章应该可以帮助您入门。

2
我知道您正在寻找一种简单的代码方式来完成这个任务,但我建议您查看DevExpress管理(是第三方的,请原谅),只需在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 到目前为止,我仅使用winforms,在XP、Vista和Windows 7上使用它而没有任何问题。
我希望这有所帮助,或者如果Windows API在不同版本的Windows上无法按照您的要求进行操作,则为您提供另一个选择。
谢谢, 大卫

0

不要认为它是一个图标,如果你确切地指的是ICO图像格式。 考虑到Skype窗口肯定是自绘窗口,那个图像可以潜在地成为任何你想要的格式。

诀窍在于,基本上是跳过一些颜色(背景颜色)的像素来渲染图像,所以将其呈现为“透明”。

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

使用Alpha混合绘制透明图像和形状

虽然有点老,但仍然是一个好的参考。


是的,你可以这样做。但是那样做无法将其显示在窗口的标题/说明栏中。 - Cody Gray
@CodyGray:你确定 Skype 窗口(提供的示例)上的那个是标题栏吗?还是一个表现得像标题栏的表面? - Tigran
哦,这绝对是自定义绘制的标题栏,而不是标准的标题栏。 Windows 确定在标准标题栏上显示的图标大小 - 它始终等同于 SM_CXSMICON 乘以 SM_CYSMICON。但是它看起来像一个标准的标题栏,而你并没有真正讲解如何实现这种效果。 - Cody Gray

0

是的。覆盖WndProc并实现WM_NCPAINT。


2
不,那已经很久以前就停止工作了。 Windows 主题不再支持此功能。 - Hans Passant
@HansPassant "Stopped working"? 我看不到任何证据表明这在文档中已不再支持,尽管现在有更好的方法来实现此目的。 - Justin
@Justin - 对于Aero来说是不同的。 - Daniel A. White
你说的“停止工作”是什么意思?如果你处理了WM_NCPAINT消息,那么你刚刚禁用了窗口主题。 - Joshua
是的。当你仅为应用程序的窗口禁用主题时,用户会称之为“破损的”。 - Cody Gray
1
在什么情况下我可以说Office 2007是坏的呢?这是同一个硬币的两面。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接