2005/8/7 (日) 03:11:59 ryoji  
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
[4004] Z オーダーの問題
環境:Ver. 1.5.4.1 (WinXP Pro)

1.結合表示解除時の問題
ウィンドウをまとめる設定で2個新規作成画面を開く(2個目がアクティブになる)
タブで1個目をクリックしてアクティブにする
結合表示を解除
以上の操作で、2個目の画面が非アクティブなまま1個目の画面の手前に表示される

2.重ねて表示・並べて表示時の問題
ウィンドウをまとめない設定の状態で3つ新規作成画面を開く(3個目がアクティブになる)
1個目、2個目の順にアクティブにする
重ねて表示を実行(左上から1個目、3個目、2個目という順序になる)
以上の操作で3個目の画面(左上からの順では中央)が1番奥に表示される
ウィンドウをまとめる設定の状態から上記の操作をした場合には、
左上の画面ほど手前に表示され、一番奥にある画面(2個目の画面)がアクティブになっている

2005/8/7 (日) 03:45:02 ryoji  
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
[4005] Re:Z オーダーの問題対策?
> 1.結合表示解除時の問題

CTabWnd.cpp(860) [CTabWnd::TabWnd_ActivateFrameWindow関数]
  ::ShowWindow( hwnd, SW_SHOWNA );
の非表示->表示切替で何故か Z オーダーが変化してしまっているみたい。
  ::SetWindowPos( m_hwndParent, NULL,0,0,0,0,
      SWP_SHOWWINDOW | SWP_NOACTIVATE
      | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER );
のようにすると Z オーダー変化無しで切り替えることができるっぽい。

> 2.重ねて表示・並べて表示時の問題

何だか SetWindowPos による Z オーダー操作がうまくいっていないような感じです。
重ね表示については、
CEditView_Command.cpp(7000 - 7026) [CEditView::Command_CASCADE関数]
あたり。
レスポンスは落ちるけれど単純に、
    for( i = 0; i < count; i++ )
    {
        ::ShowWindow( pWndArr[i].hWnd, SW_SHOWNOACTIVATE );
        ::MoveWindow(
            pWndArr[i].hWnd,
            pWndArr[i].newX, pWndArr[i].newY,
            width, height, TRUE);
        ::SetForegroundWindow( pWndArr[i].hWnd );
    }
のようにしたほうがうまくいく模様。

いろいろ試してみて(DeferWindowPos を使ってみるとか)、結局このあたりの策しか今のところ私には見当たりませんでした。(^^;

2005/8/11 (木) 21:31:53 ryoji  
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
[4009] Re2:Z オーダーの問題対策?
> > 2.重ねて表示・並べて表示時の問題

こちらは、タブ用ツールチップの TOPMOST 設定をやめると SetWindowPos での Z オーダー操作が意図通りに動くようになるみたいです。
CTabWnd::Open() 内のツールチップ作成用の CreateWindowEx の WS_EX_TOPMOST および次の SetWindowPos を除去すると、CEditView_Command.cpp は従来のままでも問題は起きなくなりました。
そうすると他ウィンドウの背後にある場合にツールチップが手前のウィンドウの後ろになりますが...
非アクティブなときにはツールバーと同様にツールチップ表示そのものがなくてもいいような気もします。

2005/8/14 (日) 03:54:08 げんた  
INCM1.23c
[4011] Re3:Z オーダーの問題対策?
>タブ用ツールチップの TOPMOST 設定をやめる
非アクティブなウィンドウのツールチップが最上位に来る必要も無さそうなので,これを取り入れることにします.

2005/8/16 (火) 22:35:30 ryoji  
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
[4015] Re4:Z オーダーの問題対策?
▼ げんたさん
> >タブ用ツールチップの TOPMOST 設定をやめる
> 非アクティブなウィンドウのツールチップが最上位に来る必要も無さそうなので,これを取り入れることにします.


これとは別に、CEditView::Command_CASCADE関数でちょっと気になった部分があります。
最大化の解除のところ、CEditView_Command.cpp(6998)
::ShowWindow( pWndArr[i].hWnd, SW_RESTORE | SW_SHOWNA );
になってますが、
#define SW_SHOWNA   8
#define SW_RESTORE  9
なので OR の意味がありません(OR しても SW_RESTORE と同じ)。
SW_SHOWNOACTIVATE を意図しているのでしょうか?
Command_TILE_H / Command_TILE_V のところでは SW_RESTORE になってますが...

2005/8/14 (日) 03:54:09 げんた  
INCM1.23c
[4012] Re2:Z オーダーの問題対策?
>  ::SetWindowPos( m_hwndParent, NULL,0,0,0,0,
>      SWP_SHOWWINDOW | SWP_NOACTIVATE
>      | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER );
>のようにすると Z オーダー変化無しで切り替えることができるっぽい。

これを入れてみたら,「結合して表示」解除時に非Activeなものが表示されないようなのですが...
SHOWWINDOWと書いてあるのに何故だろう...

OSはWindows XP SP2 です.

2005/8/16 (火) 21:47:42 ryoji  
Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
[4014] Re3:Z オーダーの問題対策?
> >  ::SetWindowPos( m_hwndParent, NULL,0,0,0,0,
m_hwndParent は hwnd の間違いです。(^^;
でも、
> これを入れてみたら,「結合して表示」解除時に非Activeなものが表示されないようなのですが...
> SHOWWINDOWと書いてあるのに何故だろう...

この操作ではどちらでも同じはずですけどねぇ。
> OSはWindows XP SP2 です.
XP SP2 の環境2機種でやってみましたが、どちらも問題なく非Activeなものも非表示から表示になっています。
[4004]の1の操作の場合は、非ActiveウィンドウはActiveウィンドウと同じ位置・大きさで背後に表示されるはずなのですが。

INCM/CMT
Cyclamen v3.81
[ut:0.020][st:0.010]