タブコントロールを最善面にするには


さくらい  2012-08-18 15:35:48  No: 73516  IP: [192.*.*.*]

グループボックスで枠線を作り、
その線の上にタブコントロール(スタイルをボタンにした)を表示したいのですが
線の下にタブコントロールが表示されてしまいます。

こんな感じで表示したい(□がタブ)

┌Test─□□□□─┐
│                │
└────────┘

タブオーダを変更したり、
SetWindowPosで指定しましたが、変わりませんでした。


VC++6 MFC
Windows XP以降

編集 削除
さくらい  2012-08-18 15:37:59  No: 73517  IP: [192.*.*.*]

中途半端に書いて登録しちゃいました。


タブコントロールを最全面にする方法がありましたら教えて下さい。

以上

よろしくお願いします。

編集 削除
さくらい  2012-08-18 15:49:22  No: 73518  IP: [192.*.*.*]

ちなみに、プログラムはこんな感じです。

  CStatic  *tab;
  CStatic  *grp;

  grp  = (CStatic *)GetDlgItem(IDC_グループコントロールID);
  tab  = (CStatic *)GetDlgItem(IDC_タブロールID);

  UINT uflags  = SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE;

  tab->SetWindowPos(&wndTopMost,    0, 0, 0, 0,  uflags);
  grp->SetWindowPos(&wndNoTopMost,  0, 0, 0, 0, uflags);

編集 削除
forty-five  2012-08-19 19:07:51  No: 73519  IP: [192.*.*.*]

wndTopMost や wndNoTopMost は子ウィンドウには効果がありません。

grp->SetWindowPos(tab, 0, 0, 0, 0, uflags);

でよくないですか?

編集 削除
ロマ  2012-08-20 00:35:01  No: 73520  IP: [192.*.*.*]

Z-Orderをいじってもうまくいきませんです。
"Child Window Update Region"の最後の方の段落を見てください。
(http://msdn.microsoft.com/en-us/library/windows/desktop/dd183426(v=vs.85).aspx)

リソーススクリプトでタブコントロールをグループボックスより上に書くと
タブコントロールのZ-ORDERは手前に配置されます。

そして、OnInitDialogでタブコントロールにWS_CLIPSIBLINGSを追加すると
うまくいくと思います。

編集 削除
さくらい  2012-08-20 09:29:43  No: 73521  IP: [192.*.*.*]

おはようございます。


forty-five さん、ロマ さん
回答ありがとうございます。



forty-five さん
grp->SetWindowPos(tab, 0, 0, 0, 0, uflags);
を指定してみましたが、結果は変わりませんでした。



ロマ さん
WS_CLIPSIBLINGS
を指定してみましたが、結果は変わりませんでした。

確かに、"Child Window Update Region" には、それっぽい事が書いてありますが
なぜか変わりませんでした。

※ グループコントロールに指定すると、タブコントロールが全面に表示されました。
    (え?って感じです。)( grp->ModifyStyle(0, WS_CLIPSIBLINGS); )


ただ、WS_CLIPSIBLINGS をキーワードに調べてみると
http://social.msdn.microsoft.com/Forums/ja/vcgeneralja/thread/d916655a-c90e-4ecb-bbc5-20d1144f02be
の質問が引っかかり見てみると。。。

WS_EX_TRANSPARENT
タブコントロールの "透過" 設定をチェックすると、全面に表示されました。

ヘルプには

> 透過
> このスタイルを使用するウィンドウは、透明に表示されます。
> 下にあるウィンドウは、このウィンドウによって隠されません。
> このスタイルのウィンドウは、下に位置するウィンドウがすべて更新された後にのみ、
> WM_PAINT メッセージを受け取ります。タイプはブール、デフォルトの設定は False です。

と書いてありますが

> 下にあるウィンドウは、このウィンドウによって隠されません。



> このスタイルのウィンドウは、下に位置するウィンドウがすべて更新された後にのみ、
> WM_PAINT メッセージを受け取ります。タイプはブール、デフォルトの設定は False です。

下にあるウィンドウは隠されません?
下のコントロール更新したら、WM_PAINT 受け取って再描画?全面に表示される?



透過なのか表示するのか?
どっちだ!?
って感じです。。。

編集 削除
さくらい  2012-08-20 09:31:12  No: 73522  IP: [192.*.*.*]

WS_EX_TRANSPARENT
タブコントロールの "透過" 設定をチェックすると、全面に表示されました。

の全面 は 前面 です。

編集 削除
ロマ  2012-08-20 13:27:40  No: 73523  IP: [192.*.*.*]

> そして、OnInitDialogでタブコントロールにWS_CLIPSIBLINGSを追加すると
> うまくいくと思います。

すみません、まちがいです。
GroupBoxにWS_CLIPSIBLINGSを付けてください。

TabControlは手前にあるのですべて描かれ、
GroupBoxはWS_CLIPSIBINGSがあると、TabControlと重ならない部分のみ
描画されるようになります。

編集 削除