メインウィンドウの領域に子ウィンドウを配置する際に発生する問題

解決


ごま  2004-03-31 10:17:33  No: 53412

毎度毎度超初心者の質問で本当に申し訳ないです
具体的に問題を自分がつかめているかどうかさえも
はっきりしないので  タイトルがはっきりしなかったのも申し訳ないです

左端にプッシュボタンを二つEDITコントロールを一つ
右にプッシュボタンを一つもつメインウィンドウに
自分でWNDCLASS構造体を登録し
垂直スクロールバーを配置した子ウィンドウをメインウィンドウの
左側に配置したところ子ウィンドウの領域部分には
子ウィンドウの領域によって隠されたはずの
メインウィンドウのプッシュボタンとEDITコントロールが
そのまま表示されていました
そこでつまりメインウィンドウが
アクティブな状態であるという事なんだろうと
初心者なりの解釈をしていたんですが
そのプッシュボタンを押すこともEDITに入力することもできませんでした
これはつまりどういうことなんでしょうか
作りたかったのは
「お気に入り」ウィンドウを開いた状態である
ウィンドウエクスプローラーのようなカタチなんですが
(メインウィンドウのボタンを配置してある箇所に
子ウィンドウを配置してみたのは問題が一応わかりやすくなるかと
思いまして・・)

そして逆にそのメインウィンドウの上に配置してある子ウィンドウを
親ウィンドウとしてプッシュボタンを作成しても
子ウィンドウの領域には何も現れないのです

ただひたすらややこしい話ですみません
説明不足(または下手)だとしたら
考えて付け足したりするので  よろしくおねがいします


ごま  2004-04-01 02:29:36  No: 53413

SetWindowPos()関数を知ったので
HWND_TOPMOSTを指定して
子ウィンドウを常に最前面にもってくるよう指定しましたが
それでも結果は変わりませんでした
これはアクティブどうこうの問題ではないのでしょうか・・


YuO  2004-04-01 03:16:00  No: 53414

WS_CLIPSIBLINGSを設定してみてはどうでしょう。
http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowStyles.asp


ごま  2004-04-04 06:24:56  No: 53415

すいません  調べてみましたがわかりませんでしたTT
多分Win32API(?)の基本を(プログラミングの基本かな)
理解できていないんだろうなぁ

WS_CLIPSIBLINGS

「互いに関連する子ウィンドウをクリップします。つまり、ある子ウィンドウが、WM_PAINTメッセージを受け取ると、オーバーラップしているほかのすべての子ウィンドウはその子ウィンドウの領域からクリップされ、子ウィンドウは更新されます。
WS_CLIPSIBLINGSを指定しない場合、子ウィンドウがオーバーラップしていると、ある子ウィンドウのクライアント領域の内部を描画するときに、その子ウィンドウと隣り合うほかの子ウィンドウのクライアント領域の内部を描画することが可能になります。このスタイルは、必ずWS_CHILDスタイルと組み合わせて使います。」

オーバーラップ  クリップの意味がわからなかったので
調べてみました

オーバーラップ

「他のウィンドウの外側へ移動したり重なったりすることができるという意味」

クリッピング

「必要な部分だけをくりぬくようにして表示する」

これはウィンドウが重なっているときに
WS_CLIPSIBLINGSを子ウィンドウのほうに指定していないと
隠れてるほうのウィンドウにWM_PAINTが送られたとき
かぶさっているほうのウィンドウに描画されてしまうよ  
という意味なのでしょうか

つまりは親ウィンドウ自身に子ウィンドウのクライアント領域が
描画されているということなのだろうととりあえず思って

その子ウィンドウにWS_CLIPSIBLINGSスタイルを指定してみましたが
結果は同じでした
やっぱり使いかた間違っているでしょうか??


ごま  2004-04-06 06:49:54  No: 53416

これは掲示板で聞く以前の問題だろ・・
と自分でも思うのですが
まず何で勉強したら身につくのかわからないので
色んな勉強サイトを渡り歩いては
学んで試行錯誤を繰り返しているんですが
やはりそれでもまだ「これは必須」という基本が身につかないですね〜
よかったらまずウィンドウズプログラムにおいて何を
勉強したらよいのか
いい本でもHPでもあったら教えてもらえないでしょうか
話をそれてしまってすいません


RiSK  2004-04-06 09:15:28  No: 53417

直接的な回答ではありませんが何点か… (^^;

今回の問題となっているところだけに絞りましょう。
また、長い文を書くのではなく箇条書きにした方が分かりやすくなると思いますよ。
# 文ではなく文章であれば、まだ分かりやすかったかも

親子関係を整理します。以下でよろしいですか?

メインウインドウ
┣エディットボックスA
┣エディットボックスB
┣ボタン
┗子ウィンドウA
  ┗垂直スクロールバー

> 左端にプッシュボタンを二つEDITコントロールを一つ
> 右にプッシュボタンを一つもつメインウィンドウに
> 自分でWNDCLASS構造体を登録し
> 垂直スクロールバーを配置した子ウィンドウをメインウィンドウの
> 左側に配置したところ子ウィンドウの領域部分には
> 子ウィンドウの領域によって隠されたはずの
> メインウィンドウのプッシュボタンとEDITコントロールが
> そのまま表示されていました

エディットボックスと子ウィンドウAは兄弟ですから、
「隠されたはず」とはならないと思います。

> そのプッシュボタンを押すこともEDITに入力することもできませんでした

子ウィンドウと重なっていない場合は押したり、入力したりできますか?
子ウィンドウをボタン等と重ならないようにして、実験しましたか?

> そして逆にそのメインウィンドウの上に配置してある子ウィンドウを
> 親ウィンドウとしてプッシュボタンを作成しても
> 子ウィンドウの領域には何も現れないのです

これだけでは、何とも言えません。

前半、後半ともに、どのように子ウィンドウ等を作ったのかソースを載せてみると
問題点が分かるかもしれません。

> いい本でもHPでもあったら教えてもらえないでしょうか

もう知っているかもしれませんが、有名どころ
→猫でもわかるプログラミング http://www.kumei.ne.jp/c_lang/


RiSK  2004-04-06 09:27:22  No: 53418

あっ! 言い忘れ。

解決していないからレスがつかないのでは?
と思ったり。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200403/04030044.txt


ごま  2004-04-06 20:40:29  No: 53419

> 解決していないからレスがつかないのでは?
> と思ったり。

ごめんなさい。
正直言うとこっちの問題の方ばかり気にして
試していませんでした
マナー違反でした
これからは気をつけます

> 親子関係を整理します。以下でよろしいですか?

> メインウインドウ
> ┣エディットボックスA
> ┣エディットボックスB
> ┣ボタン
> ┗子ウィンドウA
>   ┗垂直スクロールバー

はい  そうです

>> そして逆にそのメインウィンドウの上に配置してある子ウィンドウを
>> 親ウィンドウとしてプッシュボタンを作成しても
>>子ウィンドウの領域には何も現れないのです

> これだけでは、何とも言えません

ごめんなさい  これに関しては誤りで
ダイアログプロシージャからFindWindow()で子ウィンドウの
ハンドルを得てそこにプッシュボタンを作成したつもりだったんですが
関数は失敗していました。
FindWindowはオーナーウィンドウしか検索できないんですね^^;
これは誤りでしたすいません

> 子ウィンドウと重なっていない場合は押したり、入力したりできますか?
> 子ウィンドウをボタン等と重ならないようにして、実験しましたか?

はい  これはできました
・・わかってきた気がします

> エディットボックスと子ウィンドウAは兄弟ですから、
> 「隠されたはず」とはならないと思います。

つまりは僕がこれを理解していなかったのが問題だったのですね
兄弟ウィンドウ同士が重なってしまう可能性があるときは
双方にWS_CLIPSIBLINGSを設定していないと
もう一方のコントロールが描画されてしまう事になるってことですね

実際に
子ウィンドウと重なるプッシュボタン、EDITコントロールに
WS_CLIPSIBLINGSを設定したところ
子ウィンドウの領域に
プッシュボタンとEDITコントロールが表示されなくなっていました
つまり子ウィンドウに兄弟コントロールが描画されることが
なくなった  ということですよね
そして

子ウィンドウA
  ┣垂直スクロールバー
  ┗プッシュボタン

という感じでプッシュボタンを作成してみたら
ボタンは表示もされましたし問題なく動作しました!

RISKさん  YuOさん  ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加