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

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

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

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

None.gif protected   override   void  WndProc( ref  Message m)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif        
base.WndProc(ref m);
ExpandedBlockEnd.gif}


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

None.gif protected   override   void  WndProc( ref  Message m)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
if (m.Msg == WM_SYSCOMMAND)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (((int)m.WParam & 0xFFF0== SC_RESTORE)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            m.Result 
= new IntPtr(0);
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
base.WndProc(ref m);
ExpandedBlockEnd.gif}

None.gif


假如窗体不是最小化的,这是最基本的代码。当你重新恢复最小化窗体,也就是"restored"。因为我们忽略了这个消息,我们将再也不能看到我们的窗体再次出现。因此我们必须扩展我们的方法,来检查当前的Window状态。假如窗体状态是最小化的,或者也不是最大化时,我们最大化我们的Window,而不是恢复它。       
下面就是我们最后的执行代码:

None.gif protected   override   void  WndProc( ref  Message m)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
if (m.Msg == WM_SYSCOMMAND)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (((int)m.WParam & 0xFFF0== SC_RESTORE)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (this.WindowState != FormWindowState.Maximized)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.WindowState = FormWindowState.Maximized;
ExpandedSubBlockEnd.gif            }

InBlock.gif            m.Result 
= new IntPtr(0);
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
base.WndProc(ref m);
ExpandedBlockEnd.gif}

None.gif


在这个方法里的这两个Windows API常量(WM_SYSCOMMAND = 0x0112, SC_RESTORE = 0xF120)在Platform SDK 文件Winuser.h中可以找到
总结
当你理解了Windows 消息循环,修改窗体的默认特性是十分容易的。有益于我们看到.NET框架下的细节,有益于去创建简单的程序,也有益于我们编程。

原地址:
 http://www.codeproject.com/useritems/DisableNormalWindowState.asp

 

 

 

转载于:https://www.cnblogs.com/HuangLiang/archive/2006/04/07/369556.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值