|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2019/6/13 19:56:15 |
标题: |
Edit控件点击没有焦点的控件,不触发onExit事件,如何解决 |
浏览:736 |
|
加入我的收藏 |
楼主: |
做一个Edit输入检索功能,在Edit输入时弹出检索面板,鼠标点击窗体其他地方时,关闭面板,在Edit的onExit事件中写了关闭面板的代码,但点击的如果是没有焦点的控件,不触发onExit事件,有什么方法解决吗?
----------------------------------------------
- |
作者: |
|
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; 不过,具体实现起来还是有不少需要注意的地方,看你的面板有多少东西了。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
|
作者: |
|
2019/6/14 9:20:37 |
2楼: |
谢谢楼上,点击Panel时,可以获取WM_MOUSEACTIVATE消息,但点击Label时获取不到WM_MOUSEACTIVATE消息,怎么判断点击过Label?
----------------------------------------------
-
|
作者: |
|
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/
|
作者: |
|
2019/6/14 11:35:04 |
5楼: |
iamdream 的方法没理解,hs_kill 的方法可以实现 为什么在窗体中定义的消息 procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; 只能在点击窗体是获取,点击控件时获取不到
----------------------------------------------
-
|
作者: |
|
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
----------------------------------------------
--
|
|