毎度毎度超初心者の質問で本当に申し訳ないです
具体的に問題を自分がつかめているかどうかさえも
はっきりしないので タイトルがはっきりしなかったのも申し訳ないです
左端にプッシュボタンを二つEDITコントロールを一つ
右にプッシュボタンを一つもつメインウィンドウに
自分でWNDCLASS構造体を登録し
垂直スクロールバーを配置した子ウィンドウをメインウィンドウの
左側に配置したところ子ウィンドウの領域部分には
子ウィンドウの領域によって隠されたはずの
メインウィンドウのプッシュボタンとEDITコントロールが
そのまま表示されていました
そこでつまりメインウィンドウが
アクティブな状態であるという事なんだろうと
初心者なりの解釈をしていたんですが
そのプッシュボタンを押すこともEDITに入力することもできませんでした
これはつまりどういうことなんでしょうか
作りたかったのは
「お気に入り」ウィンドウを開いた状態である
ウィンドウエクスプローラーのようなカタチなんですが
(メインウィンドウのボタンを配置してある箇所に
子ウィンドウを配置してみたのは問題が一応わかりやすくなるかと
思いまして・・)
そして逆にそのメインウィンドウの上に配置してある子ウィンドウを
親ウィンドウとしてプッシュボタンを作成しても
子ウィンドウの領域には何も現れないのです
ただひたすらややこしい話ですみません
説明不足(または下手)だとしたら
考えて付け足したりするので よろしくおねがいします
SetWindowPos()関数を知ったので
HWND_TOPMOSTを指定して
子ウィンドウを常に最前面にもってくるよう指定しましたが
それでも結果は変わりませんでした
これはアクティブどうこうの問題ではないのでしょうか・・
WS_CLIPSIBLINGSを設定してみてはどうでしょう。
http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowStyles.asp
すいません 調べてみましたがわかりませんでしたTT
多分Win32API(?)の基本を(プログラミングの基本かな)
理解できていないんだろうなぁ
WS_CLIPSIBLINGS
「互いに関連する子ウィンドウをクリップします。つまり、ある子ウィンドウが、WM_PAINTメッセージを受け取ると、オーバーラップしているほかのすべての子ウィンドウはその子ウィンドウの領域からクリップされ、子ウィンドウは更新されます。
WS_CLIPSIBLINGSを指定しない場合、子ウィンドウがオーバーラップしていると、ある子ウィンドウのクライアント領域の内部を描画するときに、その子ウィンドウと隣り合うほかの子ウィンドウのクライアント領域の内部を描画することが可能になります。このスタイルは、必ずWS_CHILDスタイルと組み合わせて使います。」
オーバーラップ クリップの意味がわからなかったので
調べてみました
オーバーラップ
「他のウィンドウの外側へ移動したり重なったりすることができるという意味」
クリッピング
「必要な部分だけをくりぬくようにして表示する」
これはウィンドウが重なっているときに
WS_CLIPSIBLINGSを子ウィンドウのほうに指定していないと
隠れてるほうのウィンドウにWM_PAINTが送られたとき
かぶさっているほうのウィンドウに描画されてしまうよ
という意味なのでしょうか
つまりは親ウィンドウ自身に子ウィンドウのクライアント領域が
描画されているということなのだろうととりあえず思って
その子ウィンドウにWS_CLIPSIBLINGSスタイルを指定してみましたが
結果は同じでした
やっぱり使いかた間違っているでしょうか??
これは掲示板で聞く以前の問題だろ・・
と自分でも思うのですが
まず何で勉強したら身につくのかわからないので
色んな勉強サイトを渡り歩いては
学んで試行錯誤を繰り返しているんですが
やはりそれでもまだ「これは必須」という基本が身につかないですね〜
よかったらまずウィンドウズプログラムにおいて何を
勉強したらよいのか
いい本でもHPでもあったら教えてもらえないでしょうか
話をそれてしまってすいません
直接的な回答ではありませんが何点か… (^^;
今回の問題となっているところだけに絞りましょう。
また、長い文を書くのではなく箇条書きにした方が分かりやすくなると思いますよ。
# 文ではなく文章であれば、まだ分かりやすかったかも
親子関係を整理します。以下でよろしいですか?
メインウインドウ
┣エディットボックスA
┣エディットボックスB
┣ボタン
┗子ウィンドウA
┗垂直スクロールバー
> 左端にプッシュボタンを二つEDITコントロールを一つ
> 右にプッシュボタンを一つもつメインウィンドウに
> 自分でWNDCLASS構造体を登録し
> 垂直スクロールバーを配置した子ウィンドウをメインウィンドウの
> 左側に配置したところ子ウィンドウの領域部分には
> 子ウィンドウの領域によって隠されたはずの
> メインウィンドウのプッシュボタンとEDITコントロールが
> そのまま表示されていました
エディットボックスと子ウィンドウAは兄弟ですから、
「隠されたはず」とはならないと思います。
> そのプッシュボタンを押すこともEDITに入力することもできませんでした
子ウィンドウと重なっていない場合は押したり、入力したりできますか?
子ウィンドウをボタン等と重ならないようにして、実験しましたか?
> そして逆にそのメインウィンドウの上に配置してある子ウィンドウを
> 親ウィンドウとしてプッシュボタンを作成しても
> 子ウィンドウの領域には何も現れないのです
これだけでは、何とも言えません。
前半、後半ともに、どのように子ウィンドウ等を作ったのかソースを載せてみると
問題点が分かるかもしれません。
> いい本でもHPでもあったら教えてもらえないでしょうか
もう知っているかもしれませんが、有名どころ
→猫でもわかるプログラミング http://www.kumei.ne.jp/c_lang/
あっ! 言い忘れ。
解決していないからレスがつかないのでは?
と思ったり。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200403/04030044.txt
> 解決していないからレスがつかないのでは?
> と思ったり。
ごめんなさい。
正直言うとこっちの問題の方ばかり気にして
試していませんでした
マナー違反でした
これからは気をつけます
> 親子関係を整理します。以下でよろしいですか?
>
> メインウインドウ
> ┣エディットボックスA
> ┣エディットボックスB
> ┣ボタン
> ┗子ウィンドウA
> ┗垂直スクロールバー
はい そうです
>> そして逆にそのメインウィンドウの上に配置してある子ウィンドウを
>> 親ウィンドウとしてプッシュボタンを作成しても
>>子ウィンドウの領域には何も現れないのです
> これだけでは、何とも言えません
ごめんなさい これに関しては誤りで
ダイアログプロシージャからFindWindow()で子ウィンドウの
ハンドルを得てそこにプッシュボタンを作成したつもりだったんですが
関数は失敗していました。
FindWindowはオーナーウィンドウしか検索できないんですね^^;
これは誤りでしたすいません
> 子ウィンドウと重なっていない場合は押したり、入力したりできますか?
> 子ウィンドウをボタン等と重ならないようにして、実験しましたか?
はい これはできました
・・わかってきた気がします
> エディットボックスと子ウィンドウAは兄弟ですから、
> 「隠されたはず」とはならないと思います。
つまりは僕がこれを理解していなかったのが問題だったのですね
兄弟ウィンドウ同士が重なってしまう可能性があるときは
双方にWS_CLIPSIBLINGSを設定していないと
もう一方のコントロールが描画されてしまう事になるってことですね
実際に
子ウィンドウと重なるプッシュボタン、EDITコントロールに
WS_CLIPSIBLINGSを設定したところ
子ウィンドウの領域に
プッシュボタンとEDITコントロールが表示されなくなっていました
つまり子ウィンドウに兄弟コントロールが描画されることが
なくなった ということですよね
そして
子ウィンドウA
┣垂直スクロールバー
┗プッシュボタン
という感じでプッシュボタンを作成してみたら
ボタンは表示もされましたし問題なく動作しました!
RISKさん YuOさん ありがとうございました!
ツイート | ![]() |