判断组合框是否展开

作者在 2006-06-12 09:46:00 发布以下内容

组合框(COMBO1)是否展开(即下拉部分是否可见)的判断问题看起来很难实现,初看好象十分地没有意思,其实这是个很有意思的问题。这个问题本身不难,但找到解决这个问题的办法的过程却需要想象,且有助于开阔思路。

COMBO1.MOUSEDOWN()记录了很多的信息:
LPARAMETERS nButton, nShift, nXCoord, nYCoord
    其中nButton记录按的是鼠标左键(1)还是右键(2);nSfift的值表示是否按着Sfift键的同时点击鼠标(按着返回1;否则为0);而nXCoord和nYCoord则记录着点击鼠标的时候坐标点的值。而想让组合框下拉部分展开,必须点击组合框右边的向下的箭头部分。这部分的nXCoord的值与组合框的左边值(LEFT)和宽度值(WIDTH)的相互关系决定了用户是否按了鼠标左键。

经过测试,组合框右边的向下的箭头宽度为20个点(pix)。程序就成了在MOUSEDOWN方法中进行相关数据的判断问题。

(1)在FORM1.INIT()中定义变量OK为全局变量
PUBLIC OK

(2)在COMBO1.MOUSEDOWN()中输入
IF nXCoord+20>THIS.LEFT+THIS.WIDTH AND nButton=1 AND !OK
  WAIT WINDOWS NOWAIT [OK]
ELSE
  WAIT WINDOWS NOWAIT [NO]
ENDIF
 OK=!OK

谢谢网友的批评。用户按“正确”的操作,是没有问题的,但别的情况没有考虑到。为此,修改如下:

(1)THISFORM.INIT()
PUBLIC OK
OK=.F.

(2)THISFORM.COMBO1.MOUSEDOWN()
DO CASE
  CASE nXCoord>=THIS.LEFT AND nXCoord<=THIS.LEFT+THIS.WIDTH AND nYCoord>=THIS.TOP AND nYCoord<=THIS.TOP+THIS.HEIGHT AND nButton=1
    OK=!OK
  CASE (nXCoord<THIS.LEFT OR nXCoord>THIS.LEFT+THIS.WIDTH OR nYCoord<THIS.TOP) AND OK
    OK=.F.
ENDCASE
WAIT WINDOWS NOWAIT IIF(OK,[已展开],[已关闭])

(3)THISFORM.MOUSEDOWN()
IF OK
  OK=!OK
ENDIF

欢迎继续批评指正。

VFP程序 | 阅读 2126 次
文章评论,共0条
游客请输入验证码
浏览118792次