一个简单问题(50分)

  • 主题发起人 主题发起人 fishmando
  • 开始时间 开始时间
F

fishmando

Unregistered / Unconfirmed
GUEST, unregistred user!
如果窗体去掉标题栏而自画标题栏,如何使窗体移动
 
在自画标题拦中处理鼠标,单击,双击,和MOVEOVER等事件移动窗体的位置
在自画标题拦中消息,让系统认为鼠标在标题栏上
 
:::不用标题栏也移动窗体:::
一般情况下,移动一个窗体需要将鼠标放置在标题栏上才能拖动窗体,为 什么非要使用标题栏呢?其实我们可以使用一个巧妙的方法来实现将鼠标放置 在窗体上按下就可拖动窗体,下面先看实现代码。在Form1的“Private”部分声明过程:
在private部分加入下列代码:
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;
  上面的关键代码虽然只有两行,但它实现了鼠标直接拖动窗体的目的。代码的原理是利用窗体的WM_NCHITTEST消息,这个消息是当光标移动、鼠标按下或释放时发生的,当程序检测到鼠标在窗体中按下的消息后(消息的值为htClient),将鼠标在标题栏上按下时产生的消息(值为htCaption)传递出去,这样就巧妙的欺骗程序认为是标题栏被按下,当然就可拖动窗体了。

 
也有一些第三方控件可以实现比如ExtraPack里的movewindow
 
procedure TForm5.MouseMove(Sender: TObject;
Shift: TShiftState;
X, Y: Integer);
begin
if ssleft in shift then
begin
releaseCapture;
Perform(WM_SYSCOMMAND,$F012,0);
end;
end;
 
同意 linglingx
 

放上一个image(在上面画你的标题栏)
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseMove(Sender: TObject;
Shift: TShiftState;
X,
Y: Integer);
procedure Image1MouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
private
{ Private declarations }
ylx,yly:integer;
//定义两个全局变量
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}

procedure TForm1.Image1MouseMove(Sender: TObject;
Shift: TShiftState;
X,
Y: Integer);
begin
if ssleft in shift then
begin
//按下鼠标左键拖动form1
left:=left+x-ylx;
top:=top+y-yly;
end;

end;

procedure TForm1.Image1MouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
Ylx:=x;
//记录鼠标原来的坐标值
Yly:=y;
end;
 
linglingx的方法很好!不过这样窗体上的按钮就没法点了!
影 子的方法容易理解!呵呵!
推荐啊
 
flatstyle 里就有这个控件
 
同意linglingx﹐很簡單
 
后退
顶部