◀ANSI版開発トップへ
  • 3740 アクティブなタブとウィンドウが食い違うバグ
    • 3980 Re:アクティブなタブとウィンドウが食い違うバグ
      • 3981 Re2:アクティブなタブとウィンドウが食い違うバグ
  • [3740] アクティブなタブとウィンドウが食い違うバグ もか 2004年09月06日 22:57

    WinXP。sakura 1.4.8.1、タブ表示、まとめる/まとめない。
    サクラエディタをウィンドウを3つ以上開きます。
    まとめているときは、他のソフトをすべて閉じます。
    (そうしないと、再現できないようですが、理由は、不明)
    するとタスクバーにはサクラエディタが1つだけある状態になるはずです。
    一番左側以外のウィンドウを順番に表示します。
    一番左側以外のウィンドウを閉じると、タブは一番左のタブがアクティブになっているように表示されます。
    実際に表示されているウィンドウは、Zオーダーの高いもの(閉じたウィンドウの前に表示したウィンドウ)が表示されています。
    • [3980] Re:アクティブなタブとウィンドウが食い違うバグ ryoji 2005年07月19日 01:52

      CTabWnd.cpp の TWNT_DEL 時のタブ選択処理がおかしいようです。

      WM_DESTROY 時には既にウィンドウが非表示になっているため、
      その時点ではもう別のウィンドウがアクティブ化されています。

      ウィンドウをまとめていないとき
      WM_DESTROY よりも以前に、ひとつ前のウィンドウに WM_SETFOCUS が
      届くので、TWNT_ORDER、TWNT_DEL の順にメッセージをポストする
      結果になっている。

      #ポストを実行するプロセスが別なので、その順序どおりになるとは
      #限らないと思いますが、まぁ、概ねその順になってるみたいです。

      ウィンドウをまとめているとき
      他のソフトが閉じられていると、非表示の先頭ウィンドウに
      WM_ACTIVATEAPP が届くみたいです。
      これだけなら、まだ問題なさそうなのですが、
      サクラエディタでは WM_ACTIVATEAPP で SetFocus() してるので、
      WM_SETFOCUS がすぐに実行されてしまい、その後実際に画面が表示されも
      WM_SETFOCUS が来なくなります。
      ですので、この場合も TWNT_ORDER が TWNT_DEL よりも先にポストされる
      結果になるようです。

      で、TWNT_DEL のほうのタブ選択処理がおかしいので間違ったタブ選択
      になっています。
      • [3981] Re2:アクティブなタブとウィンドウが食い違うバグ ryoji 2005年07月19日 01:54

        以下、TWNT_DEL 時のタブ選択処理修正です。

        @@ -519,24 +519,25 @@
        nIndex = FindTabIndexByHWND( (HWND)lParam );
        if( -1 != nIndex )
        {
        - // 2004.05.22 MIK
        - // TABがすべて消えるのを防ぐため,
        - // Active Tabを削除する前にフォーカスを外す
        - int nIndexOld = nIndex;
        -
        - //次のウインドウが自分ならアクティブに
        - nIndex = GetFirstOpenedWindow();
        - if( -1 != nIndex )
        + int nArr;
        + nArr = GetFirstOpenedWindow();
        + if( -1 != nArr )
        {
        // 2004.05.22 MIK
        // TABがすべて消えるのを防ぐため,
        // 対象Active Tabだったら
        // 削除前にフォーカスをはずす
        - TabCtrl_SetCurSel( m_hwndTab, nIndex );
        - TabCtrl_SetCurFocus( m_hwndTab, nIndex );
        - //TabCtrl_HighlightItem( m_hwndTab, nIndex, TRUE );
        + int nSel;
        + nSel = FindTabIndexByHWND( m_pShareData->m_pEditArr[ nArr ].m_hWnd ); // 2005.07.18 ryoji
        + if( -1 != nSel )
        + {
        + TabCtrl_SetCurSel( m_hwndTab, nSel );
        + TabCtrl_SetCurFocus( m_hwndTab, nSel );
        + //TabCtrl_HighlightItem( m_hwndTab, nIndex, TRUE );
        + }

        - if( m_pShareData->m_pEditArr[ nIndex ].m_hWnd == m_hwndParent )
        + //次のウインドウが自分ならアクティブに
        + if( m_pShareData->m_pEditArr[ nArr ].m_hWnd == m_hwndParent )
        {
        if( //TRUE == m_pShareData->m_Common.m_bDispTabWnd //2004.02.02
        //&& FALSE == m_pShareData->m_Common.m_bDispTabWndMultiWin
        @@ -547,7 +548,7 @@
        }
        }
        }
        - TabCtrl_DeleteItem( m_hwndTab, nIndexOld );
        + TabCtrl_DeleteItem( m_hwndTab, nIndex );
        }
        break;