一个很有用的消息WM_SIZING

本文以一个Delphi程序为例,介绍了如何根据需要消息WM_SIZING 进行处理,从而对窗口尺寸进行特别控制。

  在Windows 系统中,多数窗口的尺寸要么可以随意改变,要么不能改变。个别窗口的尺寸是特别控制的,比如大家所熟悉的"空当接龙"游戏,窗口高度可以随意改变而宽度不能改变;在Delphi 3中,主窗口的高度不能改变,主窗口的宽度可以随意改变但不小于600 像素点这一最小宽度。本文以一个Delphi程序为例,介绍了如何根据需要消息WM_SIZING 进行处理,从而对窗口尺寸进行特别控制。


  消息WM_SIZING包含两部分:

  fwSide = wParam; //正在拖动的边界

  lprc = (LPRECT) lParam; //正在拖动的矩形的地址

  当用户正在改变某一窗口的尺寸时,Windows 将向该窗口发送一系列消息,其中包括消息WM_SIZING。 通过对该消息的处理,应用程序能够对正在拖动的矩形的尺寸和位置进行监控,如果需要,甚至可以直接改变其尺寸和位置。而该矩形就是当前窗口将要改变的尺寸。参数fwSide在消息参数wParam中给出。该参数指出了正在拖动改变的窗口的边界,其值可以是下列各值之一或其组合:

  值 含义

  WMSZ_BOTTOM Bottom edge //下边

  WMSZ_BOTTOMLEFT Bottom-left corner //左下角

  WMSZ_BOTTOMRIGHT Bottom-right corner //右下角

  WMSZ_LEFT Left edge //左边

  WMSZ_RIGHT Right edge //右边

  WMSZ_TOP Top edge //上边

  WMSZ_TOPLEFT Top-left corner //左上角

  WMSZ_TOPRIGHT Top-right corner //右上角

  参数lprc是一个矩形结构(RECT structure)的地址指针,该矩形也就是正在拖动改变的矩形,也就是窗口将要改变到的矩形范围。应用程序可以通过改变该矩形的元素的值来控制窗口的改变。应用程序在处理消息WM_SIZING时总返回TRUE。

  下面以一个Delphi程序为例介绍对消息WM_SIZING如何进行处理。

  新建一个应用,打开源文件 Unit1.pas,在其中添加代码,得到如下单元的源代码:

unit Unit1; //Line 01

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)

private
  { Private declarations }
  procedure PROC_WM_SIZING(var AMsg: TMessage); message WM_SIZING; //Line 12

public
  { Public declarations }

end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.PROC_WM_SIZING(var AMsg: TMessage); //Line24

const

MinWidth = 400; //Line 26

var

ARect: ^TRect; //Line 28

begin

ARect := Ptr(AMsg.LParam);  //Line 30

ARect.Top := Top;       //Line 31

ARect.Bottom := Top + Height; //Line 32

if ARect.Right - ARect.Left < MinWidth then begin

  case AMsg.WParam of

   WMSZ_BOTTOMLEFT,

   WMSZ_LEFT,

   WMSZ_TOPLEFT:   ARect.Left := ARect.Right - MinWidth; //Line 37

   WMSZ_BOTTOMRIGHT,

   WMSZ_RIGHT,

   WMSZ_TOPRIGHT:  ARect.Right := ARect.Left + MinWidth; //Line 40

  else
  end;
end;

end; //Line 44

end. //Line 46


  上面的源代码中,第12行、第24行到第44行是由开发者添加的,其余的代码是Delphi自动生成的。其中第12行声明了对消息WM_SIZING 进行处理的过程PROC_WM_SIZING,并在第24行到第44行中对该过程进行了实现。

  该示例对窗口的最小宽度和高度进行了限制。用户不能改变窗口的高度,用户可以改变窗口的宽度,但最小不得小于MinWidth即400。
  第30行中使用了Delphi提供的一个内部函数 Ptr,该函数将整型数值转换为指针类型。
  第31行和第32行是对窗口高度进行限制,禁止用户拖动改变。
  如果拖动改变的矩形边包括左边,则在第37行中控制窗口的宽度,否则在第40行中控制窗口的宽度。
  开发者可以根据实际应用的需要进行各种控制。

转自【http://www.koven.org/archives/228.html

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值