【问题标题】:Making The Edit Control Transparent WinAPI (win32)使编辑控件透明 WinAPI (win32)
【发布时间】:2020-12-14 15:36:13
【问题描述】:

这是我的代码的相关部分:

case WM_CTLCOLORBTN:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORSTATIC:
    SetBkMode(HDC(wParam),TRANSPARENT);
    return LRESULT(HBRUSH(GetStockObject(NULL_BRUSH)));

它使所有控件的背景透明,包括编辑控件。但是当输入一些文本时,它会覆盖自身并且看起来很乱。我应该如何重置可见区域并根据当前情况重绘?我应该在WM_COMMANDs EN_CHANGEWM_PAINT 或其他东西中处理一些东西吗?

这是它目前的样子:

【问题讨论】:

  • 它完全按照您的要求进行 - 背景是透明的,因此当您输入新内容时,之前编写的任何内容都不会被删除。
  • @MarkRansom 是的,但是以前写的文字怎么能被抹掉呢?
  • 这通常是自动发生的,使用您选择的画笔调用 WM_ERASE,然后使用与背景相同的画笔写入文本。你已经明确地绕过了所有这些。
  • @MarkRansom 我已经声明了一个变量bool changing;,它在EN_CHANGE 上变为true,然后WM_CTLCOLOR... 消息在这种情况下返回NULL_BRUSH 以外的其他内容。所以它像往常一样擦除背景。但它不再透明,我将编辑问题以提供最小的可重复示例
  • @RemyLebeau 是的,当然我的意思是WM_ERASEBKGND - 这不是我每天都在使用的东西,所以我知道我有可能弄错了。感谢您的指正。附:在WM_PAINT 中手动绘制文本不会修复它,您仍然需要以某种方式擦除旧文本。最好的方法是告诉底层窗口先重新绘制自己,但这会变得很复杂。

标签: c++ c winapi controls transparent


【解决方案1】:

我意识到,一旦控件被隐藏并再次显示,它就会按预期修复可见性。

case WM_COMMAND:
    if(HIWORD(wParam)==EN_CHANGE)
    {
        ShowWindow(HWND(lParam),SW_HIDE);
        ShowWindow(HWND(lParam),SW_SHOW);
        SetFocus(HWND(lParam));
    }
    break;
case WM_CTLCOLORBTN:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORSTATIC:
    SetBkMode(HDC(wParam),TRANSPARENT);
    return LRESULT(HBRUSH(GetStockObject(NULL_BRUSH)));

结果:

【讨论】:

  • 为什么使用GetFocus()?你知道你的编辑控件有焦点,EN_CHANGEEN_UPDATE 都在他们的lParam 中给你编辑控件的HWND
  • 真的有必要拥有if(changing)吗?如果下面的控件已经擦除了背景,似乎没有必要擦除它。
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2012-03-27
  • 2011-06-15
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多