首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetBkMode(hdc,透明)不工作

SetBkMode(hdc,透明)不工作
EN

Stack Overflow用户
提问于 2012-08-05 15:01:58
回答 2查看 2.2K关注 0票数 1

当我在下面的代码中使用SetBkMode(hdc, TRANSPARENT);时,当我调整主窗口的大小时(因此当子窗口接收到WM_PAINT消息时),我得到了以下效果:

问题是:当我调整主窗口的大小时,"Find:“的旧区域应该会被删除。但它只是停留在那里。

如果我不使用SetBkMode(hdc, TRANSPARENT);,我就不会有这个问题。看起来是这样的:

,即它有白色的背景。此外,如果我使用SetBkMode(hdc, TRANSPARENT);,在我调整主窗口大小之前,它看起来与上面一样。所以我不认为SetBkMode(hdc, TRANSPARENT);在这里工作。

hwnd是一个具有SS_BITMAP样式的静态子对象。

您知道为什么会出现此问题吗?

代码语言:javascript
复制
switch (message) {
    case WM_PAINT:
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        SelectObject(hdc, gDefaultGuiFont);
        SetBkMode(hdc, TRANSPARENT);

        RECT rc;
        GetClientRect(hwnd, &rc);
        DrawText(hdc, _TR("Find:"), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

        EndPaint(hwnd, &ps);

        return 0;

     .............
}
EN

回答 2

Stack Overflow用户

发布于 2012-08-05 17:24:42

试着使用“固定”的矩形。例如

代码语言:javascript
复制
    RECT rc;
    GetClientRect(hwnd, &rc);
    rc.left += ...; rc.top += ...; // shift up-left point
    DrawText(hdc, _TR("Find:"), -1, &rc, DT_SINGLELINE | DT_LEFT | DT_TOP);

这个想法是你在错误的位置(一次)和正确的位置(两次)绘制文本,而背景只更新一次。代码的一部分不能多说。

票数 0
EN

Stack Overflow用户

发布于 2012-08-07 00:29:39

问题是windows没有及时更新静态控件背后的控件,你现在要对它的内容负责。因此,您希望使用父对象提供的背景。那么只需要让家长在子窗口中为您绘制它:

代码语言:javascript
复制
RECT rc;
GetClientRectRelative(m_hWnd, GetParent(m_hWnd), &rc);
SetWindowOrgEx(m_mdc, rc.left, rc.top, NULL);
SendMessage(GetParent(m_hWnd), WM_PAINT, (WPARAM)(HDC)m_mdc);
SetWindowOrgEx(m_mdc, 0, 0, NULL);

其中

代码语言:javascript
复制
bool GetClientRectRelative(HWND hWnd, HWND hWndRelativeTo, RECT *pRect)
{
    RECT rcWnd, rcRelativeTo;
    if (!GetClientRect(hWnd, &rcWnd) ||
            !ClientToScreen(hWnd, (POINT*)&rcWnd) ||
            !ClientToScreen(hWnd, (POINT*)&rcWnd + 1) ||
            !GetClientRect(hWndRelativeTo, &rcRelativeTo) || 
            !ClientToScreen(hWndRelativeTo, (POINT*)&rcRelativeTo) ||
            !ClientToScreen(hWndRelativeTo, (POINT*)&rcRelativeTo + 1))
        return false;

    pRect->top = rcWnd.top - rcRelativeTo.top;
    pRect->left = rcWnd.left - rcRelativeTo.left;
    pRect->right = rcWnd.right - rcRelativeTo.left;
    pRect->bottom = rcWnd.bottom - rcRelativeTo.top;

    return true;
}

现在绘制你喜欢的任何东西,我建议你使用TRANSPARENT背景模式。

请创建具有WS_CLIPCHILDRENWS_CLIPSIBLINGS样式的所有子窗口,然后这些问题将立即变得明显,并避免闪烁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11814563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档