【问题标题】:How to "Clear" a WinAPI Transparent Window如何“清除” WinAPI 透明窗口
【发布时间】:2012-07-12 21:21:55
【问题描述】:

我在 Win32 C++ 中创建了一个透明复选框。我做到了,因为据我所知,您不能在本机 win32 中使用透明复选框,我需要在 NSIS 安装程序中使用此复选框。

我的问题:重绘时,我不知道如何擦除透明背景,以便在“透明画布”上绘图。当用户更改复选框内的文本并且我需要重新绘制它时,这一点很重要。我想我遇到了每个人都必须使用透明窗口的问题。

我可以清除透明窗口的方式是什么,注意我熟悉 WinAPI,您无法真正清除窗口 AFAIK,因为您只是在窗口上重新绘制。所以我正在寻找关于我可以使用哪些技术来重绘窗口的建议,例如:

  • 向父窗口发送重绘消息,希望重绘父窗口(位于复选框下方),而不向其子窗口(即复选框)发送消息。我试过这个,它使复选框有很多闪烁。
  • 也许有一个我不知道的透明画笔/绘画功能可以用来在整个复选框窗口上绘画,这基本上会清除窗口?我已经尝试过了,它会因为某种原因使复选框窗口变黑?

我的代码:

case WM_SET_TEXT:
{
        // set checkbox text
        // Technique 1: update parent window to clear this window
        RECT thisRect = {thisX, thisY, thisW, thisH};
        InvalidateRect(parentHwnd, &thisRect, TRUE);
}
break;
case WM_PAINT:
{
     PAINTSTRUCT ps;
     HDC hdc = BeginPaint(hwnd, &ps);
     // Technique 2:
     SetBkMode(hdc, TRANSPARENT);
     Rectangle(hdc, thisX, thisY, thisW, thisH); // doesn't work just makes the window a big black rectangle?
     EndPaint(hwnd, &ps);
}
break;  

【问题讨论】:

  • 一般来说,你永远不想向另一个窗口发送绘制消息,如果你想重新绘制它,就让它的矩形无效。
  • 你在 WM_ERASEBKGND 消息处理程序中做了什么?
  • @LarryOsterman 嗯,以前从未处理过该消息?所以现在什么都没有,我该怎么办?
  • 您可能想要添加一个什么都不做的处理程序。这将阻止系统使用背景颜色绘制窗口背景。也可以试试 clipsiblings 的建议,这也可能有帮助。

标签: c++ winapi gdi


【解决方案1】:

您需要处理WM_ERASEBBKGND 消息。像下面这样的东西应该可以工作!

case WM_ERASEBKGND:
{
    RECT rcWin;
    RECT rcWnd;
    HWND parWnd = GetParent( hwnd ); // Get the parent window.
    HDC parDc = GetDC( parWnd ); // Get its DC.

    GetWindowRect( hwnd, &rcWnd );
    ScreenToClient( parWnd, &rcWnd ); // Convert to the parent's co-ordinates

    GetClipBox(hdc, &rcWin );
    // Copy from parent DC.
    BitBlt( hdc, rcWin.left, rcWin.top, rcWin.right - rcWin.left,
        rcWin.bottom - rcWin.top, parDC, rcWnd.left, rcWnd.top, SRC_COPY );

    ReleaseDC( parWnd, parDC );
}
break;

【讨论】:

  • 这会画出透明的“颜色”还是标准的按钮灰色?请记住,复选框具有透明背景,其父 hwnd 可能没有标准的灰色背景,它可能是图像等。
  • @JakeM 查看更新后的答案。我假设您正在处理复选框的绘图部分。
【解决方案2】:

尝试删除窗口样式 WS_CLIPCHILDREN

【讨论】:

  • 您的意思是从复选框或复选框父级中删除样式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2013-02-21
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多