首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > PB中如何检测鼠标移入移出控件
【标  题】:PB中如何检测鼠标移入移出控件
【关键字】:PB
【来  源】:http://blog.csdn.net/followdream/archive/2006/08/29/1138454.aspx

PB中如何检测鼠标移入移出控件

实际编程中经常遇到检测鼠标是否进入某个控件的情况,有人建议用如下方法解决:
在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

最后功能实现如下:

Author : FreeBirdSky

Date : 08/29/2006

Blog : http://blog.csdn.net/followdream

 

解决SQL SERVER 2005无法远程连接的问题:【上一篇】
在Windows Server 2003 Enterprise Edition上安装SQL Server 2000后的连接问题?:【下一篇】
【相关文章】
  • pb学习体会(一)--------------pb下.bib文件的作用简介
  • all phpbb exploit(perl)
  • phpBB安装配置总结
  • linux上的PBX系统Asterisk
  • 将PB的交叉报表完整转换成EXCEL
  • phpBB 3 (memberlist.php) Remote SQL Injection Expl
  • PB-BUG:解决调用setfullstate后出现的双滚动条问题
  • 为PB添加dateadd函数
  • PB API调用原型
  • 如何用VC创建可在PB中调用的DLL
  • 【随机文章】
  • 如何修改.cc文件为vc认识的c/c++文件
  • Eclipse 启动参数配置
  • 龙芯软件开发(26)-- PCI设备初始化4
  • 怎么确定机器会运行 64 位内核
  • JSP的字符串替换函数
  • 为类型信息使用特征类
  • 操作数组的类
  • Gentoo默认网关的设置
  • 图书管理程序(一)
  • 23条硬件维护基本技巧必看
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.