- Win32API質問箱 Build122
88 :デフォルトの名無しさん[sage]:2016/02/22(月) 00:01:15.97 ID:e00mKUAj - >>86
お返事ありがとうございます。何とか解決しました。 >>85を具体的に説明しますと、ダイアログベースで作ったメインのオーバーラップウィンドウにいくつか コントロールが配置されていて、あるボタンを押すとダイアログのある範囲のデザインを変更すべく、 別の子ウィンドウスタイルのダイアログが上に表示されます。 これまでは>>85の解釈が正解であれば、HWND_BOTTOMでZオーダーの最後にすることにより前面に来るような挙動をしています。 ここで子ダイアログにWS_CLIPSIBLINGSを指定して、SetWindowPosでHWND_TOP、HWND_BOTTOMとも試してみましたが、 親ダイアログ内の重なり合うコントロールより上には正しく表示されません。 親ダイアログ内の重なり合うコントロールにもWS_CLIPSIBLINGSを付与してみると、今度はSetWindowPosでHWND_TOPを 指定すると当初の希望通りに前面に子ダイアログが表示されました。 HWND_BOTTOMを指定すると、今度は一番下になりました。 これで解決に見えますが、最後に質問です。 親ダイアログ内の重なりあるコントロールにWS_CLIPSIBLINGSを付与しましたが、VSのダイアログエディタでは操作できないので プログラムでわざわざ付与しています。 ダイアログベースの場合、ここまでしなければいけないものでしょうか?
|
- Win32API質問箱 Build122
99 :デフォルトの名無しさん[sage]:2016/02/22(月) 15:31:52.54 ID:e00mKUAj - 85です。
>>93 そのようにする場面もあるのですが、今回は注意喚起の表示という仕様のため、条件を満たすまで 今回の子ダイアログは表示しっぱなしだけど他のコントロールは操作できるようになります。 なので、見た目はポップアップぽいけどフォーカスは奪わないし親ウィンドウの移動にも追随する という感じになります。 >>95 どうやらそのようですね。 保守性がよろしくないので、一旦元の形に戻してしまいました。 下に続きます。 >>94,96 結論から書くと、WS_CLIPCHILDRENでうまく行きそうです。 ただ、WS_CLIPCHILDRENのみを付与しても目的の動作にはなりませんでした。 この場合、コモンコントロールが混じってると親と子ダイアログの前後関係がさらにおかしくなりました。 親ダイアログに配置されているコモンコントロールが常に子ダイアログより前面に来てしまいます。 なおかつ、その状態で子ダイアログに配置されているコントロールのみ、前面に表示されます。 (子ダイアログ本体の枠や背景のみが後ろになる) SetWindowPosでHWND_TOPやHWND_BOTTOMを付与しても変化ありませんでした。 長いので区切ります
|
- Win32API質問箱 Build122
100 :デフォルトの名無しさん[sage]:2016/02/22(月) 15:32:18.37 ID:e00mKUAj - 諦めかけましたが、試行錯誤の結果、次のようになりました。
親ダイアログ:WS_CLIPCHILDRENを付与 子ダイアログ:WS_CLIPSIBLINGSを付与 子ダイアログ表示時のSetWindowPosのフラグ:HWND_TOP リソースを直接編集したり、ソースレベルでWS_CLIPSIBLINGSを各コントロールに付与しない。 これで完全に意図した動作となりました。 ただ、これは大したことは無いですが、親ダイアログで使っているグループボックスはすべて透過指定を しなければグループ内部が真っ白になります。 通常、これをしなくとも透過したような表示なるコントロールですが、WS_CLIPCHILDRENを使う場合は これも忘れてはいけないことなります。 うっかり忘れそうな約束事なので、ウィンドウスタイルや透過など一切気にしなくていい>>85の作りの方が 気楽ではありますが... 皆さんありがとうございました。
|