以下の資料1の用に、親ウィンドウをベースに子ウィンドウを作成しています。
いろいろな事情により、この親子関係を崩すことができません。
この様な作りの際、親ウィンドウを子ウィンドウに画面を重ねたら、
必ず、子ウィンドウが前面にきます。これをどうにかして、
アクティブになっている方を前面にもっていきたいのですが、方法がわかりません。
<資料1>
pclFrame->Create(NULL, 子ウィンドウ, WS_OVERLAPPEDWINDOW,
clRect, CWnd::FromHandle(親ウィンドウのハンドル),
MAKEINTRESOURCE(IDR_MAINFRAME));
※pclFrameはCFrameWndの派生クラスです。
<親子関係>
親<EXE> 子<モーダレスのDLL>
<環境>
VC++ 2008 Windows7
親子関係にあるウインドウの重なり順位(Zオーダーと呼びます)は、
変更できません。親が必ず後ろ側になります。
しかし、子供同士、又は親子関係の無いウインドウ同士の前後関係は
どうとでもできます。
本件の場合、現在親としているEXEウインドウを非表示とし、当該の
親ウインドウと、見た目及び機能がまったく同じ子(ポップアップ)
ウインドウを作成し、モーダレスDLGと兄弟とすることにより、
希望の機能が実現できます。
又は、当該DLGの親をデスクトップとし、EXEのウインドウと、親子関係
を持たないようにしてみる、のも、試してみる価値があります。
何れの場合も、GetParent()やMFCのGetOwner()を使用している場所の
テストが必要となるでしょう。
仲澤@失業者さん、ご教授ありがとうございます。
案として、出していただいた件ですが、どちらともダメだといわれました(;;)
<親子関係である理由>
タスクバーに子DLLのタスクを表示したくないからです。
<路線変更>
ウインドウの重なり順位を変更するか、タスクバーを非表示にする対応を
検討しています。簡単にできる方法があれば、ご教授ください。
では、当該DLGの親を、別の不可視なウインドウを親として
作成してみてはどうでしょうか。
または、WS_EX_TOOLWINDOWとかですかね。
(蛇足)
仕様上でタスクバーをひどく気にされる方がいらっしゃいますが、
OSの仕様が変わればなくなるかもしれない機能に
コストをかけるのはどうなんでしょうかね。
しかもユーザーが任意にバーを非表示にもできますし。
実際のところWindows8からはどうなるんでしょう
・・・とかっ(笑)。
いいわすれ。orz
1.ALT+Tab や ALT+F4
2.タスクマネージャ
3.Windowsキー+「何かのキー」
などの時の動作も配慮する必要があるかもしれませんね。
まぁ、あんまり深く追求しない方が良いかも知れませんけど(vv;)。
スタイルにWS_EX_TOOLWINDOWを追加することで対応しました。
それをすることによって、最小化ボタンが消えました。
InsertMenuとかで別途最小化ボタンをつけようとしているのですが、
いまいちわかりません(・・;)
「タスクバーに表示しない」ウインドウを最小化した場合
どのような取り扱いになるのか、ちょっと気になりますが、
まぁおいといて。
SetWindowLongPtr()でウインドウスタイルにWS_MINIMIZEBOXを
追加する・・・ぢゃだめですかね(未検証)。
設定した後にSetWindowPos()する必要があるかもしれません。