程序中把窗体的BorderStyle设置了bsNone,如何实现左键点住窗体,移动整个窗体? 查了一些书,找不到答案。这个问题应该不难,只是我不会,^_^谢谢!!!!!!!!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不用标题栏也移动窗体一般情况下,移动一个窗体需要将鼠标放置在标题栏上才能拖动窗体,为 什么非要使用标题栏呢?其实我们可以使用一个巧妙的方法来实现将鼠标放置 在窗体上按下就可拖动窗体,下面先看实现代码。在Form1的“Private”部分声明过程:在private部分加入下列代码:procedure wmnchittest(var msg:twmnchittest);message wm_nchittest;在程序部分加入以下代码:procedure TForm1.wmnchittest(var msg:twmnchittest);begininherited;if (htclient=msg.result) then msg.result:=htcaption;end;上面的关键代码虽然只有两行,但它实现了鼠标直接拖动窗体的目的。代码的原理是利用窗体的WM_NCHITTEST消息,这个消息是当光标移动、鼠标按下或释放时发生的,当程序检测到鼠标在窗体中按下的消息后(消息的值为htClient),将鼠标在标题栏上按下时产生的消息(值为htCaption)传递出去,这样就巧妙的欺骗程序认为是标题栏被按下,当然就可拖动窗体了************************----通过为Application.OnMessage创建一个处理程序获得Windows消息,可以调整应用程序对不同消息的响应或为不能正常识别的消息提供服务。这里受到窗体客户区的鼠标按下的消息后,发送一条在标题栏内按下的消息。 ---- 例 程 如 下: . . procedure FormCreate(Sender: TObject); private { Private declarations } procedure AppMessage(var Msg:TMsg;var Handled:Boolean); . . {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage:=AppMessage; //捕捉消息:将程序的收到消息事件与消息过滤过程关联起来 end; procedure TForm1.AppMessage(var Msg:TMsg;var Handled:Boolean); begin if (Msg.message=WM_LButtonDown) and //如果鼠标左键按下的话 (DefWindowProc(Handle,WM_NCHitTest, 0,GetMessagePos)=HTClient) and //判断光标是否在客户区内 ((GetKeyState(vk_CONTROL) < 0) //检测“Ctrl”键是否按下 then begin SendMessage(Handle,WM_NCLButtonDown, HTCaption,GetMessagePos); //发送鼠标在标题栏内按下的消息 Handled:=true; end; procedure TForm1.imgLeftUp1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);const sc_dragmove = $f012;begin if form1.Top <=0 then form1.Top :=2; releasecapture; twincontrol(application.mainform).perform(wm_syscommand,sc_dragmove, 0);end;把这个改改应该可以用; procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin ReleaseCapture; SendMessage(self.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);end; zyly2(漂流),刚试了,很好用,哪里的文章?介绍一下。outer2000(天外流星),没有试你的方法,有一个解决的方法就可以了。呵呵 hthunter(核桃)的方法也不错。结贴了,不然回答的人多了,不知给谁了 DDG5里就讲过吧 配套源码里有相应的程序 电子书、源码 网上都能找到 treeview 无效NULL 赚分帖~~~ 用Delphi,能取得浏览器级别(就是关掉浏览器,Cookie就没有了)的cookie吗? 有关DBGrid的使用(给高手加分不小气) 我的的两段注册表导出程序都不好用,以下是源码,请高手指教,急急急!!!!! 对SQL精深的人士,请进..... 急,急!!!高分相赠找delphi 6 的序列号!!! pchar怎么这么难用?! 低级问题,我的程序无缘无故就找不到 .dcu文件 求救,我想要一个好得GIF显示得控件..找了好多,都没有方法用.我用D6.. 如何使用CopyFileTo函数? 网络函数库
一般情况下,移动一个窗体需要将鼠标放置在标题栏上才能拖动窗体,为 什么非要使用标题栏呢?其实我们可以使用一个巧妙的方法来实现将鼠标放置 在窗体上按下就可拖动窗体,下面先看实现代码。在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)传递出去,这样就巧妙的欺骗程序认为是标题栏被按下,当然就可拖动窗体了
************************
----通过为Application.OnMessage创建一个处理程序获得Windows消息,可以调整应用程序对不同消息的响应或为不能正常识别的消息提供服务。这里受到窗体客户区的鼠标按下的消息后,发送一条在标题栏内按下的消息。 ---- 例 程 如 下:
.
.
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure AppMessage(var Msg:TMsg;var Handled:Boolean);
.
.
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=AppMessage;
//捕捉消息:将程序的收到消息事件与消息过滤过程关联起来
end;
procedure TForm1.AppMessage(var Msg:TMsg;var Handled:Boolean);
begin
if (Msg.message=WM_LButtonDown) and
//如果鼠标左键按下的话
(DefWindowProc(Handle,WM_NCHitTest,
0,GetMessagePos)=HTClient) and
//判断光标是否在客户区内
((GetKeyState(vk_CONTROL) < 0)
//检测“Ctrl”键是否按下
then
begin
SendMessage(Handle,WM_NCLButtonDown,
HTCaption,GetMessagePos);
//发送鼠标在标题栏内按下的消息
Handled:=true;
end;
Shift: TShiftState; X, Y: Integer);
const
sc_dragmove = $f012;
begin
if form1.Top <=0 then form1.Top :=2;
releasecapture;
twincontrol(application.mainform).perform(wm_syscommand,sc_dragmove, 0);
end;
把这个改改应该可以用;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(self.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
end;
outer2000(天外流星),没有试你的方法,有一个解决的方法就可以了。呵呵
结贴了,不然回答的人多了,不知给谁了