1

オーナー描画コントロールでこの問題を解決できないようです。ステータスコントロールをスーパークラス化しました。カスタマイズしようとしていますが、同じ機能を保持しています。基本的に、背景とテキストを変更したいです。描画には Direct2d (または ID2D1DCRenderTarget インターフェイス) を使用しています。WM_NCPAINT を使用して背景を変更することに成功しました。ただし、必要に応じて WM_ERASEBKGRND を使用できます。ただし、どちらの方法も私の実験では対照として機能し、ちらつきは依然として発生しました。また、SB_SETTEXT の WPARAM が SBT_OWNERDRAW に設定されていない場合、ちらつきは発生しませ。したがって、WM_DRAWITEM が原因であるという結論に達しました。とにかく、所有者描画ステータスバーでこのちらつきの問題を修正できますか?

4

2 に答える 2

2

コントロールのダブルバッファリングをオンにすると、ちらつきを避けることができます。

WS_EX_COMPOSITED 拡張スタイルを設定します: http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v=vs.85).aspx

たとえば、WM_CREATE を処理する場合は、(WTL または MFC) を呼び出します。

ModifyStyleEx(0, WS_EX_COMPOSITED);
于 2013-01-28T20:53:10.817 に答える
1

なるほど、わかったような気がします。ステータスバーをスーパークラス化するときは、ちらつきを避けるためにこれらのセットに従ってください。

**注: これは、ビジュアル スタイルをオフにしてのみテストされています。SetWindowTheme(hWndStatus, L"", L""); また、ウィンドウの作成時に、親ウィンドウの style パラメータに WS_CLIPCHILDREN を設定する必要があります。

1: WM_SIZE をオーバーライドします。InvalidateRect(m_hWnd, NULL, TRUE) を呼び出し、デフォルトのサイズが必要でない限り 0 を返します。この場合、CallWindowProc を呼び出します。

2: WM_ERASEBKGND をオーバーライドして -1 を返します。

3: WM_NCPAINT をオーバーライドし、描画コードをここに配置します。

WM_NCPAINT の処理。WM_NCPAINT の処理方法を理解するのに苦労しているようです。これが私のやり方です。

if (wParam == 1) {
    hdc = GetWindowDC(m_hWnd);
} else {
    hdc = GetDCEx(m_hWnd, (HRGN) wParam, DCX_WINDOW | DCX_INTERSECTRGN | DCX_CACHE);
}

次に、DC で描画します。

4: 親プロシージャ (WndProc など) で、ステータスバーへのハンドルを使用して SetWindowPos(..., SWP_DRAWFRAME) を呼び出します。これにより、ステータスバーのサイズが変更されます。

5: SendMessage(hWndStatusbar, SB_SETPARTS, 1, (LPARAM) &parts); を介してメッセージを送信します。

6: SendMessage(hWndStatusbar, SB_SETTEXT, LOBYTE(0) | SBT_OWNERDRAW, L"Ready") 経由でメッセージを送信します。WM_DRAWITEM のサンプル コード:

...
WM_DRAWITEM:
LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) lParam;

m_pFramework->m_pD2D1RenderTarget->BindDC(lpDIS->hDC, &lpDIS->rcItem);

m_pFramework->m_pD2D1RenderTarget->BeginDraw();

m_pFramework->m_pD2D1RenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::CadetBlue));

D2D1_RECT_F rf = D2D1::RectF(
    PixeltoDipX(lpDIS->rcItem.left),
    PixeltoDipY(lpDIS->rcItem.top),
    PixeltoDipX(lpDIS->rcItem.right),
    PixeltoDipY(lpDIS->rcItem.bottom)
    );

m_pFramework->m_pD2D1RenderTarget->DrawText(
    (LPCWSTR) lpDIS->itemData,
    wcslen((WCHAR*) lpDIS->itemData) + 1,
    m_pFramework->m_pTextFormat,
    rf,
    m_d2dCaptionTextColor
    );

m_pFramework->m_pD2D1RenderTarget->EndDraw();
break;
....

これでちらつきが止まるはずです。また、親の WM_SIZE で InvalidateRect(hWndStatus, NULL, TRUE) を呼び出さないでください。これが、ちらつきの主な理由でした。

于 2013-01-28T21:05:30.450 に答える