实际编程中经常遇到检测鼠标是否进入某个控件的情况,有人建议用如下方法解决:
在pbm_mousemove事件中添加如下代码:
IF picture_tr=True THEN
st_1.textColor=rgb(255, 0, 0)
//换成红色
SetCapture(Handle(This))
//跟踪鼠标
Picture_tr=False
//标记已经换成红色
ELSEIF (Xpos<0 Or Ypos<0 Or Xpos>This.Width Or Ypos>This.Height) THEN
st_1.textColor= rgb(0, 0, 255)
//换成蓝色
ReleaseCapture()
//停止跟踪鼠标
Picture_tr=True
//标记已经换回蓝色
END IF
在globalVaviables下定义
Boolean picture_tr = TRUE
在GlobalExternalFunction下定义
FUNCTION ulong SetCapture(ulong hwnd) LIBRARY "user32.dll"
//跟踪鼠标
FUNCTION ulong ReleaseCapture() LIBRARY "user32.dll"
//释放鼠标
-------------------------------------------------------------------------------------------
以上方法的确可以基本实现这种功能,但是实际实验时却存在一个问题:
假定目标控件是一个数据窗口控件,那么当鼠标移动到数据窗口控件内,
st_1的文字变成红色;当鼠标移动到数据窗口控件外,st_1的文字变成蓝
色。但是,当把鼠标左键在数据窗口控件上单击一下后,却发现st_1的文
字颜色不再随鼠标移入移出数据窗口控件而发生变化了。估计是因为鼠
标左键在数据窗口控件上单击触发了数据窗口控件的clicked事件,从而
停止了对pbm_mousemove事件的响应。
经过考虑和试验,终于找到了一种相对较好的解决方案:
通过查阅PB的帮助文档发现,几乎所有的可视控件(如DataWindow、Picture、
StaticText、CommandButton、PictureButton、SingleLingEdit、EditMask、
MultiLineEdit、RichTextEdit、Graph等等)都包含以下几个属性,
即Width,Height,X,Y。那么我们可以利用这几个属性与鼠标当前位置进
行比较,从而做出判断。
具体实例如下(以数据窗口控件为例,以上所列各种控件均通过实验):
*******************************************************************************************
假设有一个窗口w_test,窗口上有一个数据窗口控件dw_1和
几个静态文本控件sle_1、sle_2、sle_3、sle_4等等。
首先,定义一个结构(Structure)名称为POINTAPI,内容如下:
Variable Name Type
xpos long
ypos long
然后,声明两个全局外部函数(Global External Fuctions):
//注意,此处的参数类型POINTAPI必须与先前结构中定义的名称一致,即POINTAPI
FUNCTION ulong GetCursorPos(ref POINTAPI lpPoint) LIBRARY "user32.dll"
FUNCTION ulong ScreenToClient(ulong hwnd,ref POINTAPI lpPoint) LIBRARY "user32.dll"
在窗口w_test的open事件中添加如下代码:
Timer(0.1)//设置计时器,计时间隔为0.1秒
在窗口w_test的timer事件中添加如下代码:
POINTAPI myPA
GetCursorPos(myPA)//获取当前光标位置
ScreenToClient(Handle(this),myPA)//转化为客户区表示
Integer li_xpos,li_ypos
li_xpos = myPA.xpos
li_ypos = myPA.ypos
st_2.Text = String(li_xpos) + ',' + String (li_ypos)
Integer li_dww,li_dwh
li_dww = this.dw_1.Width//获取数据窗口的Width属性(单位是PB Units)
li_dwh = this.dw_1.Height//获取数据窗口的Height属性(单位是PB Units)
li_dww = UnitsToPixels(li_dww,XUnitsToPixels!)//把用PB Units为单位的Width转化为用Pixels为单位
li_dwh = UnitsToPixels(li_dwh,YUnitsToPixels!)//把用PB Units为单位的Height转化为用Pixels为单位
st_3.Text = String(li_dww) + ',' + String (li_dwh)
Integer li_dwx,li_dwy
li_dwx = this.dw_1.X//获取数据窗口的X属性(与窗口左边界的距离,单位是PB Units)
li_dwy = this.dw_1.Y//获取数据窗口的Y属性(与窗口上边界的距离,单位是PB Units)
li_dwx = UnitsToPixels(li_dwx,XUnitsToPixels!)//把用PB Units为单位的X转化为用Pixels为单位
li_dwy = UnitsToPixels(li_dwy,YUnitsToPixels!)//把用PB Units为单位的Y转化为用Pixels为单位
st_4.Text = String(li_dwx) + ',' + String (li_dwy)
IF li_xpos < li_dwx OR li_ypos < li_dwy OR li_xpos > li_dwx + li_dww OR li_ypos > li_dwy + li_dwh THEN
st_1.textColor=rgb(0, 0, 255)//光标在控件外,文字为蓝色
ELSE
st_1.textColor=rgb(255, 0, 0)//光标在控件内,文字为红色
END IF
追问可是定制可视用户对象的X Y属性不可用啊,无法实现,而且我是想当鼠标移到该对象的时候自动打开一个窗口,当移出是自动关闭该窗口,麻烦你在帮我指点指点,详细点最好
参考资料:http://hi.baidu.com/freebirdsky/blog/item/1cae3b12f192aa51f919b807.html