利用Windows消息循环,使窗体不能改变大小
作者:Christoph Herold
这篇文章介绍如何使窗体仅能被最大化,最小化!
介绍
你是否曾经用.NET 创建一个窗体,使窗体仅能被最大化、最小化?使用标准可用的选项实现是十分困难的.但是使用Windows消息循环,很容易使禁止Window标准特性.这篇文章将展示给你,用消息循环实现事实上是多么的简单.
重载窗体的WndProc方法
当一个窗体被最大化、最小化或者还原成窗体原始大小和位置时,Windows消息循环发送适当的命令给窗体. .NET窗体类会捕获所以的这些消息给你。在这个例子中,我们重载标准处理来忽略还原命令。这个被重载的窗体方法是WndProc.
{
base.WndProc(ref m);
}
在这给调用中将总是使你的基类执行所以的消息.不需要你亲自处理。现在,我们必须检查这些消息,那些是我们要处理的类型。这个类型能在参数Message的Msg属性找的。当窗体被最大化、最小化或者还原成窗体原始大小和位置时,我们能接受到一个SYSCOMMAND 消息。使用 WParam 参数,我们看它是不是一个restore消息。我们必须检查的值是SC_RESTORE。但是要注意的是,最后四位是被内部使用的,因此比较的时候必须用十六进制0xFFF0屏闭掉.同样,你必须转换类型IntPtr为int才能够去比较。
当我们接收到一个还原消息时,我们简单的什么都不用做,设置返回值为一个适当的值,这个例子为0.
{
if (m.Msg == WM_SYSCOMMAND)
{
if (((int)m.WParam & 0xFFF0) == SC_RESTORE)
{
m.Result = new IntPtr(0);
return;
}
}
base.WndProc(ref m);
}
假如窗体不是最小化的,这是最基本的代码。当你重新恢复最小化窗体,也就是"restored"。因为我们忽略了这个消息,我们将再也不能看到我们的窗体再次出现。因此我们必须扩展我们的方法,来检查当前的Window状态。假如窗体状态是最小化的,或者也不是最大化时,我们最大化我们的Window,而不是恢复它。
下面就是我们最后的执行代码:
{
if (m.Msg == WM_SYSCOMMAND)
{
if (((int)m.WParam & 0xFFF0) == SC_RESTORE)
{
if (this.WindowState != FormWindowState.Maximized)
{
this.WindowState = FormWindowState.Maximized;
}
m.Result = new IntPtr(0);
return;
}
}
base.WndProc(ref m);
}
在这个方法里的这两个Windows API常量(WM_SYSCOMMAND = 0x0112, SC_RESTORE = 0xF120)在Platform SDK 文件Winuser.h中可以找到
总结
当你理解了Windows 消息循环,修改窗体的默认特性是十分容易的。有益于我们看到.NET框架下的细节,有益于去创建简单的程序,也有益于我们编程。
原地址:
http://www.codeproject.com/useritems/DisableNormalWindowState.asp