您的位置:首页 > 编程语言 > C#

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)这句。

基本上窗体绘制的原理就这么些东西了,如果哪位同学对上面的方法有更好的建议的话,欢迎讨论 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: