zoukankan      html  css  js  c++  java
  • 利用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
  • 相关阅读:
    css圆,背景,img填满等样式
    MySQL双日志
    MySQL分层和查询数据的流程
    ZJNU 2345
    ZJNU 2342
    ZJNU 2340/2341/2343
    ZJNU 2235
    ZJNU 2226
    ZJNU 2212
    ZJNU 2208
  • 原文地址:https://www.cnblogs.com/HuangLiang/p/369556.html
Copyright © 2011-2022 走看看