3

タブ コントロールを使用してダイアログを作成しています。各タブには異なるコントロール セットが表示されるはずなので、ページのように動作するようにリソース エディターで子ダイアログ ボックスを作成しました。

これを行うには、この投稿の手順を使用しました。

リソース エディターで、境界線のないダイアログ ボックスを作成し、スタイルを に設定しChild、システム メニューを削除し、フラグControlControl Parentを に設定しましたtrue

私の子ダイアログボックスの手順ではWM_INITDIALOG、追加EnableThemeDialgTexture(handleOfmyDialog, ETDT_ENABLETAB);して返すことで処理しましたTRUE。いいえWM_ERASEBKGNDWM_PAINTまたはWM_CTLCOLORDLGオーバーライドされています。

CreateDialogタブコントロールを含むメインダイアログボックスで、関数を使用して「子ダイアログ」を作成し、MoveWindowそれらを適切に配置するために使用しました。

またはのEndDialog「子ダイアログ」を破棄するために使用しませんでしたが、自動的に破棄されると思います。IDCANCELWM_CLOSE

これをすべて行うために、Windows 8.1 で Visual Studio 2013 を使用しました。

Windows 7 と Windows 8.1 では問題ないように見えますが、タブ コントロールの背景色がダイアログ ボックスのデフォルトの背景色と似ているため、私の目がいたずらをしているのかもしれません。この問題は、次の図に示すように、Windows XP で最もよく見られます。

ここに画像の説明を入力

「子ダイアログ」(およびチェックボックス/トラックバー/ラジオボタン/静的コントロールなどの子コントロール)の背景色を透明にする(タブコントロールの背景色と一致させるにはどうすればよいですか?)

ありがとうございました。

4

2 に答える 2

2

これはかなり単純な問題です。「テクスチャ」にグラデーションを使用しなくなったため、後の Windows バージョンでは間違いを確認できません。EnableThemeDialogTexture() は問題なく機能し、ダイアログは確かにタブコントロールと同じテクスチャを持っています。ブラシの原点は、ダイアログの左上隅から始まります。タブコントロールの場合と同様です。しかし、ダイアログが正しく配置されていないため、グラデーションが正しく配置されず、ダイアログがブレンドされなくなりました。

ダイアログがタブ ページ領域内に正しく配置されるように、ダイアログを移動する必要があります。MSDN 記事の関連するコード行:

// Size the dialog box. 
SetWindowPos(hwndDlg, NULL, 
    0, 0,                                                           // <=== here!
    rcTab.right + cyMargin + (2 * GetSystemMetrics(SM_CXDLGFRAME)), 
    rcTab.bottom + rcButton.bottom + (2 * cyMargin)
    + (2 * GetSystemMetrics(SM_CYDLGFRAME)) 
    + GetSystemMetrics(SM_CYCAPTION), 
    SWP_NOMOVE | SWP_NOZORDER); 

タブ コントロールのクライアント領域の (0, 0) に配置され、グラデーションが整列します。

于 2014-11-08T22:36:13.890 に答える