浅谈如何利用PB实现树型列表动态半透明提示(原创)

本文详细介绍了如何在PowerBuilder中利用API函数和自定义用户事件,实现在树型列表上鼠标移动时动态显示半透明提示的效果。通过发送TVM_HITTEST消息获取节点信息,模拟半透明效果,以及创建特殊形状的提示窗口,最终达到类似金山词霸的提示样式。文章分为获取节点信息、半透明效果实现和气泡形状效果实现三个部分,适合PowerBuilder开发者参考学习。
摘要由CSDN通过智能技术生成

作者:BALLOONMAN2002  2004年6月26日

本文拟结合POWERBUILDER语言,简述如何实现树型列表动态半透明提示,即鼠标移动到树型列表某一项ITEM时会动态提示,且为类似金山词霸的半透明提示效果。

效果图见:

http://blog.csdn.net/images/blog_csdn_net/balloonman2002/17312/r_BALLOON-1.JPG

本文拟分以下四部分论述分三次完成:

(一)基本思路

(二)如何获取当前鼠标坐标对应NODE结点信息

(三)半透明效果实现

(四)气泡形状效果实现

一、基本思路

(一)在POWERBUILDER语言中,TREEVIEW控件并不具备如VB等其他语言一样当鼠标未选中NODE时,直接获取当前鼠标对应X、Y坐标下所属NODE结点的方法,VB中可以直接利用HITTEST方法来获取对当前鼠标坐标对应的NODE结点。但可以通过调用API:SENDMESSAGE函数来向TREEVIEW控件发送一个TVM_HITTEST消息来间接实现上述效果。

(二)在POWERBUILDER语言中,并没有直接让控件实现半透明的方法,而目前WINDOWS2000/XP操作系统提供了一个API函数:SetLayeredWindowAttributes,但该API函数不支持WINDOWS98操作系统,考虑到系统的全面兼容性,必须同时考虑WINDOWS98下面应该如何实现半透明提示效果。因此我们必须放弃采用上述API,而采用模拟半透明的方式,即:处理WINDOW的MOUSEMOVE事件,当鼠标移动到某一位置后将鼠标附近区域用API函数BitBlt、AlphaBlend截图下来,并拷贝到气泡提示控件背景设备即可模拟实现半透明效果。

(三)如何实现微软的气泡形状控件?由于POWERBUILDER对一些控件支持并不好,而且此类控件难以寻找,我们就考虑自己动手编写。主要借助API函数:CreateRectRgn、CreateRoundRectRgn、CreatePolygonRgn、CombineRgn等。

二、如何获取当前鼠标坐标对应NODE结点信息

1、新建一窗口,内含一TREEVIEW控件;

2、声明本地外部函数:

Function ulong SendMessage1(ulong hwnd,ulong wMsg,ulong wParam,ref TVHITTESTINFO lParam) LIBRARY "user32.dll" ALIAS FOR "SendMessageA"

Function ulong SendMessage2(ulong hwnd,ulong wMsg,ulong wParam,ref TVITEM lParam) LIBRARY "user32.dll" ALIAS FOR "SendMessageA"

SUBROUTINE  CopyMemory  (ref string Destination , long Source, long Length)  LIBRARY "kernel32"  Alias for "RtlMoveMemory"

Function ulong GlobalFree(ulong hMem) LIBRARY "kernel32.dll"

Function ulong GlobalAlloc(ulong wFlags,ulong dwBytes) LIBRARY "kernel32.dll"注:上述API声明涉及到的结构请查阅MSDN或其他技术资料。

3、对于该TREEVIEW控件自定义用户事件UE_MOUSEMOVE(PBM_MOUSEMOVE),在此事件当中处理鼠标移动事件,发送TVM_HITTEST消息:

tpoint ptA

tvhittestinfo tf

TVITEM tv

ulong hItem,ll_1,ll_2,ll_3,hStr

long ret,ll_x,ll_y

string astr,bstr,ls_help

 

ptA.x = UnitsToPixels(xpos, XUnitsToPixels!)

ptA.y = UnitsToPixels(ypos, YUnitsToPixels!)

tf.pt = ptA

tf.flags = 4

 

hItem = SendMessage1(handle(tv_1),4369,0,tf)

//注:上述4369为TVM_HITTEST

//通过发送TVM_HITTEST消息来获取当前对应的NODE的句柄,,将当前NODE结点信息保存到结构变量 TF当中

If ((hItem <= 0) Or (hItem = hItemPrv)) Then return

 

hItemPrv = hItem

hStr = GlobalAlloc(0,1024)

 

If hStr > 0 Then

    tv.mask = 1

    tv.HTreeItem = hItem

    tv.pszText = hStr

    tv.cchTextMax = 1023

    ret = SendMessage2(handle(tv_1), 4364, 0, tv)

//注:上述4364为TVM_GETITEM

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值