c#控件编写 (3)重绘From的非工作区
2012-09-26 17:39
369 查看
重绘窗体的工作区的时候我们可以用到OnPaint来实现。而非工作区的绘制有几种思路
1.直接实现WM_NCCALCSIZE消息绘制
2.把窗体修改成None状态并拦截WM_NCCALCSIZE修改非工作区的大小实现
3.把窗体修改成None直接做一个模拟的状态
这三种方法都会有一些弱点,这些弱点也许是我没有找到对应的解决方法 。
1.在实现后需要修改 base.ControlBox = false,要不然在鼠标经过的时候会出现如下图的效果
非客户区刷新 switch (m.Msg)
{
case (int)Msg.WM_NCCALCSIZE:
BorderWidth = (this.Bounds.Width - this.ClientSize.Width) / 2;
HeadHeight = this.Bounds.Height - this.ClientSize.Height - BorderWidth;
mouseMove = MouseMose.None;
// NCPaint();
base.WndProc(ref m);
break;
case (int)Msg.WM_NCACTIVATE:
base.WndProc(ref m);
mouseMove = MouseMose.None;
NCUpdate();
break;
case (int)Msg.WM_NCPAINT:
NCPaint();
break;
case (int)Msg.WM_NCLBUTTONDOWN:
if (GetMouseButton() == null)
{
base.WndProc(ref m);
// Console.WriteLine(1);
}
break;
case (int)Msg.WM_NCLBUTTONUP:
ToolButton but = GetMouseButton();
if (but != null)
{
but.OnClick();
}
base.WndProc(ref m);
break;
case (int)Msg.WM_NCMOUSEMOVE:
NewButton = GetMouseButton();
base.WndProc(ref m);
break;
case (int)Msg.WM_ERASEBKGND:
base.WndProc(ref m);
NCPaint();
mouseMove = MouseMose.None;
NCUpdate();
break;
default:
base.WndProc(ref m);
break;
}[/code]
在这里鼠标点击关闭按钮是会出现WM_NCLBUTTONDOWN无法接收到消息,研究了很久发现了一个可以收到的方法,在WM_NCLBUTTONUP事件中判断是否是在最大最小关闭按钮按下的,如果是就不执行base.WndProc(ref m)这句。
基本上窗体绘制的原理就这么些东西了,如果哪位同学对上面的方法有更好的建议的话,欢迎讨论 。
1.直接实现WM_NCCALCSIZE消息绘制
2.把窗体修改成None状态并拦截WM_NCCALCSIZE修改非工作区的大小实现
3.把窗体修改成None直接做一个模拟的状态
这三种方法都会有一些弱点,这些弱点也许是我没有找到对应的解决方法 。
1.在实现后需要修改 base.ControlBox = false,要不然在鼠标经过的时候会出现如下图的效果
非客户区刷新 switch (m.Msg)
{
case (int)Msg.WM_NCCALCSIZE:
BorderWidth = (this.Bounds.Width - this.ClientSize.Width) / 2;
HeadHeight = this.Bounds.Height - this.ClientSize.Height - BorderWidth;
mouseMove = MouseMose.None;
// NCPaint();
base.WndProc(ref m);
break;
case (int)Msg.WM_NCACTIVATE:
base.WndProc(ref m);
mouseMove = MouseMose.None;
NCUpdate();
break;
case (int)Msg.WM_NCPAINT:
NCPaint();
break;
case (int)Msg.WM_NCLBUTTONDOWN:
if (GetMouseButton() == null)
{
base.WndProc(ref m);
// Console.WriteLine(1);
}
break;
case (int)Msg.WM_NCLBUTTONUP:
ToolButton but = GetMouseButton();
if (but != null)
{
but.OnClick();
}
base.WndProc(ref m);
break;
case (int)Msg.WM_NCMOUSEMOVE:
NewButton = GetMouseButton();
base.WndProc(ref m);
break;
case (int)Msg.WM_ERASEBKGND:
base.WndProc(ref m);
NCPaint();
mouseMove = MouseMose.None;
NCUpdate();
break;
default:
base.WndProc(ref m);
break;
}[/code]
在这里鼠标点击关闭按钮是会出现WM_NCLBUTTONDOWN无法接收到消息,研究了很久发现了一个可以收到的方法,在WM_NCLBUTTONUP事件中判断是否是在最大最小关闭按钮按下的,如果是就不执行base.WndProc(ref m)这句。
基本上窗体绘制的原理就这么些东西了,如果哪位同学对上面的方法有更好的建议的话,欢迎讨论 。
相关文章推荐
- C#WinFrom DEV控件Gridview导入导出Excel
- C#编写Unity基础GUI之按钮控件GUILayout控件
- C# WinFrom 编写正则表达式验证类
- C# 禁止控件重绘(绘制)
- 用 C# 编写 ActiveX 控件
- C#重绘TabControl控件的源码(转)
- 用C#编写农历控件的源码
- 分享一个 C# Winfrom 下的 OutlookBar 控件的使用
- VS2005使用C#编写ActvieX控件
- C#编写winForm,在不同分辨率,不同系统电脑上运行,控件位置错位问题
- C#winfrom 中 TreeView 控件中带checkbox,怎么实现在父节点上打勾,选中全部子节点?
- c# WinFrom ErrorProvider控件
- 从不是创建控件的线程访问(C# winFrom)
- C# 禁止控件重绘(绘制)
- C# winfrom中Flash播放使用axShockwaveFlash控件设置透明XP出现白色背景解决办法,仿QQ魔法表情效果
- C#编写Unity基础GUI之按钮控件
- c#:利用Timer和图片框控件,编写一个图片不断向左移动的小动画
- 用Visual C#.NET编写服务器日期控件
- C#winfrom 控件缩写规范之2
- C# winfrom 中自定义的翻页控件(自己设计)