Двойная буферизация VB6 с помощью BitBlt - PullRequest
1 голос
/ 30 января 2009

Редактировать: я обновил версию 2. Теперь он монохромный. Я попытался исправить это, убедившись, что вызывал CreateCOmpatibleBitmap с DC окна, а не с memdc (как написано), но это все равно неправильно: (

Ниже приведены 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

Примечание: я вставил приведенный ниже код в функцию изменения размера непосредственно перед вызовом рисования. Это не помогло, но я уверен, что должен оставить это там:

If m_HDC <> 0 Then DeleteDC m_HDC
m_HDC = 0

1 Ответ

1 голос
/ 30 января 2009

в версиях 2 и 3 ваш вызов CreateCompatibleDC () создает монохромную поверхность рисования размером 1 на 1 пиксель. Вам нужно вызвать CreateCompatibleBitmap () где-то там.

см. здесь

...