|
作者: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自动显示/隐藏加颜色条滚动效果窗口全部完成。 由于我自己是分在两个程序当中实现上述两种效果,故无法给出完整的示意图,仅以如下两图示例: /A-A-A/2005/07/17/20050717101609109517_1.jpg /A-A-A/2005/07/17/20050717101609109515_2.jpg 如需要进一步资料,请联系QQ:27855043,MSN:WEIYIN2001@MSN.COM 如有不当之处,敬盼您的指点。
|