Что сообщение Windows вызывает частичную перерисовку региона - PullRequest
0 голосов
/ 09 октября 2018

У меня есть какой-то старый код VB6, который рисует кривые в простом текстовом поле Windows, используя win32api и двойную буферизацию, чтобы выделить ошибки / неправильно введенные слова и т. Д.

Вот это раньше ...

enter image description here

и если я выберу одну букву, используя мышь вниз, мышь переместится влево, а мышь вверх, то я получу маленькую область, перерисованную - это выглядит примерно как 2 строки.Вот оно после ...

enter image description here

Я изо всех сил пытаюсь выяснить, что вызывает перерисовку и как разбить материал на подклассы, чтобы остановить это -если я действительно даже могу.

Если я посмотрю на spy ++, похоже, что это может быть связано с IME, но я не достаточно хорошо разбираюсь, чтобы знать наверняка.Я попытался остановить отображение окна редактора по умолчанию, следуя моему ограниченному пониманию того, что MS Docs предлагал.

Private Function ProcessBeforeMsg(ByVal p_nMsg As Long, wp As Long, lp As Long, Result As Long) As Boolean
...
    Case WM_IME_SETCONTEXT
        lp = lp And Not ISC_SHOWUICOMPOSITIONWINDOW
...

безрезультатно.

Так что я быбудьте благодарны, если кто-нибудь может указать мне правильное направление.

EDIT-1 - я, вероятно, должен добавить, что я не вижу WM_ERASEBKGND в этом сценарии

EDIT-2 - вот след spy ++за сообщения, которые я считал актуальными.Сообщения 14-19 были записаны, когда такое поведение происходит.enter image description here

РЕДАКТИРОВАТЬ-3 Итак, теперь мне интересно, если моя проблема в том, как я рисую зарисовки, потому что, когда курсор выбирает текст, зарисовки удаляются на этой строкетолько.Я

  1. помещаю содержимое контекста устройства текстового поля в память DC
  2. рисую волнистую линию с ломаной линией в этой памяти DC
  3. , чтобы переместить содержимое памяти DC обратно вtextboxDC

Вот код для полного раскрытия

Private Sub PaintSquiggles(ByVal p_cMistakes As CMistakes)

    Dim l_tRect         As RECT
    Dim l_hFont         As Long
    Dim l_hFontOld      As Long
    Dim l_nWidth        As Long
    Dim l_nHeight       As Long
    Dim l_hVisibleDC    As Long
    Dim l_hHiddenDC     As Long
    Dim l_hHiddenBMP    As Long

    SendMessage m_hWnd, EM_GETRECT, ByVal CLng(0), l_tRect

    l_nWidth = l_tRect.Right - l_tRect.left
    l_nHeight = l_tRect.Bottom - l_tRect.top + 2

    l_hVisibleDC = GetDC(m_hWnd) '
    l_hHiddenDC = CreateCompatibleDC(l_hVisibleDC)
    l_hHiddenBMP = CreateCompatibleBitmap(l_hHiddenDC, l_nWidth, l_nHeight)
    SelectObject l_hHiddenDC, l_hHiddenBMP

    BitBlt l_hHiddenDC, 0, 0, l_nWidth, l_nHeight, l_hVisibleDC, 0, 0, vbSrcCopy

    l_hFont = SendMessage(m_hWnd, WM_GETFONT, 0, ByVal 0&)
    l_hFontOld = SelectObject(l_hHiddenDC, l_hFont)

    m_nLineOffset = CalculateWordExtents(m_hWnd, l_hHiddenDC, p_cMistakes, l_tRect)
    DrawSquiggles l_hHiddenDC, p_cMistakes, m_nInverseBackColour

    BitBlt l_hVisibleDC, 0, 0, l_nWidth, l_nHeight, l_hHiddenDC, 0, 0, vbSrcCopy

    SelectObject l_hHiddenDC, l_hFontOld
    DeleteObject l_hHiddenBMP

    ReleaseDC m_hWnd, l_hHiddenDC
    DeleteObject l_hHiddenDC

    ReleaseDC m_hWnd, l_hVisibleDC
    DeleteObject l_hVisibleDC

End Sub

Впоследствии, когда текст затем выбирается с помощью мыши, он принимает текст в порядке, но загорание исчезает, и это делаетмне интересно, не нарисовал ли я загогулины на той же плоскости (или что-то в этом роде), что и текст.Вот еще пара снимков экрана, чтобы показать это.Я переместил загогулины так, чтобы они проходили через середину текста просто для демонстрации.

После рисования загогулинов

enter image description here

После выделения текста мышью текст остается, но загогулины исчезают, как будто область выделения не поднимает плоскость, на которой загогулины нарисованы в DC - но я предполагаю ??

enter image description here

Так есть ли внутри контекста устройства плоскости, которые мне нужно каким-то образом объединить, прежде чем вернуться к textboxDC?Или что-то еще происходит.

Еще раз спасибо

...