问题描述
近日在制作一个控件,功能是点击弹出一个带列表的小框框,然后在小框框内进行选择。本来事件的触发一直都在MouseDown内,现在因为需要改到MouseClick里面。所有都不变,改完后,小框框弹出正常,但是无法在小框框内进行选择。小框框内的选择部分有个PreFilterMessage函数,过滤鼠标消息。单击小框框后,两种方法都会进入到该函数进行消息过滤,但是MouseDown在消息过滤后,调用了小框框自身的MouseDown事件,而在MouseClick内触发则调用了控件本身的MouseDown事件。小框框的弹出过程完全一样,仅仅是触发事件的不同而已,求教原因。。
解决方案
解决方案二:
没看懂小框框为什么要做鼠标消息过滤?弹出后,不是已经覆盖窗体了么,点击小框框,怎么还会触发窗体的事件?
解决方案三:
引用1楼Z65443344的回复:
没看懂小框框为什么要做鼠标消息过滤?弹出后,不是已经覆盖窗体了么,点击小框框,怎么还会触发窗体的事件?
因为有其他的控制,譬如当点击在小框框以外怎么办,或者要选择多个选项怎么办等等当用MouseClick触发时,点击小框框后能够触发小框框内部的消息筛选函数,但是接下来就是触发的小框框的父控件的事件,而当用MouseDown触发时,点击小框框后触发小框框内部的消息筛选函数后,触发小框框本身的事件。System.Windows.Forms.Application.AddMessageFilter(this);while(Windows32.User32.WaitMessage()){System.Windows.Forms.Application.DoEvents();if(bolExitLoop)break;}System.Windows.Forms.Application.RemoveMessageFilter(this);这是等待用户操作的函数内部分代码,我怀疑是不是mouseclick触发后,紧接着就有别的事件触发了,导致跳出了循环
解决方案四:
如果你给控件同时注册了鼠标按下和鼠标点击,当然会有2个事件被触发
解决方案五:
事件过滤器中可以判断句柄,通过句柄区分是down的谁,你的逻辑我们搞不明白,所以肯定问题出在点击逻辑上,或者没有区分被操作的对象