- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- ARM基础知识详解.docx
- ARM的汇编指令详解.docx
- ASM铸造缺陷的国际分类7大类(学习版0228)详解.docx
- AT89S52外文文献解析.docx
- A惯性牛顿第一定律高品质版.docx
- B2C网络商城网站建设方案(doc14页)(美版).docx
- be动词使用的微课教学设计.docx
- BUP数据初始化方案V1.2详解.docx
- BWR-04(Ⅰ)绕组温度计-华立详解.docx
- C6-11章课后作业参考答案..docx
- 2024年江西省高考政治试卷真题(含答案逐题解析).pdf
- 2025年四川省新高考八省适应性联考模拟演练(二)物理试卷(含答案详解).pdf
- 2025年四川省新高考八省适应性联考模拟演练(二)地理试卷(含答案详解).pdf
- 2024年内蒙通辽市中考化学试卷(含答案逐题解析).docx
- 2024年四川省攀枝花市中考化学试卷真题(含答案详解).docx
- (一模)长春市2025届高三质量监测(一)化学试卷(含答案).pdf
- 2024年安徽省高考政治试卷(含答案逐题解析).pdf
- (一模)长春市2025届高三质量监测(一)生物试卷(含答案).pdf
- 2024年湖南省高考政治试卷真题(含答案逐题解析).docx
- 2024年安徽省高考政治试卷(含答案逐题解析).docx
文档评论(0)