SetBkMode(hdc, TRANSPARENT) не работает

Когда я использую SetBkMode(hdc, TRANSPARENT); в приведенном ниже коде я получил следующий эффект при изменении размера главного окна (и, следовательно, когда ребенок получает сообщение WM_PAINT):

Проблема в том, что: когда я изменяю размер главного окна, старую область "Найти:" я думаю, она стирается. Но это просто остается там.

Если я не использую SetBkMode(hdc, TRANSPARENT);У меня нет этой проблемы. Это выглядит как:

то есть имеет белый фон. Кроме того, если я использую SetBkMode(hdc, TRANSPARENT);Это выглядит так же, как и выше, прежде чем изменить размер главного окна. Так что я не думаю SetBkMode(hdc, TRANSPARENT); работает здесь.

hwnd статичный ребенок со стилем SS_BITMAP,

Знаете ли вы, почему возникает эта проблема?

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;

     .............
}

2 ответа

Попробуйте использовать "фиксированные" прямоугольники. Например

    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);

Идея в том, что вы рисуете текст в неправильной позиции (один раз) и в правильной позиции (дважды), в то время как фон обновляется только один раз. Не могу сказать больше о части кода.

Проблема в том, что Windows не обновляет элемент управления (во времени), который находится за вашим статическим элементом управления, теперь вы отвечаете за его содержимое. Таким образом, вы хотите использовать фон, предоставленный родителем. Ну просто попросите родителя нарисовать это для вас в дочернем окне:

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);

В котором

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_CLIPCHILDREN а также WS_CLIPSIBLINGSТогда эти проблемы станут очевидными сразу, и вы избежите мерцания.

Другие вопросы по тегам