コントロールの重ね合わせについて – プログラミング – Home

コントロールの重ね合わせについて
 
通知
すべてクリア

[解決済] コントロールの重ね合わせについて

固定ページ 1 / 2

める
 める
(@める)
ゲスト
結合: 22年前
投稿: 62
Topic starter  

お世話になります。
チェックボックス上にスタティックテキストを表示したいのですが、
実行するとチェックボックスの裏に回ってしまい表示されません。
Zオーダーの関係だと言うのまではわかってるのですが、
SetWindowPos()で上下関係って変更出来るのですよね?
どのようにしたら良いのでしょうか?

こんな感じにしたいです。チェックボックスのサイズは
「項目A」「項目B」を全て括ってしまうサイズです。

項目A [___]

項目B [___]

this->SetWindowPos(pStaA->wndTop, NULL, NULL, NULL, NULL,
SWP_NOMOVE | SWP_NOSIZE);

この命令で、ダイアログに対して、pStaAをwndTop指定により「トップ」に
もって来るって意味だと解釈しているのですが違いますか?
どなたか教えてください。よろしくお願いします。
環境はVC6+MFC+ダイアログベースです。


引用未解決
トピックタグ
める
 める
(@める)
ゲスト
結合: 22年前
投稿: 62
Topic starter  

半分自己解決しました。
以下の記述で「表示」出来ました。

pChk->SetWindowPos(&pStaA->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );

しかし、チェックボックスからフォーカスが外れた瞬間に
また裏に行ってしまいます。これはどうしてなのでしょうか?
すみませんが宜しくお願いします。


返信引用
REE
 REE
(@REE)
ゲスト
結合: 24年前
投稿: 240
 

スタティックをチェックボックスの上に持っていきたいのであれば、

pChk->SetWindowPos(pStaA, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
または、
pStaA->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );

では?


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

子ウィンドウは、先にあるものから順番に描画されるので、
コントロールが重なっていると、
画面上の見た目は、裏にあるものが手前にあるように見えます。

それを防ぐには、WM_CLIPSIBLINGS スタイルを付けて、
重なったところを上塗りしないようにします。


返信引用
める
 める
(@める)
ゲスト
結合: 22年前
投稿: 62
Topic starter  

お返事ありがとうございます。

>REEさん
私の自己解決した記述と動作は変わりませんでした。

私:pChk->SetWindowPos(&pStaA->wndTopMost,(以下略));
REEさん1:pChk->SetWindowPos(pStaA,(以下略));
REEさん2:pStaA->SetWindowPos(&CWnd::wndTopMost, (以下略));

この3つの違いがイマイチ分かりません。
チェックボックスに対するスタティックテキストへの命令か、
ダイアログに対するスタティックテキストへの命令って認識で
いいんでしょうか?

>dairygoodsさん
>それを防ぐには、WM_CLIPSIBLINGS スタイルを付けて、
いわゆる「透過」オプションの事ですよね?
試した気がするのですが・・・。
これは、チェックボックスにだけつければいいんでしょうか?
再度試してみます。

結果はまたご報告致します。


返信引用
める
 める
(@める)
ゲスト
結合: 22年前
投稿: 62
Topic starter  

>いわゆる「透過」オプションの事ですよね?
「子ウィンドウをクリップ」ですね。
オプションにはないようなので、自分でリソースファイル
イジって付けてみます。


返信引用
める
 める
(@める)
ゲスト
結合: 22年前
投稿: 62
Topic starter  

>「子ウィンドウをクリップ」ですね。
ぅ。これも違いますね。「兄弟ウィンドウをクリップ」ですね。
慌てててすみません。

しかし、ダイアログにこれを設定すると、
ダイアログそのものが表示されなくなりました(^^;
TABコントロールの上に貼りつけてあるのですが、
裏に行ってしまったんでしょうか・・・。


返信引用
める
 める
(@める)
ゲスト
結合: 22年前
投稿: 62
Topic starter  

一応出来ました。
OnPaint()で、pChk->SetWindowPos(pStaA,(以下略));
をする事で解決できました。
が、これが「最適」かはわかりません。

dairygoodsさんの方法も知りたいのですが、
何がいけないのでしょうか?
元々のダイアログが重ね合わせになっている事が
原因なのでしょうか?

なんか私の自己レスばかりになってしまいましたが、
一応解決とさせて頂きます。ありがとうございました。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> しかし、ダイアログにこれを設定すると、
> ダイアログそのものが表示されなくなりました(^^;

重ねたいものに付けるので、
スタティックとチェックボックスにつければよいはずです。


返信引用
める
 める
(@める)
ゲスト
結合: 22年前
投稿: 62
Topic starter  

またもや勘違いで恥ずかしい限りです。
出来たと思ってましたが出来てませんでした。

上記の通り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


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

> dairygoodsさんの方法でやってみましたが・・・
> undefined keyword or keyname:
> WM_CLIPSIBLINGS

誤:WM_CLIPSIBLINGS
正:WS_CLIPSIBLINGS

「WM_」はWindow Message、「WS_」はWindow Styleの略です。


返信引用
める
 める
(@める)
ゲスト
結合: 22年前
投稿: 62
Topic starter  

tibさんありがとうございます。
エラーは出なくなりましたが、今度は画面表示した時点で
スタティックテキストが隠れてしまいましたorz。

タブオーダとかって関係しませんよね?
当然の事ながらスタティックテキストにはタブオーダは
設定していないので、チェックボックスとは順番には
なっていないのですが。

きっととっても簡単な事だと思うのですが・・・
皆さんすみません。もう少しお付き合いください。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

> タブオーダとかって関係しませんよね?
疑ってるなら試してみたらいかがでしょうか?
少なくとも試してから訊くようにしません?


返信引用
める
 める
(@める)
ゲスト
結合: 22年前
投稿: 62
Topic starter  

>少なくとも試してから訊くようにしません?
すみません。一度は色々試してはみたのですが、
解決に至らなかったもので。しかし結局これも原因の1つだったようです。

解決しました。原因は「再描画をしていなかった」事です。
勝手にWindowsがやってくれるもんだと思ってました。

色々やってる最中に画面をズラして戻したらスタティックテキストが表示
されたのでもしやと思い、再描画をした所表示されました。

チェックボックスからフォーカスが外れた場合に消えてしまう原因は不明ですが、
チェックボックスのフォーカスが外れたのをOnCommand()で受けて、
Invalidate()をする様にしたら希望の動作になりました。

またタブオーダですが、質問当初は[1]項目A [2]項目B [3]チェックボックスと
なっていた為、SetWindowPos()で前面に持ってこなくてはなりませんでしたが、
先ほど、[1]チェックボックス [2]項目A [3]項目Bとしたところ、
SetWindowPos()は無くともスタティックテキストが表示されました。

とくに、WS_CLIPSIBLINGSは使用しなくても大丈夫なようでした。

皆さん長々とお付き合い頂いて有難うございました。
またスレが上がりっぱなしで申し訳ありませんでした。m(__)m


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> undefined keyword or keyname:
> WM_CLIPSIBLINGS

すみません。私が最初に書いたのが間違っていましたね。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました