我有一些旧的VB6代码,它使用Win32api和双缓冲将花键画到一个简单的Windows文本框中,以突出显示错误/拼写错误的单词等。
在这里...
,如果我使用鼠标向下选择一个字母,鼠标向左移动并向上移动,则会得到一个小区域的重绘-看起来大约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。
EDIT-3现在,我想知道我的问题是否是绘制花体的方式,因为当光标选择文本时,只在该行上去除了花体。我
这是完全公开的代码
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之前我需要以某种方式进行合并?还是还有其他事情发生?
再次感谢