首页 > 开发 > 综合 > 正文

浅谈如何利用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]

    如有不当之处,敬盼您的指点。
    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表