0

我有一个非只读的编辑控件,我需要更改它的颜色,所以我处理 WM_CTLCOLOREDIT。当我连续输入时效果很好,但问题是当我按退格键或删除甚至从现有文本的中间开始输入时,显示全部被破坏。这一直存在,直到我通过调整父级等来重新绘制。如何解决这个问题?

编辑:一些细节。只有在设置了背景颜色而不是仅设置了文本颜色时,才会出现问题。代码看起来像这样

ON_MESSAGE(WM_CTLCOLOREDIT, OnEditColor)

LRESULT CMyWindow::OnEditColor(WPARAM wp, LPARAM lp)
{
    HDC hdc = (HDC)wp;
    HWND hwnd = (HWND)lp;
    if(hwnd == m_edit.GetSafeHwnd())
    {
    //  SetBkMode(hdc, TRANSPARENT);
        MyControlInfo*pcti;// accessed from somewhere
        SetTextColor(hdc, pcti->theme.clrText);
    //  return (LRESULT)pcti->brush.GetSafeHandle();
    }
    return 0;
}

谢谢

4

3 回答 3

1

我相当怀疑这是由这段代码引起的。当您尝试对编辑控件进行子类化并覆盖绘画时,就会遇到这种问题。Windows 版本 2 必须在 386SUX 和 20 年的 appcompat 上运行,这使 Microsoft 无法修复此控件,因此它仅在 WM_PAINT 消息处理程序中绘制自己。当您退格时,它确实直接绘制到屏幕上。没有解决方法。

与您之前的问题相同的评论适用,使用真正的编辑控件。

于 2011-03-31T15:45:58.197 回答
1

您应该使用 SetBkColor 设置背景颜色(并且不要使用 SetBkMode)返回有效的画笔。(您不知道控件是如何绘制的,可以免费使用 ExtTextOut 和 ETO_OPAQUE 等)

于 2011-03-31T15:46:42.223 回答
0

http://msdn.microsoft.com/en-us/library/bb761691(v=vs.85).aspx

返回值

如果应用程序处理此消息,它必须返回画笔句柄。系统使用画笔绘制编辑控件的背景。

所以尝试类似:

return static_cast<LRESULT>(::GetSysColorBrush(COLOR_WINDOW));
于 2011-03-31T16:30:15.200 回答