オーナー描画コントロールでこの問題を解決できないようです。ステータスコントロールをスーパークラス化しました。カスタマイズしようとしていますが、同じ機能を保持しています。基本的に、背景とテキストを変更したいです。描画には Direct2d (または ID2D1DCRenderTarget インターフェイス) を使用しています。WM_NCPAINT を使用して背景を変更することに成功しました。ただし、必要に応じて WM_ERASEBKGRND を使用できます。ただし、どちらの方法も私の実験では対照として機能し、ちらつきは依然として発生しました。また、SB_SETTEXT の WPARAM が SBT_OWNERDRAW に設定されていない場合、ちらつきは発生しません。したがって、WM_DRAWITEM が原因であるという結論に達しました。とにかく、所有者描画ステータスバーでこのちらつきの問題を修正できますか?
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);
なるほど、わかったような気がします。ステータスバーをスーパークラス化するときは、ちらつきを避けるためにこれらのセットに従ってください。
**注: これは、ビジュアル スタイルをオフにしてのみテストされています。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) を呼び出さないでください。これが、ちらつきの主な理由でした。