本人最近在做一个自定义基窗体,然后实现更换默认windows窗体皮肤的功能,
现在窗体做出来了
我的基窗体也是继承System.Windows.Form,实现了最大化、最小化、拖动改变窗体大小、右键菜单等功能,但是现在有一个问题出现,就是在拖动改变窗体大小的时候,我想实现给定一个窗体的最小宽度和高度,然后如果拖动的窗体宽度和高度小于最小值,就给当前窗体的Width、Height赋值为最小值,
实现这个我试着通过2种方法做:
第一种:重写OnPaint事件
1 protected override void OnPaint(PaintEventArgs e) 2 { 3 if (this.Width < 200) 4 { 5 this.Width = 200; 6 } 7 if (this.Height < 200) 8 { 9 this.Height = 200; 10 } 11 12 CaculatePartLocation(); //重新计算窗口布局和位置 13 base.OnPaint(e); 14 }
第二种:捕获WM_SIZE消息,同时做上述处理
1 protected override void WndProc(ref Message m) 2 { 3 base.WndProc(ref m); 4 5 if (m.Msg == 0x0005) 6 { 7 if (this.Width < 200) 8 { 9 this.Width = 200; 10 } 11 if (this.Height < 200) 12 { 13 this.Height = 200; 14 } 15 } 16 }
两种方法都实现了拖动时不会把窗体拖到一条线或者一个点去
我再讲一下我的最小化按钮的实现,因为我的按钮是自己写的自定义按钮的,不是默认系统按钮,我就直接给WindowState赋值进行最小化处理
1 protected virtual void btnMin_MouseClick(object sender, MouseEventArgs e) 2 { 3 if (e.Button == MouseButtons.Left) 4 { 5 this.WindowState = FormWindowState.Minimized; 6 } 7 }
但是新问题出现了,如果像上述2种那样去解决上述的问题,那么当我的默认窗体大小比我上面设置的(200,200)大的话,我最小化窗体的时候,肯定就触发了OnPaint事件或者肯定捕获到消息WM_SIZE并且做了相应处理,然后我再次点击任务栏上的最小化窗体进行窗体还原时,窗体就还原不到最小化前的大小,而是还原到(200,200)这么大的窗体。
如果我没有实现那个最小窗体(200,200)这个功能,窗体的最小化和还原都是正常的。
这里我尝试过去捕获我的窗体最小化的时候的消息,但好像不是0x0112(WM_SYSCOMMAND),最后我尝试捕获最小化后窗体的大小,结果在XP下返回的是(160,31)的宽和高,在win7下返回的是(160,27)的宽和高,其他操作系统还没测试,我现在就想知道,这个(160,31)、(160,27)是不是在系统什么地方存着,且这个值是不是固定值,不知道哪位同仁有遇到过此问题或者比较了解的,麻烦讲下这个值是什么,怎么能取到这个值,如果能取到这个值,我就有办法解决这个最小化的问题。
麻烦各位达人帮帮忙,或者谁要是有更好的实现思路,麻烦给指点下,谢谢!
本人刚来园子,分不多,先谢谢各位了!
有两个属性:minHeight 和 maxHeight。
糊涂啊,做了这么久,怎么就把就原始的东西给忘掉了呢
呵呵,解决了,不再需要去在重绘的时候判断最小窗口大小了
谢谢啊!
随便问下,兄台,那个XP下(160,31)、WIN7下(160,27)是什么值啊?
@David丶Beckham: 坐标位置。
@荒野的呼唤: 可是我明明show出来的是width和height啊
就这2个值
@David丶Beckham: 你的那不是point???你赋值是Height和Width,那就是他们了。
@荒野的呼唤: 我感觉就是很奇怪
最小化的窗体,大小在不同的操作系统下,就是那2个值,那个160我真没法解释
但是31和27,有点像是默认windows窗体的那个上边栏的宽度
所以我在想
这个是不是就是个默认值
应该存在系统中的某个位置的