モードレスダイアログのようなウィンドウのZ順を実現する方法って

[戻る]
ナオーバ 2002/09/27(金) 01:47:13
こんにちは

下記のぺージを参考にしてSDIのスケルトンにフレームとビューを追加してウインドウを
モードレスダイアログのように使用しています
 http://www.interq.or.jp/jazz/iijima/mfc/iijima/09extrafrm1.html
 http://www.interq.or.jp/jazz/iijima/mfc/iijima/10extrafrm2.html

このウインドウのZ順をモードレスダイアログのように
 Z順がいつもメインフレームの上にある
 でもモードレスダイアログの上にウインドウが表示されるので最上位ではない

を実装したいのですが SetWindowPos では、
 最下位、最上位、常に最上位、wndNoTopMost?
なのでできそうにありません。

どこで設定すればよいでしょうか?

chemo 2002/09/27(金) 11:25:11
>を実装したいのですが SetWindowPos では、
> 最下位、最上位、常に最上位、wndNoTopMost?
>なのでできそうにありません。

???

SetWindowPos の第二引数の説明は、

 位置調整されるウィンドウの、 Z順序内で直前に位置するウィンドウを識別します。
 このパラメータには、 ウィンドウハンドルまたは次に示す値のいずれかを指定します。
 HWND_BOTTOM、HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST

となっていますから、この場合、直前のウィンドウにあたる「モードレスダイアログの
上のウインドウ」のウィンドウハンドルを指定すればいいのでは?

ナオーバ 2002/09/27(金) 14:11:47
レスありがとうございます。

環境を忘れていました
 WIN2000 SP2
 VC6.0   SP5
 MFC使用
です

表現が悪く正しく伝わっていませんので、修正の上やってみたこと等をまじえて書きます


MFCの場合のCWnd::SetWindowPosの第一引数にwndTopMostを指定するだけで
「常に手前に表示」が実装できます。

したいことはZ順がいつもメインフレームの上にあることです
この場合は他のウィンドウの状況を判断してその状況によってSetWindowPosを
使い分けなさいって事ですか?


対象ウィンドウを作成するときにwndTopを指定して手前に表示させ
アクティブなウィンドウがメインフレームの時は常に対象ウィンドウにwndTopを指定
アクティブなウィンドウが他のウィンドウの時は何もしない?

void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{
    if( m_pSubFrm )
        m_pSubFrm->SetWindowPos( &wndTop, 0, 0, 0, 0, SWP_NOMOVE | 
SWP_NOSIZE );

    CFrameWnd::OnActivate(nState, pWndOther, bMinimized);
}
で近い事が出来ましたが、ちらついたり、メインフレームでマウスの左を押したままにすると
対象ウィンドウ上にメインフレームの枠線が表示されたり、微妙に違います。

何とかならないでしょうか?

dairygoods 2002/09/27(金) 14:32:02
メインフレームが子フレームの親になるようにすれば
できそうな気がします。
SetParentを試してみてください。

ナオーバ 2002/09/27(金) 16:08:13
レスありがとうございます。

書き忘れていた事がありました。
以前書いたURLのページの方法のは他にタスクバーに表示しないようにする為に
http://techtips.belution.com/ja/vc/0077/
の方法で作成しています。
この特殊なウィンドウの為メインフレームが子フレームの親には出来ないのです。

難しそうになってきましたが、何とかならないものでしょうか?

ツールバー、ステータスばー及び更新用ハンドラを実装したモードレスダイアログで
進めていたのですが、スクロールバーで表示領域を移動させたりしたいので
CScrollViewが使いたいのです。
よって上記のウィンドウを作成しました。

何方かアドバイスをお願いします。

ナオーバ 2002/09/27(金) 16:37:16
[[解決]]
dairygoodsさんありがとうございます!!

16:08:13に書いたときは出来ないって決めてかかってました、
やってみたら実現できました。

でもなんでなんでしょうか?
Z順を変更できる関数では難しいのに。

本当にありがとうございました。

dairygoods 2002/09/27(金) 17:02:58
> でもなんでなんでしょうか?
> Z順を変更できる関数では難しいのに。

Z順は単にそのときのウィンドウの重なり順を表しているだけです。
固定的なウィンドウの順番とは関係ありません。
(TopMostという特殊なものはありますが。)

親子関係は、ウィンドウの固定的な前後関係を規定します。
子は常に親の手前に表示されます。

ナオーバ 2002/09/28(土) 15:36:58
レスありがとうございます。

>Z順は単にそのときのウィンドウの重なり順を表しているだけです。
>固定的なウィンドウの順番とは関係ありません。
>(TopMostという特殊なものはありますが。)
それでSetWindowPosではできないのですね。

>親子関係は、ウィンドウの固定的な前後関係を規定します。
>子は常に親の手前に表示されます。
これは何かの関数で行っているとかではなく、
CWnd::GetParentがNULLでなければ子は常に親の手前に表示するという決まりごとなのです
か?

解決後に聞くのは変なのですが後学の為に宜しくお願いします

dairygoods 2002/09/30(月) 10:34:22
> CWnd::GetParentがNULLでなければ子は常に親の手前に表示するという
> 決まりごとなのですか?

MSDN SDKドキュメント内の「Z Order」辺りに書いてあるような気がします。
先に、子が常に親の手前にあると言ったのは、単に経験上からですけど。

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