GDI+ erroneous drawing under Windows explorer window

痴心易碎 提交于 2019-12-12 04:06:32

问题


I am using GDI* plus to do custom drawing, but I have a drawing error when my window gets drawn under a windows explorer window, it looks like this:

As u can see just under the explorer window.. the colors are weird.. the top right are buttons and the checkbox is also a button .. "Are you.." is a static control.. they are all inherited and implemented as custom controls.. when receiving WM_PAINT. I also use a buffered image in WM_PAINT.. anyway.. I can't explain this, any ideas? It works fine when not under windows explorer window, as u can see in the left site of the window.

The checkbox is a button control, use a MSG_OCM_DRAWITEM(OnPaintImpl) handler in which I get the DC as so:

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

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

and in my OnPaintGdiPlus(HDC hDC, CRect rc, UINT nState) I do this:

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

Everything else is just calling basic drawing functions from the graphics.

In the dialog I get WM_PAINT and handle it here:

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

Based on this hDC I create a Graphics object and paint using it. Any other stuff I should add here?

来源:https://stackoverflow.com/questions/18803783/gdi-erroneous-drawing-under-windows-explorer-window

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!