C重绘windows窗体标题栏和边框解析.docx

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C#重绘 windows 窗体标题栏和边框 摘要 windows 桌面应用程序都有标准的标题栏和边框, 大部分程序也默认使用这些样式,一些对视觉效果要求较高的程序,如 QQ, MSN,迅雷等聊天工具的样式则与传统的 windows 程序大不相同,其中迅雷还将他们的 BOLT界面引擎开放,使得大家也可以创建类似迅雷一样的界面。 那么这些软件的界面是怎样实现的呢,使用 C#是否也可以实现类似界面? 重绘方式 常见的自定义标题栏和边框的方式有两种, 一种是隐藏标题栏和边框 (称为非客户区),然后在客户区(可以放置控件的空间)使用一些常用的控件和图片来表 示边 框,这种方式较简单而麻烦,但如标题栏的拖动,边框的拖拽来改变窗体 大小等效果, 则有需要重新实现, 另外有些客户区的鼠标事件, 控件布局等也需 要注意调 整;另一种则是大部分软件实现方式,也较难一些;它利用 windows 的消息机制,截获 windows 消息,从而改变消息的行为。即 windows 的一些 消息,会引起窗体绘制或重绘标题栏和边框的行为, 因此只要结果这部分消息, 然后开发人员自己处理绘制过程,并忽略默认行为,从而达到自定义的目的。 C#绘制接口 windows 消息对于 C#开发新手来说较生疏,原因是 .net 已经将 windows 消息机制进行了封装,使得我们很难发现 windows 消息的踪迹,其 实它是以另一个身份存在着 -- 事件。如控件的 OnClick ,Mouse等事件,都是对 windows 消息的封装,这样的目的更容易理解,和运 用。 .net 提供了处理消息的接口,常用的方法为 Control 控件的 void WndProc(ref Message m) 方法,该方法用于接收任何发送到该控件的 windows 消息。那么我们就可以通过重写该方法来截获绘制窗体标题栏和边框的消息了。 找到了截获 windows 消息的接口,那么就需要知道哪些 windows 消息会引起窗体标题栏 和边 框的 重绘 。 使用 工具 SPY++查看 消息 ,发 现 windows 消息WM_NCPAINT(0x85)和 WM_NCACTIVATE(0x86), WM_NCRBUTTONDOWN(0x00A4),WM_SETCURSOR(0x0020),WM_NCLBUTTONUP(0x00A2),WM_NCLBUTTONDOWN(0xA1)等 会重绘标题栏和边框。其中 WM_NCPAINT和 WM_NCACTIVATE会引起重绘标题栏和边框,消息 WM_NCRBUTTONDOWN会触发标题 栏的右键菜单, 截获该消息可以自定义标题栏的右键菜单;其他消息会引起 ConrtolBox( 最小化,最大化,关闭按钮区域 ) 的重绘。因此我们可以从截获 这些消息入手。如下为 WndProc方法的结构: using System; using System.Collections.Generic; using System.Windows.Forms; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.InteropServices; using System.Diagnostics; namespace CaptionBox { public class ThemeForm : Form { #region private structs struct _NonClientSizeInfo { public Size CaptionButtonSize; public Size BorderSize; public int CaptionHeight; public Rectangle CaptionRect; public Rectangle Rect; public Rectangle ClientRect; public int Width; public int Height; }; #endregion #region constants const int WM_NCACTIVATE = 0x86; const int WM_NCPAINT = 0x85; const int WM_NCLBUTTONDOWN = 0xA1; const int WM_NCRBUTTONDOWN = 0x00A4; const int WM_NCRBUTTONUP = 0x00A5; const int WM_NCMOUSEMOVE = 0x00A0; const int WM_NCLBUTTONUP = 0x00A

文档评论(0)

137****7230 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档