本文以一个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】