鼠标单击问题

yinzhiw 2004-04-12 10:44:57
我在Button的MouseDown事件中有此按钮的拖动代码:
ReleaseCapture;
Button1.Perform(WM_SYSCOMMAND,$f012,0);
能时间按钮拖动.
但是我在Button的OnClick中的单击事件却不能用:
如写Showmessage('OK');
没有响应,请问怎么解决呢>?
...全文
36 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzy6204 2004-04-12
  • 打赏
  • 举报
回复
将Showmessage('OK');移到MOUSEDOWN事件中去
procedure TForm2.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Button1.Perform(WM_SYSCOMMAND,$f012,0);
showmessage('ok');
end;

yinzhiw 2004-04-12
  • 打赏
  • 举报
回复
ReleaseCapture 函数的功能是这样的
该函数从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理.捕获鼠标的窗口
接收所有的鼠标输入,除非点击鼠标键时,光标热点在令一个线程的窗口中.

按照它的功能所叙,那不就不是ReleaseCapture的影响么?
Linux2001 2004-04-12
  • 打赏
  • 举报
回复
sorry,我刚才讲的内容中有一个地方有错!吃掉鼠标消息的不是Perform而是ReleaseCapture这个API函数,它会吃掉后面的鼠标消息!所以如果你想要触发OnClick事件你要么明确的调用OnClick事件(最简单而又行之有效和效率最高的方式)另外一种方式就是再次发送鼠标消息给Button1,让VCL来进行鼠标OnClick事件的触发!
sdlzlj 2004-04-12
  • 打赏
  • 举报
回复
up
Linux2001 2004-04-12
  • 打赏
  • 举报
回复
因为你的Button1.Perform(WM_SYSCOMMAND,$f012,0);这句代码中的$F012是一个ie魔数,所谓魔数就是一个Delphi本身没有定义的一个常量,但是用这个常量 和有一种意想不到的效果,而Perform是一个广播消息参数,这样Button1就接收到WM_SYSCOMMAND并且去处理这个消息函数去了,并没有接着去处理鼠标按下后Button1父类的默认操作,而inherited就是做这个用处的,不过用在这里好像并没有什么用!所以我这里明确的在OnMouseDown中调用onClick事件!这样就可以满足你的需求了
duhailee 2004-04-12
  • 打赏
  • 举报
回复
不好意思, 我上面写错了,应该是你的ReleaseCapture;调用直接导致ONCLICK事件失去响应,ReleaseCapture;
其定义如下:
function ReleaseCapture; external user32 name 'ReleaseCapture';
你可以换一种拖动BUTTON的方式。
yinzhiw 2004-04-12
  • 打赏
  • 举报
回复
看来这个问题还有点麻烦
期待高手来解决
yinzhiw 2004-04-12
  • 打赏
  • 举报
回复
请问楼上的,加inherited;的意图是什么?
是不是必须把buttonclick的事件放在Button1MouseDown才行呢
有没有不在Button1MouseDown中调用ButtonClick的方法
duhailee 2004-04-12
  • 打赏
  • 举报
回复
呵呵:) 我想应该是这样的,BUTTON的MOUSEDOWN 事件的触发先于ONCLICK事件。
而你的MOUSEDOWN里写了Button1.Perform(WM_SYSCOMMAND,$f012,0); 估计是它在作怪,让以后的ONCLICK事件无法正常响应。。
Linux2001 2004-04-12
  • 打赏
  • 举报
回复

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//SetCapture(Handle);
ReleaseCapture;
Button1.Perform(WM_SYSCOMMAND,$f012,0);
Button1.OnClick(Sender) ;
inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('OK');
end;
lzy6204 2004-04-12
  • 打赏
  • 举报
回复
我觉得有点难度
期待楼下的解决……
yinzhiw 2004-04-12
  • 打赏
  • 举报
回复
To lzy6204(学无止境)
你的方法虽然行
但是我要求放在OnClick事件中响应啊

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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