首页 新闻 会员 周边 捐助

▲▲▲关于C# 自定义窗口的一些问题▲▲▲

0
悬赏园豆:20 [已解决问题] 解决于 2012-04-19 21:50

  本人最近在做一个自定义基窗体,然后实现更换默认windows窗体皮肤的功能,
现在窗体做出来了
  我的基窗体也是继承System.Windows.Form,实现了最大化、最小化、拖动改变窗体大小、右键菜单等功能,但是现在有一个问题出现,就是在拖动改变窗体大小的时候,我想实现给定一个窗体的最小宽度和高度,然后如果拖动的窗体宽度和高度小于最小值,就给当前窗体的Width、Height赋值为最小值,
  实现这个我试着通过2种方法做:
第一种:重写OnPaint事件

 

View Code
 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消息,同时做上述处理

 

View Code
 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赋值进行最小化处理

 

View Code
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)是不是在系统什么地方存着,且这个值是不是固定值,不知道哪位同仁有遇到过此问题或者比较了解的,麻烦讲下这个值是什么,怎么能取到这个值,如果能取到这个值,我就有办法解决这个最小化的问题。

  麻烦各位达人帮帮忙,或者谁要是有更好的实现思路,麻烦给指点下,谢谢!

  本人刚来园子,分不多,先谢谢各位了!

David丶Beckham的主页 David丶Beckham | 初学一级 | 园豆:193
提问于:2012-04-19 21:09
< >
分享
最佳答案
1

有两个属性:minHeight  和 maxHeight。

收获园豆:20
悟行 | 专家六级 |园豆:12559 | 2012-04-19 21:37

糊涂啊,做了这么久,怎么就把就原始的东西给忘掉了呢

呵呵,解决了,不再需要去在重绘的时候判断最小窗口大小了

谢谢啊!

David丶Beckham | 园豆:193 (初学一级) | 2012-04-19 21:50

随便问下,兄台,那个XP下(160,31)、WIN7下(160,27)是什么值啊?

David丶Beckham | 园豆:193 (初学一级) | 2012-04-19 21:58

@David丶Beckham: 坐标位置。

悟行 | 园豆:12559 (专家六级) | 2012-04-19 22:19
  • @David丶Beckham: X和Y轴。
悟行 | 园豆:12559 (专家六级) | 2012-04-19 22:20

@荒野的呼唤: 可是我明明show出来的是width和height啊

就这2个值

David丶Beckham | 园豆:193 (初学一级) | 2012-04-19 22:26

@David丶Beckham: 你的那不是point???你赋值是Height和Width,那就是他们了。

悟行 | 园豆:12559 (专家六级) | 2012-04-19 22:37

@荒野的呼唤: 我感觉就是很奇怪

最小化的窗体,大小在不同的操作系统下,就是那2个值,那个160我真没法解释

但是31和27,有点像是默认windows窗体的那个上边栏的宽度

所以我在想

这个是不是就是个默认值

应该存在系统中的某个位置的

David丶Beckham | 园豆:193 (初学一级) | 2012-04-19 22:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册