如何阻止Visual FoxPro 9中ComboBox边框点击触发下拉事件
在Visual FoxPro 9中限制ComboBox仅点击下拉按钮触发下拉事件
针对样式为0的ComboBox控件点击边框也会触发下拉的问题,你可以通过在DropDown事件中判断鼠标点击位置是否属于右侧下拉按钮区域来实现需求,具体步骤如下:
- 声明API函数获取鼠标坐标
在表单的Load事件中添加以下代码,用于获取鼠标的屏幕坐标:
DECLARE INTEGER GetCursorPos IN user32 STRING @lpPoint
- 在ComboBox的DropDown事件中添加判断逻辑
在目标ComboBox的DropDown事件中编写代码,判断鼠标是否点击在下拉按钮区域,若不是则取消下拉动作:
LOCAL lnLeft, lnTop, lnWidth, lnHeight, lcPoint, lnMouseX, lnMouseY, lnBtnWidth lnBtnWidth = 17 && 下拉按钮默认宽度,可根据实际系统调整 * 获取控件的屏幕位置与尺寸 THIS.GetWindowRect(@lnLeft, @lnTop, @lnWidth, @lnHeight) lnWidth = lnWidth - lnLeft lnHeight = lnHeight - lnTop * 获取鼠标当前屏幕坐标 lcPoint = REPLICATE(CHR(0), 8) GetCursorPos(@lcPoint) lnMouseX = CTOBIN(SUBSTR(lcPoint, 1, 4), "4RS") lnMouseY = CTOBIN(SUBSTR(lcPoint, 5, 4), "4RS") * 计算鼠标相对于控件左上角的X偏移量 lnMouseX = lnMouseX - lnLeft * 判断点击区域是否为下拉按钮 IF lnMouseX < (lnWidth - lnBtnWidth) * 点击的是控件主体/边框,取消下拉 THIS.DropDown = .F. ENDIF
补充说明
- 即使将ComboBox的
BorderStyle设为0(None),GetWindowRect仍能准确获取控件的实际边界,因此判断逻辑依然有效。 - 如果
lnBtnWidth的默认值17不符合你的系统显示,可以通过测试调整:在点击按钮边缘时输出lnWidth - lnMouseX的值,得到准确的按钮宽度。 - 若需要在多个表单中复用该逻辑,可以将ComboBox子类化,把上述判断逻辑封装到子类的
DropDown事件中。
内容的提问来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

