📄 ctabwnd.cpp
字号:
//WM_NOTIFY処理
LRESULT CTabWnd::OnNotify( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if( NULL == m_hwndTab ) return 0L;
LPNMHDR lpnmhdr;
int nIndex;
TCITEM tcitem;
lpnmhdr = (LPNMHDR) lParam;
if( lpnmhdr->hwndFrom == m_hwndTab )
{
switch( lpnmhdr->code )
{
case TCN_SELCHANGE:
nIndex = TabCtrl_GetCurSel( m_hwndTab );
if( -1 != nIndex )
{
tcitem.mask = TCIF_PARAM;
tcitem.lParam = (LPARAM)0;
TabCtrl_GetItem( m_hwndTab, nIndex, &tcitem );
//指定のウインドウをアクティブに
ShowHideWindow( (HWND)tcitem.lParam, TRUE );
}
return 0L;
}
}
return 0L;
}
void CTabWnd::TabWindowNotify( WPARAM wParam, LPARAM lParam )
{
if( NULL == m_hwndTab ) return;
bool bFlag = false; //前回何もタブがなかったか?
int nCount;
int nIndex;
nCount = TabCtrl_GetItemCount( m_hwndTab );
if( nCount <= 0 )
{
bFlag = true;
//最初のときはすでに存在するウインドウの情報も登録する必要がある。
if( wParam == TWNT_ADD ) wParam = TWNT_REFRESH;
}
switch( wParam )
{
case TWNT_ADD: //ウインドウ登録
nIndex = FindTabIndexByHWND( (HWND)lParam );
if( -1 == nIndex )
{
TCITEM tcitem;
TCHAR szName[1024];
_tcscpy( szName, _T("(未命名)") );
tcitem.mask = TCIF_TEXT | TCIF_PARAM;
tcitem.pszText = szName;
tcitem.lParam = (LPARAM)lParam;
TabCtrl_InsertItem( m_hwndTab, nCount, &tcitem );
nIndex = nCount;
}
//TabCtrl_SetCurSel( m_hwndTab, nIndex );
if( (HWND)lParam == m_hwndParent )
{
//自分ならアクティブに
ShowHideWindow( (HWND)lParam, TRUE );
//ここに来たということはすでにアクティブ
//コマンド実行時のアウトプットで問題があるのでアクティブにする
}
else
{
//自分に用がなければ隠す。
ShowHideWindow( m_hwndParent, FALSE );
}
TabCtrl_SetCurSel( m_hwndTab, nIndex );
break;
case TWNT_DEL: //ウインドウ削除
nIndex = FindTabIndexByHWND( (HWND)lParam );
if( -1 != nIndex )
{
// 2004.05.22 MIK
// TABがすべて消えるのを防ぐため,
// Active Tabを削除する前にフォーカスを外す
int nIndexOld = nIndex;
//次のウインドウが自分ならアクティブに
nIndex = GetFirstOpenedWindow();
if( -1 != nIndex )
{
// 2004.05.22 MIK
// TABがすべて消えるのを防ぐため,
// 対象Active Tabだったら
// 削除前にフォーカスをはずす
TabCtrl_SetCurSel( m_hwndTab, nIndex );
TabCtrl_SetCurFocus( m_hwndTab, nIndex );
//TabCtrl_HighlightItem( m_hwndTab, nIndex, TRUE );
if( m_pShareData->m_pEditArr[ nIndex ].m_hWnd == m_hwndParent )
{
if( //TRUE == m_pShareData->m_Common.m_bDispTabWnd //2004.02.02
//&& FALSE == m_pShareData->m_Common.m_bDispTabWndMultiWin
/*&&*/ FALSE == ::IsWindowVisible( m_hwndParent ) )
{
ShowHideWindow( m_hwndParent, TRUE );
ForceActiveWindow( m_hwndParent );
}
}
}
TabCtrl_DeleteItem( m_hwndTab, nIndexOld );
}
break;
case TWNT_ORDER: //ウインドウ順序変更
nIndex = FindTabIndexByHWND( (HWND)lParam );
if( -1 != nIndex )
{
//TabCtrl_SetCurSel( m_hwndTab, nIndex );
if( (HWND)lParam == m_hwndParent )
{
//自分ならアクティブに
if( FALSE == ::IsWindowVisible( (HWND)lParam ) )
{
ShowHideWindow( (HWND)lParam, TRUE );
}
//ここに来たということはすでにアクティブ
}
else
{
//自分に用がなければ隠す。
ShowHideWindow( m_hwndParent, FALSE );
}
TabCtrl_SetCurSel( m_hwndTab, nIndex );
}
else
{
//指定のウインドウがないので再表示
Refresh();
}
break;
case TWNT_FILE: //ファイル名変更
nIndex = FindTabIndexByHWND( (HWND)lParam );
if( -1 != nIndex )
{
TCITEM tcitem;
CRecent cRecentEditNode;
TCHAR szName[1024];
// Jun. 19, 2004 genta
TCHAR szName_amp[sizeof(szName)/sizeof(szName[0]) * 2];
EditNode *p;
cRecentEditNode.EasyCreate( RECENT_FOR_EDITNODE );
p = (EditNode*)cRecentEditNode.GetItem( cRecentEditNode.FindItem( (const char*)&lParam ) );
if( p && p->m_szTabCaption[0] )
{
_tcsncpy( szName, p->m_szTabCaption, (sizeof( szName ) / sizeof( TCHAR )) );
szName[ (sizeof( szName ) / sizeof( TCHAR )) - 1 ] = _T('\0');
// Jun. 19, 2004 genta &のエスケープ
dupamp( szName, szName_amp );
}
else
{
_tcscpy( szName_amp, _T("(未命名)") );
}
cRecentEditNode.Terminate();
tcitem.mask = TCIF_TEXT | TCIF_PARAM;
tcitem.pszText = szName_amp;
tcitem.lParam = (LPARAM)lParam;
TabCtrl_SetItem( m_hwndTab, nIndex, &tcitem );
}
else
{
//指定のウインドウがないので再表示
Refresh();
}
break;
case TWNT_REFRESH: //再表示
Refresh();
break;
//Start 2004.07.14 Kazika 追加
//タブモード有効になった場合、まとめられる側のウィンドウは隠れる
case TWNT_MODE_ENABLE:
nIndex = FindTabIndexByHWND( (HWND)lParam );
if (-1 != nIndex)
{
if( (HWND)lParam == m_hwndParent )
{
//自分ならアクティブに
//ShowHideWindow( (HWND)lParam, TRUE );
//自分はもともとアクティブのはず……
}
else
{
//自分に用がなければ隠す。
ShowHideWindow( m_hwndParent, FALSE );
}
//TabCtrl_SetCurSel( m_hwndTab, nIndex );
}
break;
//End 2004.07.14 Kazika
//Start 2004.08.27 Kazika 追加
//タブモード無効になった場合、隠れていたウィンドウは表示状態となる
case TWNT_MODE_DISABLE:
nIndex = FindTabIndexByHWND( (HWND)lParam );
if (-1 != nIndex)
{
if( (HWND)lParam != m_hwndParent )
{
//表示状態とする(フォアグラウンドにはしない)
TabWnd_ActivateFrameWindow( m_hwndParent, false );
}
//TabCtrl_SetCurSel( m_hwndTab, nIndex );
}
break;
//End 2004.08.27 Kazika
default:
break;
}
//タブの表示?非表示を切りかえる。
nCount = TabCtrl_GetItemCount( m_hwndTab );
if( nCount <= 0 )
{
::ShowWindow( m_hwndTab, SW_HIDE );
}
else
{
if( bFlag ) ::ShowWindow( m_hwndTab, SW_SHOW );
}
//更新
::InvalidateRect( m_hwndTab, NULL, TRUE );
return;
}
/*! 指定のウインドウハンドル情報を持つタブ位置を探す */
int CTabWnd::FindTabIndexByHWND( HWND hWnd )
{
int i;
int nCount;
TCITEM tcitem;
if( NULL == m_hwndTab ) return -1;
nCount = TabCtrl_GetItemCount( m_hwndTab );
for( i = 0; i < nCount; i++ )
{
tcitem.mask = TCIF_PARAM;
tcitem.lParam = (LPARAM)0;
TabCtrl_GetItem( m_hwndTab, i, &tcitem );
if( (HWND)tcitem.lParam == hWnd ) return i;
}
return -1;
}
/*! タブリストを再表示する
@date 2004.06.19 genta &が含まれているファイル名が正しく表示されない
*/
void CTabWnd::Refresh( void )
{
int i;
int nIndex;
TCITEM tcitem;
TCHAR szName[1024];
// Jun. 19, 2004 genta
TCHAR szName_amp[sizeof(szName)/sizeof(szName[0]) * 2];
EditNode *p;
int nCount;
if( NULL == m_hwndTab ) return;
TabCtrl_DeleteAllItems( m_hwndTab );
p = NULL;
nCount = CShareData::getInstance()->GetOpenedWindowArr( &p, TRUE );
nIndex = -1;
for( i = 0; i < nCount; i++ )
{
if( m_hwndParent == p[ i ].m_hWnd ) nIndex = i;
if( p[ i ].m_szTabCaption[0] )
{
_tcsncpy( szName, p[ i ].m_szTabCaption, (sizeof( szName ) / sizeof( TCHAR )) );
szName[ (sizeof( szName ) / sizeof( TCHAR )) - 1 ] = _T('\0');
// Jun. 19, 2004 genta &のエスケープ
dupamp( szName, szName_amp );
}
else
{
_tcscpy( szName_amp, _T("(未命名)") );
}
tcitem.mask = TCIF_TEXT | TCIF_PARAM;
tcitem.pszText = szName_amp;
tcitem.lParam = (LPARAM)p[ i ].m_hWnd;
TabCtrl_InsertItem( m_hwndTab, i, &tcitem );
}
if( p ) delete [] p;
if( -1 != nIndex )
{
TabCtrl_SetCurSel( m_hwndTab, nIndex );
}
return;
}
void CTabWnd::ShowHideWindow( HWND hwnd, BOOL bDisp )
{
if( NULL == hwnd ) return;
if( bDisp )
{
if( m_pShareData->m_Common.m_bDispTabWndMultiWin == FALSE )
{
//ウインドウ情報を引き継ぐ。
m_pShareData->m_TabWndWndpl.length = sizeof( m_pShareData->m_TabWndWndpl );
::SetWindowPlacement( hwnd, &(m_pShareData->m_TabWndWndpl) );
}
TabWnd_ActivateFrameWindow( hwnd );
}
else
{
if( m_pShareData->m_Common.m_bDispTabWnd )
{
if( m_pShareData->m_Common.m_bDispTabWndMultiWin == FALSE )
{
::ShowWindow( hwnd, SW_HIDE );
}
}
}
return;
}
int CTabWnd::GetFirstOpenedWindow( void )
{
int i;
for( i = 0; i < m_pShareData->m_nEditArrNum; i++ )
{
if( CShareData::getInstance()->IsEditWnd( m_pShareData->m_pEditArr[i].m_hWnd ) )
{
return i;
}
}
return -1;
}
/*! ウインドウを強制的に前面に持ってくる */
void CTabWnd::ForceActiveWindow( HWND hwnd )
{
int nId1;
int nId2;
DWORD dwTime;
nId2 = ::GetWindowThreadProcessId( ::GetForegroundWindow(), NULL );
nId1 = ::GetWindowThreadProcessId( hwnd, NULL );
::AttachThreadInput( nId1, nId2, TRUE );
::SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &dwTime, 0 );
::SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, 0 );
//ウィンドウをフォアグラウンドにする
::SetForegroundWindow( hwnd );
::BringWindowToTop( hwnd );
::SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)dwTime, 0 );
::AttachThreadInput( nId1, nId2, FALSE );
}
/*! アクティブにする
@param hwnd [in] 対象ウィンドウのウィンドウハンドル
@param bForeground [in] true: active and forground / false: active
@date 2004.08.27 Kazika 引数bForeground追加。bForegroundがfalseの場合はウィンドウをフォアグラウンドにしない。
*/
void CTabWnd::TabWnd_ActivateFrameWindow( HWND hwnd, bool bForeground )
{
if ( bForeground )
{
if( ::IsIconic( hwnd ) )
{
::ShowWindow( hwnd, SW_RESTORE ); // Nov. 7. 2003 MIK アイコン時は元のサイズに戻す
return;
}
else if( ::IsZoomed( hwnd ) )
{
::ShowWindow( hwnd, SW_MAXIMIZE );
}
else
{
::ShowWindow( hwnd, SW_SHOW );
}
::SetForegroundWindow( hwnd );
::BringWindowToTop( hwnd );
}
else
{
::ShowWindow( hwnd, SW_SHOWNA );
}
return;
}
/*[EOF]*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -