Ошибочный рисунок GDI+ в окне проводника Windows

Я использую GDI* plus для пользовательского рисования, но у меня возникает ошибка рисования, когда мое окно рисуется под окном проводника Windows, это выглядит так: введите здесь описание изображения Как вы можете видеть прямо под окном проводника.. цвета странные.. вверху справа кнопки, а чекбокс тоже кнопка.. Вы.. это статический элемент управления.. все они наследуются и реализуются как пользовательские элементы управления.. при получении WM_PAINT. Я также использую буферизованное изображение в WM_PAINT.. в любом случае.. Я не могу это объяснить, есть идеи? Он отлично работает, когда не находится в окне проводника Windows, как вы можете видеть в левой части окна.

Флажок — это кнопка, используйте обработчик MSG_OCM_DRAWITEM(OnPaintImpl), в котором я получаю DC следующим образом:

LRESULT OnPaintImpl(UINT ctrlID, LPDRAWITEMSTRUCT lpDIS)
{
    ATLASSERT(GdiPlus::IsInitialized());

    OnPaintGdiPlus(lpDIS->hDC, lpDIS->rcItem, lpDIS->itemState);
    return S_OK;
}

и в моем OnPaintGdiPlus(HDC hDC, CRect rc, UINT nState) я делаю это:

CMemoryDC dcMem(hDC, rc);
Graphics graphics(dcMem);
Rect rcClient = GdiPlus::GetRect(rc);

Все остальное — это просто вызов основных функций рисования из графики.

В диалоговом окне я получаю WM_PAINT и обрабатываю его здесь:

LRESULT OnPaintImpl(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    PAINTSTRUCT ps;     
    HDC hDC = BeginPaint(&ps);
    
    if (ps.rcPaint.right || ps.rcPaint.bottom)      // draw rect is defined
    {
        if (GdiPlus::IsInitialized())
            OnPaintGdiPlus(hDC, ps, GetClientRect(m_hWnd));
        else
            ::MessageBox(m_hWnd, L"Graphics mode not initialized properly!", L"Graphics", MB_OK | MB_ICONWARNING);
    }

    EndPaint(&ps);
    return S_OK;
}

На основе этого hdc я создаю объект Graphics и рисую с его помощью. Какие-нибудь другие вещи, которые я должен добавить сюда?


person AlexandruC    schedule 14.09.2013    source источник
comment
Отстойно отлаживать код со скриншота. Случайное предположение: вы рисуете в окне рабочего стола, а не в своем собственном окне. GetWindowDC(NULL) делает это.   -  person Hans Passant    schedule 14.09.2013
comment
Я знаю.. Извините, но я не знаю, что это может быть интересно, потому что для этого слишком много кода.. спасибо за ваш вопрос.. Я отредактирую, чтобы включить эту информацию..   -  person AlexandruC    schedule 14.09.2013
comment
Я никогда не использую GetWindowDC(NULL)   -  person AlexandruC    schedule 14.09.2013
comment
@HansPassant, у вас есть идеи по поводу этого stackoverflow .com/questions/18810755/   -  person AlexandruC    schedule 15.09.2013