浅谈如何利用PB实现仿QQ自动显示/隐藏窗口(原创)

本文介绍了如何使用PowerBuilder语言实现类似QQ的自动显示/隐藏窗口功能,以及在窗口隐藏后展示颜色滚动效果。通过TrackMouseEvent和窗口事件处理,结合API函数,实现了窗口的动态显示和隐藏,以及颜色条的渐变滚动。详细步骤包括基础准备工作、自动显示/隐藏窗口功能实现和颜色条滚动效果的创建。
摘要由CSDN通过智能技术生成

作者:BALLOONMAN2002  2004年6月26日

本文拟结合POWERBUILDER语言,简述如何实现类似QQ的自动显示/隐藏窗口,即:鼠标移入时自动弹出窗口,鼠标移出后自动隐藏窗口,同时当隐藏窗口后实现WINDOWS操作系统启动画面时显示的不同颜色条滚动效果以提示用户。

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

(一)基本思路

(二)基础准备工作

(三)自动显示/隐藏窗口功能实现

(四)颜色条滚动效果实现

一、基本思路

(一)利用API:TrackMouseEvent函数捕获Wm_MouseLeave消息,来获取并处理鼠标移出事件;利用WINDOW的MOUSEMOVE事件来处理鼠标移入事件。

(二)利用API:CreateSolidBrush、FillRect函数来动态创建颜色渐变区域,以实现不同颜色条滚动效果。

注:

1)通过调用TrackMouseEvent函数能够捕获到WM_NCMOUSEHOVER、WM_NCMOUSELEAVE、WM_MOUSEHOVER、WM_MOUSEHOVER四类消息;

2)同样也可以捕获WM_MOUSEHOVER消息来处理鼠标移入事件,本例为简单起见直接处理MOUSEMOVE事件;

二、基础准备工作

1、新建一窗口,为便于说明问题,本例将窗口的WINDOW TYPE属性设置为POPUP类型,同时将TITLE BAR属性设置为无,这样可以减少鼠标进入非客户区域时也触发Wm_MouseLeave消息的影响;

2、声明本地外部函数:

function integer TrackMouseEvent(ref str_Track_Mouse str_Trm) library 'user32.dll'

function integer GetCursorPos(ref str_Point lppoint) library 'user32.dll'

function integer GetWindowRect(long ll_hwnd,ref str_Rect lpRect) library 'user32.dll'

function ulong PtInRect(ref str_Rect lpRect,ulong Pt_x,ulong Pt_y) library "user32.dll"

subroutine Sleep(ulong dwMilliseconds) library "kernel32.dll"

function ulong GetClientRect(ulong hwnd,ref str_Rect lpRect) library "user32.dll"

function ulong ClientToScreen(ulong hwnd,ref str_Point lpPoint) library "user32.dll"

function ulong OffsetRect(ref str_Rect lpRect,ulong Pt_x,ulong Pt_y) library "user32.dll"

Function ulong ReleaseCapture() LIBRARY "user32.dll"

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

Function ulong GetDC(ulong hwnd) LIBRARY "user32.dll"

Function ulong DeleteObject(ulong hObject) LIBRARY "gdi32.dll"

Function ulong CreateSolidBrush(ulong crColor) LIBRARY "gdi32.dll"

Function ulong ReleaseDC(ulong hwnd,ulong hdc) LIBRARY "user32.dll"

Function ulong FillRect(ulong hdc,ref str_rect lpRect,ulong hBrush) LIBRARY "user32.dll"

注:上述API声明涉及到的结构请查阅MSDN或其他技术资料。

3、声明实例变量(Instance Variables):

boolean ib_onform = false,ib_display = true,ib_first_display = true,ib_first_hide = true

constant integer wm_mouseleave = 675

constant integer WM_NCLBUTTONDOWN = 161

constant integer HTCAPTION = 2

三、自动显示/隐藏窗口功能实现

1、处理该WINDOW的OTHER事件,借助此事件来捕获Wm_MouseLeave消息,来获取并处理鼠标移出事件:

str_Rect ls_rect

str_Point ls_point,ls_tmp

 

//注:Wm_MouseLeave消息一旦离开窗口的CLIENT区域就会发送,如:当鼠标移至窗口上的控件时也会发送此消息,当鼠标移到窗口的CAPTION或者MENU或者BORDER时也会发送此消息,故不能不加任何判断而直接隐藏窗口,并且此消息只发送一遍,若需继续跟踪鼠标,则需再次调用TRACKMOUSEEVENT函数;

if  Message.number = Wm_MouseLeave then

    ib_onform = false

    GetCursorPos(ls_point)

   

    GetClientRect(handle(this),ls_rect)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值