いろはです。
ウィンドウに設定したTopMostを解除する時に不思議な現象が出ています。
たとえば、、
あるモードレスダイアログを2つ作成し、
SetWindowPos( &wndTopMost, ..., SWP_NOSIZE|SWP_NOMOVE );
と設定します。
その後、ボタン押下などで片方のTopMost属性を外すべく
SetWindowPos( &wndNoTopMost, ..., SWP_NOSIZE|SWP_NOMOVE );
としているのですが、属性を解除したくないダイアログについても
TopMostが解除されてしまいます。(Spyにより確認)
調べた所、同一プロセスのウィンドウすべてのTopMostが解除されてしまうようです。
環境は
Win2000+VC6(MFC使用)
WinXP+VC2004(.NET使用)
両方の環境で同じような現象になります。
Windowsのバグ?っと思うのですが、『そのやり方は間違ってるぞ』っと
言うような事を教えていただけないでしょうか?
ヘルプにこんなことが書いてあります。
SetWindowPos
http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_setwindowpos.
asp
| 最前面ウィンドウが非最前面ウィンドウになると、
| そのオーナーウィンドウとそれが所有するウィンドウも
| 非最前面ウィンドウになります。
dairygoodsさん ありがとうございます。
なるほど。。
と言うか、ありえませんって、、
確かにそういったシチュエーションは少ないですが、言い切って欲しくないですね。。
実際そういう状況を求められているので…
重要なウィンドウだからこそ、TopMostにしているので、その辺は勝手に制御して欲しく無い。
っと愚痴ってみました。
理由がはっきりしてよかったです。
ありがとうございました。
で、解決チェックをしたいのですが、関連することなのでもう少しお付き合いください。
以降、.NETの話です。
Forms::TopMostを使ってTopMostを制御していますが、こちらも同様に、
他のウィンドウのTopMostをFalseに設定すると、WS_EX_TOPMOSTは外れてしまいます。
が、Forms::TopMostの値を見るとTrueのまま。。
ですので、WS_EX_TOPMOST属性が付いているか直接確認したいのですが、
MFCで言う、GetExStyle()にあたる関数を教えて下さい。
当方、最近.NETに移ったばかりなので、目当ての関数を見つけることが出来ませんでした。
よろしくお願いします。
GetWindowLongをP/Invokeすればよいのでは?
遅くなりました。
やはりP/Invokeするしかないのですかね。
.NET FrameworkになるとWin32APIを直接いじる事が少なくなると思っていたので、
『何か別の方法があるんでは?』っと思っていたのですが。。
YuOさん ありがとうございました。