注册 登录
编程论坛 VB6论坛

如何解决闪动问题

yuk_yu 发布于 2015-06-18 16:54, 1896 次点击
只有本站会员才能查看附件,请 登录


如何解决闪动问题?
2 回复
#2
lianyicq2015-06-18 17:06
回复 楼主 yuk_yu
字体还挺好看,我这儿不只是闪的问题,I还有拖尾.
可能这个问题跟用VB做动画一样,用DirectX画或许有点改善.以前试过做纵版打飞机,感觉在全屏模式下和用picturebox窗口下绘图差别不大.
但这是label控件,我再想想能不能找到解决办法.
不过代码中用不着在form_load 中Call Timer2_Timer
...
3楼风版方法真巧,实现也容易。不用我再费周折了。

[ 本帖最后由 lianyicq 于 2015-6-19 09:00 编辑 ]
#3
风吹过b2015-06-18 19:35
在窗体上 放二个 Picture,一个名叫 Picture1,一个叫 Picture2
其中 Picture1,的上下位置放到你要显示的位置,左右不用管。
Picture1   显示区
Picture2   缓冲区,不显示

WIN7+VB6 ,不闪烁。

程序代码:

Option Explicit

Dim step%                           '移动方向,1 向右,-1 向左
Const str = "IC Subtool Shortcut"   '移动的文字内容
Dim strH As Long, strW As Long

Private Sub Form_Resize()
'载入窗体后本过程会被自动调用一次,不需要手动调用

'显示区和缓冲区随窗口大小而变化
    Picture1.Move 0, Picture1.Top, Me.ScaleWidth        '改变大小
    Picture2.Move 0, 512, Me.ScaleWidth
   
    Dim fs As Long
    fs = 48                 '字号初始为 48
    Do
        Picture2.Font.Size = fs                 '设置字号
        strW = Picture2.TextWidth(str)          '文字长度
        If strW > Picture2.ScaleWidth Then      '如果显示不了
            fs = fs / 2                         '字号减半
        Else
            Exit Do                             '能显示则退出循环
        End If
    Loop

    strH = Picture2.TextHeight(str)             '文字高度
    Picture2.Height = strH                      '缓冲图像区高度
    Picture1.Height = strH                      '显示区高度

End Sub

Private Sub Timer2_Timer()

    Static strX As Long                         '坐标

    '如果超出右边界并且是向右移动 或者 超出左边界并且是向左移动
    If (strX + strW > Me.ScaleWidth And step = 1) Or (strX < 0 And step = -1) Then
        step = -step                            '交换移动方向
        Picture2.ForeColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))    '换字体颜色
    End If

    strX = strX + Screen.TwipsPerPixelX * step  '计算新的坐标,TwipsPerPixelX用来适应高分辨率屏
    '把文字显示到缓冲区去
    Picture2.Cls
    Picture2.CurrentX = strX
    Picture2.Print str
   
    '把缓冲区的内容复制到显示区来,以达到不闪烁的目的
    Picture1.PaintPicture Picture2.Image, 0, 0
   
End Sub

Private Sub Form_Load()

    Timer2.Interval = 10                '设置定时器启动

    Picture2.Visible = False            '不显示
    Picture2.BorderStyle = 0            '无边框
    Picture2.Appearance = 0             '无3D
    Picture2.BackColor = &H8000000F     '背景色
    Picture2.Font.Name = "Arial"        '字体
    Picture2.Font.Bold = True           '字体加粗
    Picture2.AutoRedraw = True          '缓冲区设置自动重绘开,以确保能缓冲内容

    Picture1.BorderStyle = 0            '显示区无边框
    Picture1.Appearance = 0             '显示区无3D
    '显示区不需要设置背景,字号什么的

    '首次的颜色
    Picture2.ForeColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))
  
    step = 1            '向右移动

End Sub


[ 本帖最后由 风吹过b 于 2015-6-18 19:38 编辑 ]
1