У меня есть какой-то старый код VB6, который рисует кривые в простом текстовом поле Windows, используя win32api и двойную буферизацию, чтобы выделить ошибки / неправильно введенные слова и т. Д.
Вот это раньше ...
и если я выберу одну букву, используя мышь вниз, мышь переместится влево, а мышь вверх, то я получу маленькую область, перерисованную - это выглядит примерно как 2 строки.Вот оно после ...
Я изо всех сил пытаюсь выяснить, что вызывает перерисовку и как разбить материал на подклассы, чтобы остановить это -если я действительно даже могу.
Если я посмотрю на 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 были записаны, когда такое поведение происходит.
РЕДАКТИРОВАТЬ-3 Итак, теперь мне интересно, если моя проблема в том, как я рисую зарисовки, потому что, когда курсор выбирает текст, зарисовки удаляются на этой строкетолько.Я
- помещаю содержимое контекста устройства текстового поля в память DC
- рисую волнистую линию с ломаной линией в этой памяти DC
- , чтобы переместить содержимое памяти 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
Впоследствии, когда текст затем выбирается с помощью мыши, он принимает текст в порядке, но загорание исчезает, и это делаетмне интересно, не нарисовал ли я загогулины на той же плоскости (или что-то в этом роде), что и текст.Вот еще пара снимков экрана, чтобы показать это.Я переместил загогулины так, чтобы они проходили через середину текста просто для демонстрации.
После рисования загогулинов
После выделения текста мышью текст остается, но загогулины исчезают, как будто область выделения не поднимает плоскость, на которой загогулины нарисованы в DC - но я предполагаю ??
Так есть ли внутри контекста устройства плоскости, которые мне нужно каким-то образом объединить, прежде чем вернуться к textboxDC?Или что-то еще происходит.
Еще раз спасибо