什么Windows消息导致部分区域重绘

时间:2018-10-09 16:35:11

标签: winapi gdi

我有一些旧的VB6代码,它使用Win32api和双缓冲将花键画到一个简单的Windows文本框中,以突出显示错误/拼写错误的单词等。

在这里...

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

EDIT-3现在,我想知道我的问题是否是绘制花体的方式,因为当光标选择文本时,只在该行上去除了花体。我

  1. 将文本框设备上下文的内容拆分为一个memoryDC
  2. 在该memoryDC上用折线绘制花体
  3. 将memoryDC的内容拆分回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之前我需要以某种方式进行合并?还是还有其他事情发生?

再次感谢

0 个答案:

没有答案