0

カスタム描画を行うために GDI* plus を使用していますが、ウィンドウが Windows エクスプローラー ウィンドウの下に描画されると描画エラーが発生します。次のようになり ここに画像の説明を入力 ます。右上はボタンで、チェックボックスもボタンです..「Are you..」は静的コントロールです..それらはすべて継承され、カスタムコントロールとして実装されます..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 オブジェクトを作成し、それを使用してペイントします。ここに追加する必要がある他のものはありますか?

4

0 に答える 0