DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wugangbest
今日帖子: 26
在线用户: 18
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 tx001 (tx) ▲▲△△△ -
普通会员
2019/6/13 19:56:15
标题:
Edit控件点击没有焦点的控件,不触发onExit事件,如何解决 浏览:736
加入我的收藏
楼主: 做一个Edit输入检索功能,在Edit输入时弹出检索面板,鼠标点击窗体其他地方时,关闭面板,在Edit的onExit事件中写了关闭面板的代码,但点击的如果是没有焦点的控件,不触发onExit事件,有什么方法解决吗?
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/6/13 22:48:32
1楼: 简单的方法是你点击其他没焦点的控件时让焦点转移,或直接调用OnExit事件。当然,这样做比较笨。
比较好的方法是参考DBCtrls.pas中TPopupDataList及TCustomDBLookupComboBox的实现方法,主要是弹出的面板不要有焦点:
  SetWindowPos(<面板>.Handle, HWND_TOP, X, Y, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
还需要请注意处理WM_MOUSEACTIVATE消息:
procedure TPopupDataList.WMMouseActivate(var Message: TWMMouseActivate);
begin
  Message.Result := MA_NOACTIVATE;
end;
不过,具体实现起来还是有不少需要注意的地方,看你的面板有多少东西了。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 tx001 (tx) ▲▲△△△ -
普通会员
2019/6/14 9:20:37
2楼: 谢谢楼上,点击Panel时,可以获取WM_MOUSEACTIVATE消息,但点击Label时获取不到WM_MOUSEACTIVATE消息,怎么判断点击过Label?
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/6/14 9:44:26
3楼: 这是针对面板的,我的意思是弹出的面板需要处理这个消息,就是不让面板获得焦点。Label没有焦点,要处理的话也是在它的上层组件里,况且我觉得不需要处理。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2019/6/14 10:33:39
4楼: 简单粗暴点的方法, 在applicationevent里获取鼠标消息, 判断如果点击的坐标在面板区域外就关闭面板
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 tx001 (tx) ▲▲△△△ -
普通会员
2019/6/14 11:35:04
5楼: iamdream 的方法没理解,hs_kill 的方法可以实现
为什么在窗体中定义的消息 procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; 只能在点击窗体是获取,点击控件时获取不到
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/6/14 12:54:29
6楼: 哦,想做一个类似输入法的选字窗口的效果吧。
直接hook消息循环处理确实可以,不过会影响性能。
另外,鼠标分左中右键,都需要判断。还需要考虑整个应用程序的激活状态。
不如直接处理窗口的几个消息。

WM_ACTIVATEAPP
WM_MOUSEACTIVATE
WM_CHILDACTIVATE
WM_NCACTIVATE
WM_LBUTTONDOWN
WM_MBUTTONDOWN
WM_RBUTTONDOWN
WM_NCLBUTTONDOWN
WM_NCMBUTTONDOWN
WM_NCRBUTTONDOWN
----------------------------------------------
--
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行58.59375毫秒 RSS