如何制作自定义标题栏?(50分)

  • 主题发起人 主题发起人 DiamondKing
  • 开始时间 开始时间
D

DiamondKing

Unregistered / Unconfirmed
GUEST, unregistred user!
制作类似于金山词霸那样的自己设计的标题栏,先将borderstyle设置为bsNone,我希望鼠标落在
我设计的图片上时,可以拖动窗体(就象标题栏拖动窗体那种效果)。
我知道要截获WM_NCHITTEST,但代码该如何实现。怎么把它转化成htCaption.
 
private
{ Private declarations }
procedure WMNCHITTEST(VAR M:TWMNCHITTEST); message wm_nchittest;

implementation

{$R *.DFM}

procedure TForm1.WMNCHITTEST(var M:TWMNCHITTEST);
begin
inherited;
if M.Result =htClient then
M.Result :=htCaption;
end;
 
也可以不用WM_NCHITTEST,直接用mousedown,mousemove,mouseup这几个事件来.

先在Form1的Private节中声明几个临时变量:
private
ox,oy: Integer; //记录鼠标位置的临时变量
Captured: Boolean; //判断鼠标是否处于按下状态的标志
{ Private declarations }

然后在Form1的Mouse事件中加入如下代码:

//
// 鼠标按下时执行
//
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
p: TPoint;
begin
GetCursorPos(p); //取得当前鼠标位置
ox := p.x; //保存当前鼠标位置
oy := p.y;
SetCapture(Handle); //捕获鼠标
Captured := True; //设置按下标志
end;

//
// 鼠标移动时执行
//
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
p: TPoint;
begin
if Captured then //如果鼠标处于按下状态才执行
begin
GetCursorPos(p); //取得当前鼠标位置
left := left + p.x - ox; //移动窗体
top := top + p.y -oy;
ox := p.x; //保存当前鼠标位置
oy := p.y;
end;
end;

//
// 鼠标键松开时执行
//
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture(); //释放鼠标
Captured := False; //重置按下标志
end;

///-----------------------------下面是用WM_NCHITTEST的列子
unit Unit1;

interface

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

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
procedure aa(var m: TMessage); Message WM_NCHITTEST;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.aa(var m: TMessage);
begin
inherited;
if m.Result = htClient then
m.Result := htCaption;
end;
end.
只需把form改成你的控件名字即可,如:panel1

 
卷起千堆雪tyn兄:这样就是拖动Client区了。我只是想同过一个控件(如TPanel),来拖动窗体。
Easylee兄:“只需把form改成你的控件名字即可,如:panel1”这句话我还不是很懂,我试
了好几次都没有成功, 麻烦说更详细些(我很笨拉)。谢谢!
 
用WM_NCHITTEST无法对TPanel进行控制,可以改用TImage,自定义区域来实现。
 
枫之叶:可否讲讲如何实现?可以给原码吗
 
我是用bcb 寫的要不[?]
 
好啊,不敢肯定能看懂。有疑问我就问你。谢谢
 
给分吧,我给你Email过去。
 
枫之叶:好,那你要多少。
我的email是zcgjerry@163.com
 
何必如此麻烦,我贴给你.我是用的LABEL,这会儿给你调试的.给分!呵呵...
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
Xo,Yo:integer;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in Shift then
begin
Form1.Left := Form1.Left + X - Xo;
Form1.Top := Form1.Top + Y - Yo;
end;
end;

procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Xo:=x;
Yo:=y;
end;

end.
 
zhangkan:妙啊! 这个最简洁了! 谢谢!
只有50分。大家一个人给点你介意吗?要不就给你多些。还是不满意就只好都给你了。
 
我给你Email过去,至于给多少由你看着办吧。
 
枫之叶:可是我还没有收到啊。 请问给的分的总数可不可以超过50。
 
谢谢,大家。
 
后退
顶部