浅谈如何利用PB实现仿QQ自动显示/隐藏窗口(三)(原创)
2024-07-21 02:10:10
供稿:网友
本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
作者:balloonman2002 2004年6月26日
四、颜色条滚动效果实现
1、获取该窗口的hdc(设备句柄),即在窗口的open事件当中编写:
声明全局变量:long gl_hdc
声明外部函数:function ulong getdc(ulong hwnd) library "user32.dll"
gl_hdc = getdc(handle(this))
2、创建一个timing类型用户对象user object,用于动态绘制彩色矩形:
(1)首先声明该对象实例变量:
integer ii_turn
str_rect is_rect_all,is_rect_form
long il_hbrush,il_target_height,il_target_width,il_target_pace,il_height_base
(2)初始化该用户对象,编写其constructor事件:
ii_turn = 1
il_target_width = unitstopixels(w_function.width , xunitstopixels!)
//设置整个目标区域的宽度
il_target_height = unitstopixels(w_function.height , yunitstopixels!)
//设置整个目标区域的高度
il_target_pace = 15 //设置彩色颜色条滚动步距
il_height_base = 100 //设置彩色颜色条宽度
is_rect_all.left = il_target_width - unitstopixels(30 , xunitstopixels!)
is_rect_all.right = il_target_width
is_rect_form.top = 0
is_rect_form.bottom = il_target_height
is_rect_form.left = is_rect_all.left
is_rect_form.right = is_rect_all.right
il_hbrush = createsolidbrush(gl_backcolor)
(3)开始具体编写动态颜色条滚动效果代码,即处理该对象的timer事件:
str_rect ls_rect_tmp
long ll_tmp,ll_ret,ll_hbrush
integer li_red,li_green,li_blue
if ii_turn = 1 then
if is_rect_all.top < il_target_height - il_height_base - il_target_pace then
is_rect_all.top = is_rect_all.top + il_target_pace
else
is_rect_all.top = il_target_height - il_height_base
ii_turn = -1
end if
else
if is_rect_all.top > il_target_pace then
is_rect_all.top = is_rect_all.top - il_target_pace
else
is_rect_all.top = 0
ii_turn = 1
end if
end if
is_rect_all.bottom = is_rect_all.top + il_height_base
//w_function.backcolor = gl_backcolor
ll_ret = fillrect(gl_hdc, is_rect_form, il_hbrush) //注:这样比上面一句效率高
li_red = mod(gl_backcolor,256)
li_green = truncate(mod((gl_backcolor - li_red),65536) / 256 , 0)
li_blue = truncate(gl_backcolor / 65536 , 0)
ls_rect_tmp.left = is_rect_all.left
ls_rect_tmp.right = is_rect_all.right
if ii_turn = 1 then
ls_rect_tmp.bottom = is_rect_all.top
do while ls_rect_tmp.bottom < is_rect_all.bottom
li_red = li_red - 20 //注:这里的20决定了颜色的深浅程度 li_green = li_green - 20
li_blue = li_blue - 20
if li_red < 0 then
li_red = 0
end if
if li_green < 0 then
li_green = 0
end if
if li_blue < 0 then
li_blue = 0
end if
ll_hbrush = createsolidbrush(rgb(li_red,li_green,li_blue))
ls_rect_tmp.top = ls_rect_tmp.bottom
ls_rect_tmp.bottom = ls_rect_tmp.top + 25 //注:这里的25决定了渐变的快慢程度
ll_ret = fillrect(gl_hdc, ls_rect_tmp, ll_hbrush)
ll_ret = deleteobject(ll_hbrush)
loop
else
ls_rect_tmp.top = is_rect_all.bottom
do while ls_rect_tmp.top > is_rect_all.top
li_red = li_red - 20
li_green = li_green - 20
li_blue = li_blue - 20
if li_red < 0 then
li_red = 0
end if
if li_green < 0 then
li_green = 0
end if
if li_blue < 0 then
li_blue = 0
end if
ll_hbrush = createsolidbrush(rgb(li_red,li_green,li_blue))
ls_rect_tmp.bottom = ls_rect_tmp.top
ls_rect_tmp.top = ls_rect_tmp.bottom - 25
ll_ret = fillrect(gl_hdc, ls_rect_tmp, ll_hbrush)
ll_ret = deleteobject(ll_hbrush)
loop
end if
3、在主window窗口中调用此timing对象:
(1)处理open事件:iuo_timer = create uo_timer
(2)处理wf_hide_h/v事件:iuo_timer.start(0.2)
(3)处理close事件:destroy iuo_timer
至此,仿qq自动显示/隐藏加颜色条滚动效果窗口全部完成。
由于我自己是分在两个程序当中实现上述两种效果,故无法给出完整的示意图,仅以如下两图示例:
http://blog.csdn.net/images/blog_csdn_net/balloonman2002/17312/r_autohide.jpg
http://blog.csdn.net/images/blog_csdn_net/balloonman2002/17312/r_scroll_eff.jpg
如需要进一步资料,请联系qq:27855043,msn:[email protected]
如有不当之处,敬盼您的指点。