お世話になります。
チェックボックス上にスタティックテキストを表示したいのですが、
実行するとチェックボックスの裏に回ってしまい表示されません。
Zオーダーの関係だと言うのまではわかってるのですが、
SetWindowPos()で上下関係って変更出来るのですよね?
どのようにしたら良いのでしょうか?
こんな感じにしたいです。チェックボックスのサイズは
「項目A」「項目B」を全て括ってしまうサイズです。
項目A [___]
□
項目B [___]
this->SetWindowPos(pStaA->wndTop, NULL, NULL, NULL, NULL,
SWP_NOMOVE | SWP_NOSIZE);
この命令で、ダイアログに対して、pStaAをwndTop指定により「トップ」に
もって来るって意味だと解釈しているのですが違いますか?
どなたか教えてください。よろしくお願いします。
環境はVC6+MFC+ダイアログベースです。
半分自己解決しました。
以下の記述で「表示」出来ました。
pChk->SetWindowPos(&pStaA->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
しかし、チェックボックスからフォーカスが外れた瞬間に
また裏に行ってしまいます。これはどうしてなのでしょうか?
すみませんが宜しくお願いします。
スタティックをチェックボックスの上に持っていきたいのであれば、
pChk->SetWindowPos(pStaA, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
または、
pStaA->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
では?
子ウィンドウは、先にあるものから順番に描画されるので、
コントロールが重なっていると、
画面上の見た目は、裏にあるものが手前にあるように見えます。
それを防ぐには、WM_CLIPSIBLINGS スタイルを付けて、
重なったところを上塗りしないようにします。
お返事ありがとうございます。
>REEさん
私の自己解決した記述と動作は変わりませんでした。
私:pChk->SetWindowPos(&pStaA->wndTopMost,(以下略));
REEさん1:pChk->SetWindowPos(pStaA,(以下略));
REEさん2:pStaA->SetWindowPos(&CWnd::wndTopMost, (以下略));
この3つの違いがイマイチ分かりません。
チェックボックスに対するスタティックテキストへの命令か、
ダイアログに対するスタティックテキストへの命令って認識で
いいんでしょうか?
>dairygoodsさん
>それを防ぐには、WM_CLIPSIBLINGS スタイルを付けて、
いわゆる「透過」オプションの事ですよね?
試した気がするのですが・・・。
これは、チェックボックスにだけつければいいんでしょうか?
再度試してみます。
結果はまたご報告致します。
>いわゆる「透過」オプションの事ですよね?
「子ウィンドウをクリップ」ですね。
オプションにはないようなので、自分でリソースファイル
イジって付けてみます。
>「子ウィンドウをクリップ」ですね。
ぅ。これも違いますね。「兄弟ウィンドウをクリップ」ですね。
慌てててすみません。
しかし、ダイアログにこれを設定すると、
ダイアログそのものが表示されなくなりました(^^;
TABコントロールの上に貼りつけてあるのですが、
裏に行ってしまったんでしょうか・・・。
一応出来ました。
OnPaint()で、pChk->SetWindowPos(pStaA,(以下略));
をする事で解決できました。
が、これが「最適」かはわかりません。
dairygoodsさんの方法も知りたいのですが、
何がいけないのでしょうか?
元々のダイアログが重ね合わせになっている事が
原因なのでしょうか?
なんか私の自己レスばかりになってしまいましたが、
一応解決とさせて頂きます。ありがとうございました。
> しかし、ダイアログにこれを設定すると、
> ダイアログそのものが表示されなくなりました(^^;
重ねたいものに付けるので、
スタティックとチェックボックスにつければよいはずです。
またもや勘違いで恥ずかしい限りです。
出来たと思ってましたが出来てませんでした。
上記の通りOnPaint()でSetWindowPos()でやったのですが、
別にフォーカスの移動で再描画がかかるわけではないので
全くの無意味でした。
dairygoodsさんの方法でやってみましたが・・・
undefined keyword or keyname:
WM_CLIPSIBLINGS
と出てしまいます。スタティックテキストでは使えないのか
書き方が悪いのでしょうか?
*.rcの一部抜粋としてこんな感じで定義してます。
LTEXT 項目A,IDC_STATIC_1, 14,7,42,8, WM_CLIPSIBLINGS
LTEXT 項目B,IDC_STATIC_2, 14,27,42,8, WM_CLIPSIBLINGS
CONTROL ,
IDC_CHECK,Button,BS_AUTOCHECKBOX | BS_MULTILINE |
WS_TABSTOP | WM_CLIPSIBLINGS ,4,7,54,28
> dairygoodsさんの方法でやってみましたが・・・
> undefined keyword or keyname:
> WM_CLIPSIBLINGS
誤:WM_CLIPSIBLINGS
正:WS_CLIPSIBLINGS
「WM_」はWindow Message、「WS_」はWindow Styleの略です。
tibさんありがとうございます。
エラーは出なくなりましたが、今度は画面表示した時点で
スタティックテキストが隠れてしまいましたorz。
タブオーダとかって関係しませんよね?
当然の事ながらスタティックテキストにはタブオーダは
設定していないので、チェックボックスとは順番には
なっていないのですが。
きっととっても簡単な事だと思うのですが・・・
皆さんすみません。もう少しお付き合いください。
> タブオーダとかって関係しませんよね?
疑ってるなら試してみたらいかがでしょうか?
少なくとも試してから訊くようにしません?
>少なくとも試してから訊くようにしません?
すみません。一度は色々試してはみたのですが、
解決に至らなかったもので。しかし結局これも原因の1つだったようです。
解決しました。原因は「再描画をしていなかった」事です。
勝手にWindowsがやってくれるもんだと思ってました。
色々やってる最中に画面をズラして戻したらスタティックテキストが表示
されたのでもしやと思い、再描画をした所表示されました。
チェックボックスからフォーカスが外れた場合に消えてしまう原因は不明ですが、
チェックボックスのフォーカスが外れたのをOnCommand()で受けて、
Invalidate()をする様にしたら希望の動作になりました。
またタブオーダですが、質問当初は[1]項目A [2]項目B [3]チェックボックスと
なっていた為、SetWindowPos()で前面に持ってこなくてはなりませんでしたが、
先ほど、[1]チェックボックス [2]項目A [3]項目Bとしたところ、
SetWindowPos()は無くともスタティックテキストが表示されました。
とくに、WS_CLIPSIBLINGSは使用しなくても大丈夫なようでした。
皆さん長々とお付き合い頂いて有難うございました。
またスレが上がりっぱなしで申し訳ありませんでした。m(__)m
> undefined keyword or keyname:
> WM_CLIPSIBLINGS
すみません。私が最初に書いたのが間違っていましたね。