双缓冲VB6与BitBlt帮助

时间:2009-01-29 21:25:42

标签: graphics vb6 gdi

编辑:我更新了版本2.现在它是单色的。我试图通过确保用窗口的DC而不是memdc(如所写的)调用CreateCOmpatibleBitmap来修复它,但它仍然是错误的:(

以下是我编写的3种不同简化版本的函数。版本1工作得很好(但显然有闪烁),版本2什么都不做,版本3用黑色填充整个表单。版本2出了什么问题? Scalemode设置为vbPixels。

版本1:

Private Sub Form_Paint()
    Me.Cls
    DrawStuff Me.hDc
End Sub

第2版(新):

Private Sub Form_Paint()
    Me.Cls
    If m_HDCmem = 0 then
        m_HDC = GetDC(hwnd)
        m_HDCmem = CreateCompatibleDC(m_HDC)
        m_HBitmap = CreateCompatibleBitmap(m_HDC, Me.ScaleWidth, Me.ScaleHeight)
        ReleaseDC Null, m_HDC
        SelectObject m_HDCmem, m_HBitmap
    End If
    DrawStuff m_HDCmem
    Debug.Print BitBlt(Me.hDc, 0, 0, Me.ScaleWidth, Me.ScaleHeight, m_HDCmem, 0, 0, SRCCOPY) 'During testing, this printed "1"
    Me.Refresh
End Sub

第3版:

Private Sub Form_Paint()
    Me.Cls
    If m_HDC = 0 Then m_HDC = CreateCompatibleDC(Me.hDc)
    DrawStuff m_HDC
    BitBlt(Me.hDc, 0, 0, Me.ScaleWidth, Me.ScaleHeight, m_HDC, 0, 0, BLACKNESS) 'During testing, this printed "1"
    Me.Refresh
End Sub

注意:我在调用paint之前立即将代码粘贴到调整大小函数中。它没有帮助,但我很确定我应该把它留在那里:

If m_HDC <> 0 Then DeleteDC m_HDC
m_HDC = 0

1 个答案:

答案 0 :(得分:1)

版本2&amp; 3对CreateCompatibleDC()的调用会构建一个1像素乘1像素的单色绘图表面。你需要在那里的某个地方调用CreateCompatibleBitmap()。

请参阅here