親子関係のウィンドウの画面制御

[戻る]
ねこ 2012/06/11(月) 11:07:10
以下の資料1の用に、親ウィンドウをベースに子ウィンドウを作成しています。
いろいろな事情により、この親子関係を崩すことができません。
この様な作りの際、親ウィンドウを子ウィンドウに画面を重ねたら、
必ず、子ウィンドウが前面にきます。これをどうにかして、
アクティブになっている方を前面にもっていきたいのですが、方法がわかりません。

<資料1>
pclFrame->Create(NULL,  "子ウィンドウ", WS_OVERLAPPEDWINDOW,
                clRect, CWnd::FromHandle(親ウィンドウのハンドル),
                 MAKEINTRESOURCE(IDR_MAINFRAME));
※pclFrameはCFrameWndの派生クラスです。

<親子関係>
 親<EXE> 子<モーダレスのDLL>

<環境>
VC++ 2008 Windows7

仲澤@失業者 2012/06/11(月) 13:37:02
親子関係にあるウインドウの重なり順位(Zオーダーと呼びます)は、
変更できません。親が必ず後ろ側になります。
しかし、子供同士、又は親子関係の無いウインドウ同士の前後関係は
どうとでもできます。

本件の場合、現在親としているEXEウインドウを非表示とし、当該の
親ウインドウと、見た目及び機能がまったく同じ子(ポップアップ)
ウインドウを作成し、モーダレスDLGと兄弟とすることにより、
希望の機能が実現できます。

又は、当該DLGの親をデスクトップとし、EXEのウインドウと、親子関係
を持たないようにしてみる、のも、試してみる価値があります。

何れの場合も、GetParent()やMFCのGetOwner()を使用している場所の
テストが必要となるでしょう。

ねこ 2012/06/11(月) 15:19:44
仲澤@失業者さん、ご教授ありがとうございます。
案として、出していただいた件ですが、どちらともダメだといわれました(;;)

<親子関係である理由>
タスクバーに子DLLのタスクを表示したくないからです。

<路線変更>
ウインドウの重なり順位を変更するか、タスクバーを非表示にする対応を
検討しています。簡単にできる方法があれば、ご教授ください。

仲澤@失業者 2012/06/11(月) 15:38:25
では、当該DLGの親を、別の不可視なウインドウを親として
作成してみてはどうでしょうか。
または、WS_EX_TOOLWINDOWとかですかね。

(蛇足)
仕様上でタスクバーをひどく気にされる方がいらっしゃいますが、
OSの仕様が変わればなくなるかもしれない機能に
コストをかけるのはどうなんでしょうかね。
しかもユーザーが任意にバーを非表示にもできますし。
実際のところWindows8からはどうなるんでしょう
・・・とかっ(笑)。

仲澤@失業者 2012/06/11(月) 15:50:19
いいわすれ。orz
1.ALT+Tab や ALT+F4
2.タスクマネージャ
3.Windowsキー+「何かのキー」
などの時の動作も配慮する必要があるかもしれませんね。
まぁ、あんまり深く追求しない方が良いかも知れませんけど(vv;)。

ねこ 2012/06/11(月) 16:51:11
スタイルにWS_EX_TOOLWINDOWを追加することで対応しました。
それをすることによって、最小化ボタンが消えました。

InsertMenuとかで別途最小化ボタンをつけようとしているのですが、
いまいちわかりません(・・;)

仲澤@失業者 2012/06/11(月) 17:51:30
「タスクバーに表示しない」ウインドウを最小化した場合
どのような取り扱いになるのか、ちょっと気になりますが、
まぁおいといて。

SetWindowLongPtr()でウインドウスタイルにWS_MINIMIZEBOXを
追加する・・・ぢゃだめですかね(未検証)。
設定した後にSetWindowPos()する必要があるかもしれません。

古いスレッドには追加発言できません。