◀ANSI版開発トップへ
  • 4004 Z オーダーの問題
    • 4005 Re:Z オーダーの問題対策?
      • 4009 Re2:Z オーダーの問題対策?
        • 4011 Re3:Z オーダーの問題対策?
          • 4015 Re4:Z オーダーの問題対策?
      • 4012 Re2:Z オーダーの問題対策?
        • 4014 Re3:Z オーダーの問題対策?
  • [4004] Z オーダーの問題 ryoji 2005年08月07日 03:11

    環境:Ver. 1.5.4.1 (WinXP Pro)

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

    2.重ねて表示・並べて表示時の問題
    ウィンドウをまとめない設定の状態で3つ新規作成画面を開く(3個目がアクティブになる)
    1個目、2個目の順にアクティブにする
    重ねて表示を実行(左上から1個目、3個目、2個目という順序になる)
    以上の操作で3個目の画面(左上からの順では中央)が1番奥に表示される
    ウィンドウをまとめる設定の状態から上記の操作をした場合には、
    左上の画面ほど手前に表示され、一番奥にある画面(2個目の画面)がアクティブになっている
    • [4005] Re:Z オーダーの問題対策? ryoji 2005年08月07日 03:45

      > 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 を使ってみるとか)、結局このあたりの策しか今のところ私には見当たりませんでした。(^^;
      • [4009] Re2:Z オーダーの問題対策? ryoji 2005年08月11日 21:31

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

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

          >タブ用ツールチップの TOPMOST 設定をやめる
          非アクティブなウィンドウのツールチップが最上位に来る必要も無さそうなので,これを取り入れることにします.
          • [4015] Re4:Z オーダーの問題対策? ryoji 2005年08月16日 22:35

            ▼ げんたさん
            > >タブ用ツールチップの 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 になってますが...
      • [4012] Re2:Z オーダーの問題対策? げんた 2005年08月14日 03:54

        > ::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 です.
        • [4014] Re3:Z オーダーの問題対策? ryoji 2005年08月16日 21:47

          > > ::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ウィンドウと同じ位置・大きさで背後に表示されるはずなのですが。