★★★★★winform中自定义窗体的问题★★★★★

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

protected override void OnPaint(PaintEventArgs e)
{
if (this.Width < 200)
{
this.Width = 200;
}
if (this.Height < 200)
{
this.Height = 200;
}

CaculatePartLocation(); //此处方法为重新计算窗体的位置等值
base.OnPaint(e);
}


第二种:捕获WM_SIZE消息,同时做上述处理

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x0005)
{
if (this.Width < 200)
{
this.Width = 200;
}
if (this.Height < 200)
{
this.Height = 200;
}
}
}


两种方法都实现了拖动时不会把窗体拖到一条线或者一个点去

我再讲一下我的最小化按钮的实现,因为我的按钮是自己写的自定义按钮的,不是默认系统按钮,我就直接给WindowState赋值进行最小化处理

protected virtual void btnMin_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.WindowState = FormWindowState.Minimized;
}
}



但是新问题出现了,如果像上述2种那样去解决上述的问题,那么当我的默认窗体大小比我上面设置的200,200大的话,我最小化窗体的时候,肯定就触发了OnPaint事件或者肯定捕获到消息WM_SIZE并且做了相应处理,然后我再次点击任务栏上的最小化窗体进行窗体还原时,窗体就还原不到最小化前的大小,而是还原到200,200这么大的窗体。

如果我没有实现那个最小窗体200,200这个功能,窗体的最小化和还原都是正常的。

我尝试捕获最小化后窗体的大小,结果在XP下返回的是(160,31)的宽和高,在win7下返回的是(160,27)的宽和高,其他操作系统还没测试,我现在就想知道,这个(160,31)、(160,27)是不是在系统什么地方存着,怎么能取到这个值,如果能取到这个值,我就有办法解决这个最小化的问题。

麻烦各位达人帮帮忙,或者谁要是有更好的实现思路,麻烦给指点下,谢谢!
...全文
114 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧