自定义了个combobox想在单击其他的地方的时候关闭下拉框

时间:2022-06-20 23:50:30
我想出了两种方法都不太满意。
1,下拉到时候capture,在外边单击的时候releasecapture。。。
这个情况有个问题,如果在外边的按钮上单击。按钮收不到消息
2.全局钩子
其他控件能收到消息啊,但是这个有点卡啊。


请各位帮忙出出主意

10 个解决方案

#1


我靠,发了两遍。。。。谁给解决了两个帖子分都给他拉

#2


其他地方是什么意思?

1。如果是点击ComboBox的其他地方,这个比较好实现,不用讲了吧?
2。如果是点击ComboBox以外的地方,当你失去焦点的时候,去处理不就行了吗?

#3


引用 2 楼 wangyong0921 的回复:
其他地方是什么意思?

1。如果是点击ComboBox的其他地方,这个比较好实现,不用讲了吧?
2。如果是点击ComboBox以外的地方,当你失去焦点的时候,去处理不就行了吗?

单击其他控件的时候失去焦点,这种情况好处理,只要处理Leave事件就可以了。
但是单击空白处呢。。讲讲吧

#4


我想在除comboBox的所有控件的单击事件加上
comboBox1.text = comboBox1.SelectedItem.ToString()

#5


引用 3 楼 xuchonglei 的回复:
引用 2 楼 wangyong0921 的回复:
其他地方是什么意思?

1。如果是点击ComboBox的其他地方,这个比较好实现,不用讲了吧?
2。如果是点击ComboBox以外的地方,当你失去焦点的时候,去处理不就行了吗?

单击其他控件的时候失去焦点,这种情况好处理,只要处理Leave事件就可以了。
但是单击空白处呢。。讲讲吧


最笨的方法,在WinForm控件里面处理KeyDown事件

#6


那岂不是要在所有的控件里都加上KeyDown。那如果点击其他程序的话就捕捉不到了。。。
不知道.Net内部的ToolStripManager是怎么处理
我要的效果是vs标准工具栏中那个下拉搜索的控件的效果。(单击输入框,不关闭下拉框。单击其他地方(除了组合控件的任何地方包括其他程序)关闭)

#7


给一个bt的办法
在该控件添加到父容器的时候
遍历*父容器的所有控件 并加上keydown事件

#8


谢谢各位解答。最后还是用的钩子。就是关闭程序的时候有点卡。希望release时能好点/
            Point textTopLeft = base.Parent.PointToScreen(new Point(base.Left, base.Top));
            Rectangle rectText = new Rectangle(textTopLeft, base.Size);
            Point popTopLeft = new Point(this._dropDown.Left, this._dropDown.Top);
            Rectangle rect = new Rectangle(popTopLeft, this._dropDown.Size);

            if (rectText.Contains(e.X, e.Y) || rect.Contains(e.X, e.Y))
            {

            }
            else
            {
                this._dropDown.Hide();
            }

#9


补充下e.X e.Y为全局钩子返回的坐标(相对于屏幕) dropdown的坐标也是相对于屏幕的,就不用转了

#10


最后把挂载钩子扔到线程池里处理了,就不卡了。注意处理时Invoke到UI线程,否则无效。Dispose的时候卸载掉

#1


我靠,发了两遍。。。。谁给解决了两个帖子分都给他拉

#2


其他地方是什么意思?

1。如果是点击ComboBox的其他地方,这个比较好实现,不用讲了吧?
2。如果是点击ComboBox以外的地方,当你失去焦点的时候,去处理不就行了吗?

#3


引用 2 楼 wangyong0921 的回复:
其他地方是什么意思?

1。如果是点击ComboBox的其他地方,这个比较好实现,不用讲了吧?
2。如果是点击ComboBox以外的地方,当你失去焦点的时候,去处理不就行了吗?

单击其他控件的时候失去焦点,这种情况好处理,只要处理Leave事件就可以了。
但是单击空白处呢。。讲讲吧

#4


我想在除comboBox的所有控件的单击事件加上
comboBox1.text = comboBox1.SelectedItem.ToString()

#5


引用 3 楼 xuchonglei 的回复:
引用 2 楼 wangyong0921 的回复:
其他地方是什么意思?

1。如果是点击ComboBox的其他地方,这个比较好实现,不用讲了吧?
2。如果是点击ComboBox以外的地方,当你失去焦点的时候,去处理不就行了吗?

单击其他控件的时候失去焦点,这种情况好处理,只要处理Leave事件就可以了。
但是单击空白处呢。。讲讲吧


最笨的方法,在WinForm控件里面处理KeyDown事件

#6


那岂不是要在所有的控件里都加上KeyDown。那如果点击其他程序的话就捕捉不到了。。。
不知道.Net内部的ToolStripManager是怎么处理
我要的效果是vs标准工具栏中那个下拉搜索的控件的效果。(单击输入框,不关闭下拉框。单击其他地方(除了组合控件的任何地方包括其他程序)关闭)

#7


给一个bt的办法
在该控件添加到父容器的时候
遍历*父容器的所有控件 并加上keydown事件

#8


谢谢各位解答。最后还是用的钩子。就是关闭程序的时候有点卡。希望release时能好点/
            Point textTopLeft = base.Parent.PointToScreen(new Point(base.Left, base.Top));
            Rectangle rectText = new Rectangle(textTopLeft, base.Size);
            Point popTopLeft = new Point(this._dropDown.Left, this._dropDown.Top);
            Rectangle rect = new Rectangle(popTopLeft, this._dropDown.Size);

            if (rectText.Contains(e.X, e.Y) || rect.Contains(e.X, e.Y))
            {

            }
            else
            {
                this._dropDown.Hide();
            }

#9


补充下e.X e.Y为全局钩子返回的坐标(相对于屏幕) dropdown的坐标也是相对于屏幕的,就不用转了

#10


最后把挂载钩子扔到线程池里处理了,就不卡了。注意处理时Invoke到UI线程,否则无效。Dispose的时候卸载掉