窗口拖动问题!

dreamover 2003-08-25 12:51:11
type
TForm1 = class(TForm)
......
private
procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
end;

函数体:
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited; { call the inherited message handler }
if M.Result = htClient then { is the click in the client area? }
M.Result := htCaption; { if so, make Windows think it's }
{ on the caption bar. }
end;


这样能实现不规则窗口的拖动,但是在窗口用户区内点击就能拖动窗口,
但是里面的image_onclick事件都不好使怎么办?
若是只想让他在点击自己做的标题栏时拖动,怎么办??

或者是
...全文
64 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kakyo 2003-08-29
  • 打赏
  • 举报
回复
再贴一遍,我试过,没有问题!
点中TImage, 不能拖动窗体。
窗口中的Image控件的OnClick事件响应正常。

unit DragFrm;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
SC_DragMove=$F012; //////////// 这就是那个消息值


var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture; //释放鼠标事件的对象
form1.Perform(WM_SYSCOMMAND,SC_DragMove,0); //发送消息,这里就用了那个消息值
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
close;
end;

end.
lwluser 2003-08-28
  • 打赏
  • 举报
回复
WM_NCLBUTTONDOWN//在标题栏上按下左键
WM_NCRBUTTONDOWN//不用说了吧
WM_NC ///不想多说了, 标题栏消息只是在几个常用的
//窗口消息前加了 NC
dreamover 2003-08-28
  • 打赏
  • 举报
回复
Hewin(hewin) 的方法很妙,也很好使!

Kakyo(高桥)你的方法,怎么用,我直接写上不好使啊,函数声明应该怎么声明,你没写啊,还有你的程序是点哪儿可以拖动窗口?
Hewin 2003-08-27
  • 打赏
  • 举报
回复
將你的消息處理過程加一個if 就OK了
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
var
pt : Tpoint ;
begin
inherited;
pt:=Point(m.XPos,m.YPos) ;
pt:=ScreenToClient(pt) ;
if (pt.X>image1.Left)and(pt.X<(image1.Left+image1.Width))and(pt.Y>image1.Top)and (pt.Y<(image1.Top+image1.Height)) then
if M.Result = htClient then
M.Result := htCaption;
end;
Kakyo 2003-08-27
  • 打赏
  • 举报
回复
对不起,这两天我这里的局域网老是出问题,上不了网。
来晚了,请多多包涵。
以下给你一个我的实例,我用得挺好,你拿去试试。

unit cand;

interface

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

const
SC_DragMove=$F012; //////////// 这就是那个消息值

type
.............
// 声明部份全部省略

implementation
uses compos;
{$R *.DFM}

procedure TfrmCandidate.CandidateBoxMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture; //释放鼠标事件的对象
frmCandidate.Perform(WM_SYSCOMMAND,SC_DragMove,0); //发送消息,这里就用了那个消息值
end;

end.
dreamover 2003-08-26
  • 打赏
  • 举报
回复
怎么没人回答我的问题!
dreamover 2003-08-25
  • 打赏
  • 举报
回复
oyj1204@163.com
Kakyo 2003-08-25
  • 打赏
  • 举报
回复
应该用一个未公开的命令消息,具体消息值我一时想不起来了。
身边一时没有资料,你给出你的邮箱,我有空给你发送过去。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧