0

WIN32 アプリケーションがあります。そのメイン ウィンドウはhwndMainで、その子ウィンドウの 1 つは ですhwndView。には 1 つのタブ コントロールがありhwndTabますhwndView

サイズを変更するとhwndMain、サイズが変更され、hwndViewサイズも変更されますhwndTab。少しちらつきますが、それほどではありません。

WS_EX_COMPOSITEDスタイル ( forhwndViewまたは)を使用しようとしましhwndTabたが、空白のウィンドウが表示されました。使用WS_EX_TRANSPARENTしてみましたが、ちらつきは解決しましたが、ウィンドウのサイズを大きくすると、子の更新が非常に遅くなります。たとえば、黒い領域が 1 秒間表示された後、領域が更新されます。

スタイルTreeViewを使用して、ちらつきの問題をうまく解決しました。WS_CHIPCHILDREN(以下の注釈を参照)。しかし、WS_CHIPCHILDRENstlye forを使用hwndViewしても、タブ コントロールのちらつきの問題は修正されません。

などにも注目しWM_ERASEBKGNDNot set hbrBackgroundいます。

タブ コントロールにダブル バッファを使用したいのですが、そのためのチュートリアルが見つかりません。私が見つけたすべてのチュートリアルは次のWM_PAINTとおりです。しかし、 for でカスタム描画をしたくありません。タブコントロールにこの仕事を任せたいだけですが、最終結果のみを表示します。CompatibleDCCompatibleBitmapmemdcWM_PAINThwndTab

私はC#、Netなどの知識がないので、誰かが言語でタブコントロールをダブルバッファリングする方法の小さな例を示してもらえますか(これでタブコントロールのちらつきの問題が修正されると思われる場合) cwinapi.


備考: 私の TreeView では、 window の子ですhwndContainer。次のように作成されます。

win->hwndContainer = CreateWindowEx(
    WS_CLIPCHILDREN,
    _T("SUMATRA_PDF_TOCBOX"), NULL,
    WS_CHILD,
    0, 0, gGlobalPrefs.sidebarDx, 0,
    win->hwndPanel, NULL,
    ghinst, NULL);

ダブルバッファを使用WS_CLIPCHILDRENしていなくても、ちらつきを修正します。WS_CLIPCHILDRENしかし、最初のパラメーターの位置に置くのは奇妙 です。WS_CHILD の後に置くと、つまり

win->hwndContainer = CreateWindowEx(
    NULL,
    _T("SUMATRA_PDF_TOCBOX"), NULL,
    WS_CHILD | WS_CLIPCHILDREN,
    0, 0, gGlobalPrefs.sidebarDx, 0,
    win->hwndPanel, NULL,
    ghinst, NULL);

、その後もちらつきが発生します。

そのため、作成時に最初の方法も使用しようとしましたhwndViewが、空白の白いウィンドウが表示されました。私はこれらのものと本当に混乱しています。

を使ったときの空白の窓の写真WS_EX_COMPOSITEDですhwndView。に使用したところ、そのような問題はありませんhwndContainer

hwndViewhwndTab実際には、タブ コントロールと、独自のダブル バッファと描画を持つ子の 2 つの子があります。これが の使用に問題を引き起こすかどうかはわかりませんWS_EX_COMPOSITED

ここに画像の説明を入力

4

1 に答える 1

1

スタイル使用しています。の最初の引数としてWS_EX_COMPOSITEDを渡すと、 の値が拡張ウィンドウ スタイルとして解釈されます。の値はと同じなので、合成ウィンドウが作成されました。WS_CLIPCHIDRENCreateWindowExWS_CLIPCHILDRENWS_CLIPCHILDREN0x02000000LWS_EX_COMPOSITED

また、ドキュメントによると、合成されたウィンドウには、そのすべての子孫が、ダブル バッファリングを使用して下から上への描画順序で描画されます。

あなたが言うとき、あなたが何を意味するのかわかりません:

WS_EX_COMPOSITED スタイル (hwndView または hwndTab 用) を使用しようとしましたが、空白のウィンドウが表示されました。

この問題を再現するコードを投稿する必要があります。しかし、最後から 2 番目のコード スニペット合成ウィンドウを生成しています。

于 2012-08-06T06:39:37.293 に答える