winform自定义皮肤思路

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


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值