作者: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:WEIYIN2001@MSN.COM
如有不当之处,敬盼您的指点。