回 帖 发 新 帖 刷新版面

主题:与bcahzvip兄商榷gif例子

因为我不知道如何在回帖中带附件,所以只好发新贴。
我对你的那个代码进行了一点改动,主要有:
1.将两个类合并成一个
2.可以打开单帧图片了
3.有的图片帧延迟时间为0,原代码不能进行动画,现在可以了
4.原窗体标题栏显示的帧计数不正确,现已改正

附上单帧GIF图片6.gif和帧延迟时间为0的4.gif,供试验。
那个tlb文件我没有放进来。

回复列表 (共7个回复)

沙发

看来主要还是第3个问题呀!~

    dim bDefFramePauseTime as boolean
    ReDim m_nFramePauseTimes(0 To m_nFrameCount - 1)
    For i = 0 To m_nFrameCount - 1
        CopyMemory m_nFramePauseTimes(i), ByVal (m_pPropertyItem(0).ValuePtr + i * 4), 4
        m_nFramePauseTimes(i) = m_nFramePauseTimes(i) * 10
        If 0 = m_nFramePauseTimes(i) Then bDefFramePauseTime = True
        If bDefFramePauseTime Then
            CopyMemory m_nFramePauseTimes(i), ByVal (m_pPropertyItem(0).ValuePtr + (m_nFrameCount - 1) * 4), 4
        End If
    Next
    m_nActiveFramePauseTime = m_nFramePauseTimes(0)

[url=http://bbs.pfan.cn/downfile.asp?fileid=3287]修改了点错误。m(_ _)m[/url]

板凳

嗯,这样一次性解决要比每次都比较一下好,就用你这改正的了。
建议还可以去掉那个布尔变量,改为:
If 0 = m_nFramePauseTimes(i) Then 
   CopyMemory m_nFramePauseTimes(i), ByVal (m_pPropertyItem(0).ValuePtr + (m_nFrameCount - 1) * 4), 4
End If

3 楼

最后一个值将会乘上10.

4 楼

还有一个问题:闪动得厉害,这是CLS语句造成的。我尝试把图像显示在图片框,再用BitBlt函数复制到窗体,这样就不会有闪动,但要这样做的话,图片框就要隐藏,而图片框一隐藏,上面的图像就没有了,复制到窗体就是一片空白。不知bcahzvip兄可有解决办法?

5 楼

恩,是个问题,还很严重,GDI+也不是做动画的料。
我对DC的了解就只有少量的片断。根本就是一知半解。看了资料还是很抽象。 = =;
........................吃饭再来搞。能不能解决都会回来。 m(_ _)m

6 楼

'现在才发现。“最后一个值将会乘上10.”才是正确。 = =;

Public Function DrawFrameGIFEx(ByVal hdc&) As Boolean
    Dim hBitmap As Long
    Dim hdcMemory As Long
    If m_pImage = 0 Then Exit Function
    hdcMemory = CreateCompatibleDC(hdc)
    Select Case GdipCreateHBITMAPFromBitmap(m_pImage, hBitmap, RGB(&HFF, 0, 0)) ' m(_ _)m 不是红色吗?
        Case GpStatus.Ok
            SelectObject hdcMemory, hBitmap
            BitBlt hdc&, m_nx, m_ny, m_nWidth, m_nHeight, hdcMemory, 0, 0, vbSrcCopy
            DeleteObject hBitmap
            DrawFrameGIFEx = True
    End Select
    DeleteDC hdcMemory
End Function

7 楼

好,又进了一步。美中不足的是,背景色不是容器的背景色。

我来回复

您尚未登录,请登录后再回复。点此登录或注册