我在用powerbuilder做一个房管系统,里面用到了定制可视用户对象,但遇到了些问题

我想用该对象在窗口中显示房态图,并定义自定义事件,是鼠标移入对象时打开另外一个窗口,移出对象时关闭该窗口,请哪位高手指点指点。。。。尽量详细点,感谢

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

温馨提示:内容为网友见解,仅供参考
无其他回答

我在用powerbuilder做一个房管系统,里面用到了定制可视用户对象,但遇 ...
即Width,Height,X,Y。那么我们可以利用这几个属性与鼠标当前位置进 行比较,从而做出判断。具体实例如下(以数据窗口控件为例,以上所列各种控件均通过实验):假设有一个窗口w_test,窗口上有一个数据窗口控件dw_1和 几个静态文本控件sle_1、sle_2、sle_3、sle_4等等。首先,定义一个结构(Structure)名称...

如何用Powerbuilder可视用户对象,通过用户对象动态显示设备的信息_百 ...
你的需求可以通过组态软件实现,在pb中看做一个控件

PowerBuilder用户对象类型包括什么
PowerBuilder6的用户对象可分为可视用户对象和类用户对象。1、可视用户对象分为三种类型:1)、标准可视用户对象;2)、定制可视用户对象;3)、外部可视用户对象。2、类用户对象分为:1)标准用户对象;2)定制用户对象;3)C++用户对象。

PowerBuilder 9.0进阶开发篇:实例与技巧篇书籍目录
1.1 类Outlook工具栏界面实现 1.2 制作Splash窗口 1.3 制作美观的状态条 1.4 实现图标栏应用 1.5 MDI窗口显示背景图片 1.6 窗口中控件显示ToolTips 1.7 打造不一样的命令按钮 1.8 透明文本的实现 1.9 导航图界面的制作 1.10 制作图文并茂的菜单 1.11 窗口内控件大小与窗口大小同步 1.12...

编程的英语翻译
建议:对于编程入门人员,可以先借助VB这个可视化环境大致了解可视化编程的特点,并且可开发与系统无关的综合应用程序。(二) PowerBuilder 是开发MIS系统和各类数据库跨平台的首选,使用简单,容易学习,容易掌握,在代码执行效率上也有相当出色的表现。PB是一种真正的4GL语言(第四代语言),可随意直接嵌套...

常用编程软件名称
(二) PowerBuilder 是开发MIS系统和各类数据库跨平台的首选,使用简单,容易学习,容易掌握,在代码执行效率上也有相当出色的表现。PB是一种真正的4GL语言(第四代语言),可随意直接嵌套SQL语句返回值被赋值到语句的变量中,支持语句级游标,存储过程和数据库函数,是一种类似SQLJ的规范,数据访问中具有无...

相似回答