巧妙控制Delphi 的窗体 不用标题栏也移动窗体 一般情况下，移动一个窗体需要将鼠标放置在该窗体的标题栏上才能拖动窗体，为什么非要使用标题栏呢？其实我们可以使用一个巧妙的方法来实现将鼠标放置在窗体上按下就可拖动窗体。 看一下实现的过程： 新建一个工程，在Form1的“Private”部分中申明过程，加入以下的代码，如图1所示：

图1

procedure wmnchittest( var msg:twmnchittest) ;
message wm_nchittest ;
在程序部分加入以下代码：
procedure TForm1.wmnchittest(var msg:twmnchittest) ;
begin
inherited ;
if (htclient=msg.result) then msg.result:=htcaption;
end ;
如图2所示

。

图2

程序经编译运行，结果如图3所示。

图3

整个程序的源代码清单如下：
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure wmnchittest(var msg:twmnchittest);
message wm_nchittest;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.wmnchittest(var msg:twmnchittest);
begin
inherited;
if(htclient=msg.Result)then
msg.Result:=htcaption;
end;
end.

窗体的基本控制技巧
在Delphi 中有的时候为了程序的需要，必须要把程序的窗体设置为不能放大、缩小、移动和关闭，以下就是实现的过程。
新建一个工程，在“Object Inspector”中首先把 Form 的 BorderIcons 下的几个子属性值全改为 False，如图4所示。

图4 图5

然后，修改 Form 的 BorderStyle 的值为bsSingle ，如图5所示；最后，为了让窗口不能移动，可以自已拦下WM_NCHIT-TEST消息，对该消息的处理为：一概回应鼠标点在窗口的 Client区域，相信这个视窗就呆呆的不会动了。详情可以查一下 Win32API Help 的 CreateWindow() 与 WM_NCHITTEST 的说明。具体的代码添加：
在Form1的“Private”部分中申明过程，加入以下的代码：
procedure WMNCHitTest(var Msg: TMessage) ;
message WM_NCHITTEST ;
如图6所示：

图6

在程序部分加入以下代码：
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;//按钮的代码一定要加，不然就不能正常退出程序了。
end;
procedure TForm1.WMNCHitTest(var Msg: TMessage);
begin
inherited;
Msg.Result := HTCLIENT;
end;
如图7所示。

图7

程序经编译运行 。
窗口变色背景设置技巧
我们看到有些安装程序的背景色自上由下由蓝变黑，我们也可以使我们自己的程序的背景自上由下由蓝变黑。具体的实现过程如下：
新建一个工程。双击窗体的OnPaint事件，如图9所示。

图9

然后编写如下的代码：
procedure TForm1.FormPaint(Sender: TObject);
var i:word;
dc,c:real;
begin
dc:=clientheight/256;
c:=0;
for i:=255 downto 0 do
begin
Form1.canvas.brush.color:=$00000000+i*$10000;
Form1.canvas.fillrect(rect(0,round(c),clientwidth,round(c+dc)));
c:=c+dc;
end;
end;
如图10所示。

图10

程序经编译运行就可看到结果。
限制窗体最大化时的大小的技巧
使用过Delphi 的人都会注意到Delphi 集成开发环境本身最上面的窗口，当它最大化的时候只占屏幕的一小部分。下面我们就来看一看这是怎样实现的。
新建一个工程。在Form1的“Private”部分做以下的声明：
procedure WMGetMinMaxInfo( var Message:TWMGetMin MaxInfo );
message WM_GETMINMAXINFO;
如图11所示：

图11

在程序部分加入以下代码：
procedure TForm1.WMGetMinMaxinfo(var Message:TWMGet MinMaxInfo);
begin
Message.MinMaxInfo.ptMaxSize.X:=400; //最大化时的宽度
Message.MinMaxInfo.ptMaxSize.Y:=100; //最大化时的高度
Message.MinMaxInfo.ptMaxPosition.X:=0; //最大化时左上角的横坐标
Message.MinMaxInfo.ptMaxPosition.Y:=0; //最大化时左上角的纵坐标
Message.Result:=0; //告诉系统最大最小化的信息已经改变
Inherited;
end;
程序经编译运行，结果如图12所示。

图12

让Form在不同分辨率下显示出同样大小
有的时候Delphi 设计的程序在开发者的计算机上运行的时候字体和色彩都很漂亮，但是有时在别的计算机上运行的时候却发现字体和颜色都发生了变化。这是由于别的计算机的显示器的分辨率的设置与开发者的计算机的分辨率不一样，而导致了字体和颜色的变化。当然，我们可以要求程序的使用者保持与我们一致的分辨率，但有没有其它的一些方法使程序来“自适应”分辨率的变化，使我们的程序看上去更专业一些。利用Delphi 提供的Scaleby可以达到这个目的，下面就是使程序“自适应”分辨率变化的过程：
先新建一个工程。双击窗体的OnCreate事件，如图13所示。

图13

然后输入以下的代码：
先定义两个常数变量：
const
ScreenWidth:LongInt=800 ; //当前显示器的值
ScreenHeight:LongInt=600 ; //当前显示器的值
在FromCreate事件中填写代码：
procedure TMainForm.FormCreate(Sender:TObject);
var
OldFormWidth : integer ;
begin
Form1.Scaled:=TRUE ;
if(Screen.width<> ScreenWidth)then
begin
OldFormWidth:=Width
Height:=longint(Height)*longint(Screen.Height) DIV ScreenHeight ;
Width:=longint(Width)*longint(Screen.Width) DIV ScreenWidth ;
Form1.ScaleBy(Screen.Width , ScreenWidth);
Form 1.Font.Size:=(Width DIV OldForm Width)* Font. Size;
end;
end;
程序经编译后运行，在不同分辨率下的运行结果如图14、15所示。

图14 程序在1024×768分辨率下的运行结果

图15 程序在800×600的分辨率下的运行结果

(张炯)