请问如何用sendmessage来移动边框为none的窗体?
解决方案 »
- Delphi 默认输出路径
- 50 简单问题,DLL里如何头部申明...............
- 无聊
- 如何把一个按钮的Enabled和DBNavigator中的一个按钮相关联?
- 动态库中的子窗口,为什么方向键没有用了,高手请进!高分100
- 如果写一个DLL返回一个XML的文本数据(XML的数据很大可能有10000行)采用什么方法好呀, 用PChar 可以吗?
- Delphi如何实现连接outlook发邮件,近来看看把!
- 新年问题:如何得到字符的ASCII码。
- 高分紧急救助
- *********急需‘远程控制’软件********
- 取richedit的当前的总行数,忘了是哪个属性,实在想不起来了
- 通过哪个函数可以得到本机的IP地址和主机名称?在线等待,马上给分
SendMessage(frmProgress->Handle, WM_SYSCOMMAND, 0xF012, 0);
这样就可以了,我再给你介绍另外的几个方法。
在消息中判断:
if msg.result = ht_client then
begin
msg.result := ht_caption;
end;
Inherited;
2、Perform();和SendMessage一样;上面的0xf012写错了,是$f012
3、在MouseDown、MouseMove、MouseUp里实现,
按下鼠标后,在Move的时候计算鼠标的位置,来重新设置form的位置。
******************
不用标题栏也移动窗体
一般情况下,移动一个窗体需要将鼠标放置在标题栏上才能拖动窗体,为 什么非要使用标题栏呢?其实我们可以使用一个巧妙的方法来实现将鼠标放置 在窗体上按下就可拖动窗体,下面先看实现代码。在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;
end;