利用Windows消息循环,使窗体不能改变大小

                                                                                              作者:Christoph Herold
这篇文章介绍如何使窗体仅能被最大化,最小化!

介绍
   你是否曾经用.NET 创建一个窗体,使窗体仅能被最大化、最小化?使用标准可用的选项实现是十分困难的.但是使用Windows消息循环,很容易使禁止Window标准特性.这篇文章将展示给你,用消息循环实现事实上是多么的简单.

重载窗体的WndProc方法
当一个窗体被最大化、最小化或者还原成窗体原始大小和位置时,Windows消息循环发送适当的命令给窗体. .NET窗体类会捕获所以的这些消息给你。在这个例子中,我们重载标准处理来忽略还原命令。这个被重载的窗体方法是WndProc.

protected override void WndProc(ref Message m)
{
        
base.WndProc(ref m);
}


在这给调用中将总是使你的基类执行所以的消息.不需要你亲自处理。现在,我们必须检查这些消息,那些是我们要处理的类型。这个类型能在参数Message的Msg属性找的。当窗体被最大化、最小化或者还原成窗体原始大小和位置时,我们能接受到一个SYSCOMMAND 消息。使用 WParam 参数,我们看它是不是一个restore消息。我们必须检查的值是SC_RESTORE。但是要注意的是,最后四位是被内部使用的,因此比较的时候必须用十六进制0xFFF0屏闭掉.同样,你必须转换类型IntPtr为int才能够去比较。
当我们接收到一个还原消息时,我们简单的什么都不用做,设置返回值为一个适当的值,这个例子为0.

protected override void WndProc(ref Message m)
{
    
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,而不是恢复它。       
下面就是我们最后的执行代码:

protected override void WndProc(ref Message m)
{
    
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

如果您喜欢本文,更多文章,欢迎订阅我的微信订阅号:open_dotNET
原文地址:https://www.cnblogs.com/HuangLiang/p/369556.html