Я использую 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 и рисую с его помощью. Какие-нибудь другие вещи, которые я должен добавить сюда?