淺談如何利用PB實現仿QQ自動顯示/隱藏窗口(一)(原創)
2024-07-21 02:10:10
供稿:網友
作者: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