首页 > 代码库 > winform自定义皮肤思路

winform自定义皮肤思路

声明:
思路来自于网上源码,具体作者不清楚了,大家可以搜索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,制定拖动策略。


上帝给你关上一扇门的时候,同时还会用门夹你的脑袋!