首页 > 代码库 > winform自定义皮肤思路
winform自定义皮肤思路
声明:
思路来自于网上源码,具体作者不清楚了,大家可以搜索Paway.Windows.Forms。
一、去掉边框
this.FormBorderStyle = FormBorderStyle.None;
二、绘制基本元素
1、基本元素:图标、标题、窗口控制(最小化、最大化、关闭)。
2、如何绘制:重写OnPaint,在制定区域绘制基本元素。
3、异形窗口:比如圆角矩形,在OnResize中指定重绘区域,如果区域为矩形,重绘出的窗口就是圆角矩形了。
三、窗口控制区域鼠标动作
当以上工作完成后,一个静态的自定义窗口就产生了,但是,仅仅是静态的,因为还有很多工作等待完成,比如最小化窗口、关闭窗口以及鼠标经过时的状态变化。
重写OnMouseMove、OnMouseDown、OnMouseUp、OnMouseLeave来完成以上需求,如当鼠标进入最小化按钮区域时,更新最小化按钮状态值,并且通知windows重绘最小化区域。在OnMouseUp中处理鼠标点击事件,完成最小化、最大化、关闭操作。这里要注意这个方法:Invalidate,使整个窗口客户区无效,无效了嘛就只能重绘。
四、窗口的拖动
因为我们将边框去掉,所以导致了真个窗体无法拖动。
要处理这个问题,需要直接调用windowsAPI。重写OnMouseDown,除去窗口控制区域外,调用以下方法
五、窗口大小变化
1、最大化、最小化按钮:这个问题不大,只是最大化,可能要特殊处理,因为去掉边框的原因,不能沿用老的方法。读取屏幕的大小为宽度和高度赋值。
思路来自于网上源码,具体作者不清楚了,大家可以搜索Paway.Windows.Forms。
一、去掉边框
this.FormBorderStyle = FormBorderStyle.None;
二、绘制基本元素
1、基本元素:图标、标题、窗口控制(最小化、最大化、关闭)。
2、如何绘制:重写OnPaint,在制定区域绘制基本元素。
3、异形窗口:比如圆角矩形,在OnResize中指定重绘区域,如果区域为矩形,重绘出的窗口就是圆角矩形了。
三、窗口控制区域鼠标动作
当以上工作完成后,一个静态的自定义窗口就产生了,但是,仅仅是静态的,因为还有很多工作等待完成,比如最小化窗口、关闭窗口以及鼠标经过时的状态变化。
重写OnMouseMove、OnMouseDown、OnMouseUp、OnMouseLeave来完成以上需求,如当鼠标进入最小化按钮区域时,更新最小化按钮状态值,并且通知windows重绘最小化区域。在OnMouseUp中处理鼠标点击事件,完成最小化、最大化、关闭操作。这里要注意这个方法:Invalidate,使整个窗口客户区无效,无效了嘛就只能重绘。
四、窗口的拖动
因为我们将边框去掉,所以导致了真个窗体无法拖动。
要处理这个问题,需要直接调用windowsAPI。重写OnMouseDown,除去窗口控制区域外,调用以下方法
[DllImport("user32.dll")] public static extern int ReleaseCapture(); [DllImport("User32.dll", CharSet = CharSet.Auto, EntryPoint = "SendMessageA")] public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); protected override void onm ouseDown(MouseEventArgs e){ base.OnMouseDown(e); if (e.Button == MouseButtons.Left && !窗口控制区域.Contains(e.Location)) { NativeMethods.ReleaseCapture(); NativeMethods.SendMessage(Handle, 274, 61440 + 9, 0); } }
五、窗口大小变化
1、最大化、最小化按钮:这个问题不大,只是最大化,可能要特殊处理,因为去掉边框的原因,不能沿用老的方法。读取屏幕的大小为宽度和高度赋值。
2、拖动改变大小:这个还是因为去掉边框的问题,重写WndProc,制定拖动策略。
上帝给你关上一扇门的时候,同时还会用门夹你的脑袋!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。