作者: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