⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csharedata.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//		}
//	}
//	m_pShareData->m_pEditArr[0].m_hWnd = hWnd;

	int		nSubCommand = TWNT_ADD;
	int		nIndex;
	CRecent	cRecentEditNode;
	EditNode	MyEditNode;
	EditNode	*p;

	memset( &MyEditNode, 0, sizeof( MyEditNode ) );
	MyEditNode.m_hWnd = hWnd;

	cRecentEditNode.EasyCreate( RECENT_FOR_EDITNODE );

	//登録済みか?
	if( -1 != (nIndex = cRecentEditNode.FindItem( (const char*)&hWnd ) ) )
	{
		//もうこれ以上登録できないか?
		if( cRecentEditNode.GetItemCount() >= cRecentEditNode.GetArrayCount() )
		{
			cRecentEditNode.Terminate();
			return FALSE;
		}
		nSubCommand = TWNT_ORDER;

		//以前の情報をコピーする。
		p = (EditNode*)cRecentEditNode.GetItem( nIndex );
		if( p )
		{
			memcpy( &MyEditNode, p, sizeof( MyEditNode ) );
		}
	}

	/* ウィンドウ連番 */

	if( 0 == ::GetWindowLongPtr( hWnd, sizeof(LONG_PTR) ) )
	{
		m_pShareData->m_nSequences++;
		::SetWindowLongPtr( hWnd, sizeof(LONG_PTR) , (LONG_PTR)m_pShareData->m_nSequences );

		//連番を更新する。
		MyEditNode.m_nIndex = m_pShareData->m_nSequences;
	}

	//追加または先頭に移動する。
	cRecentEditNode.AppendItem( (const char*)&MyEditNode );
	cRecentEditNode.Terminate();

	//ウインドウ登録メッセージをブロードキャストする。
	PostMessageToAllEditors( MYWM_TAB_WINDOW_NOTIFY, (WPARAM)nSubCommand, (LPARAM)hWnd, hWnd );

	return TRUE;
}





/*! 編集ウィンドウリストからの削除

	@date 2003.06.28 MIK CRecent利用で書き換え
*/
void CShareData::DeleteEditWndList( HWND hWnd )
{
//	int		i;
//	int		j;
//
//	/* ウィンドウハンドルの検索 */
//	for( i = 0; i < m_pShareData->m_nEditArrNum; ++i ){
//		if( hWnd == m_pShareData->m_pEditArr[i].m_hWnd ){
//			break;
//		}
//	}
//	if( i >= m_pShareData->m_nEditArrNum ){
//		return;
//	}
//	for( j = i; j < m_pShareData->m_nEditArrNum - 1; ++j ){
//		m_pShareData->m_pEditArr[j] = m_pShareData->m_pEditArr[j + 1];
//	}
//	m_pShareData->m_nEditArrNum--;

	//ウインドウをリストから削除する。
	CRecent	cRecentEditNode;
	cRecentEditNode.EasyCreate( RECENT_FOR_EDITNODE );
	cRecentEditNode.DeleteItem( (const char*)&hWnd );
	cRecentEditNode.Terminate();

	//ウインドウ削除メッセージをブロードキャストする。
	PostMessageToAllEditors( MYWM_TAB_WINDOW_NOTIFY, (WPARAM)TWNT_DEL, (LPARAM)hWnd, hWnd );

	return;
}

/* 共有データのロード */
BOOL CShareData::LoadShareData( void )
{
	return ShareData_IO_2( true );
}




/* 共有データの保存 */
void CShareData::SaveShareData( void )
{
	ShareData_IO_2( false );
	return;
}




/* 全編集ウィンドウへ終了要求を出す */
BOOL CShareData::RequestCloseAllEditor( void )
{
	HWND*	phWndArr;
	int		i;
	int		j;

	j = m_pShareData->m_nEditArrNum;
	if( 0 == j ){
		return TRUE;
	}
	phWndArr = new HWND[j];
	for( i = 0; i < j; ++i ){
		phWndArr[i] = m_pShareData->m_pEditArr[i].m_hWnd;
	}
	for( i = 0; i < j; ++i ){
		if( IsEditWnd( phWndArr[i] ) ){
			/* ウィンドウをアクティブにする */
			/* アクティブにする */
			ActivateFrameWindow( phWndArr[i] );
			/* トレイからエディタへの終了要求 */
			if( !::SendMessage( phWndArr[i], MYWM_CLOSE, 0, 0 ) ){
				delete [] phWndArr;
				return FALSE;
			}
		}
	}
	delete [] phWndArr;
	return TRUE;
}




/* 指定ファイルが開かれているか調べる */
/* 開かれている場合は開いているウィンドウのハンドルも返す */
BOOL CShareData::IsPathOpened( const char* pszPath, HWND* phwndOwner )
{
	int			i;
	FileInfo*	pfi;
	*phwndOwner = NULL;

	/* 現在の編集ウィンドウの数を調べる */
	if( 0 ==  GetEditorWindowsNum() ){
		return FALSE;
	}
	
	for( i = 0; i < m_pShareData->m_nEditArrNum; ++i ){
		if( IsEditWnd( m_pShareData->m_pEditArr[i].m_hWnd ) ){
			/* トレイからエディタへの編集ファイル名要求通知 */
			::SendMessage( m_pShareData->m_pEditArr[i].m_hWnd, MYWM_GETFILEINFO, 1, 0 );
			pfi = (FileInfo*)&m_pShareData->m_FileInfo_MYWM_GETFILEINFO;
			/* 同一パスのファイルが既に開かれているか */
			if( 0 == _stricmp( pfi->m_szPath, pszPath ) ){
				*phwndOwner = m_pShareData->m_pEditArr[i].m_hWnd;
				return TRUE;
			}
		}
	}
	return FALSE;
}





/* 現在の編集ウィンドウの数を調べる */
int CShareData::GetEditorWindowsNum( void )
{
	int		i;
	int		j;
	j = 0;
	for( i = 0; i < m_pShareData->m_nEditArrNum; ++i ){
		if( IsEditWnd( m_pShareData->m_pEditArr[i].m_hWnd ) ){
			j++;
		}
	}
	return j;

}



/*! 全編集ウィンドウへメッセージをポストする

	@date 2005.01.24 genta m_hWndLast == NULLのとき全くメッセージが送られなかった
*/
BOOL CShareData::PostMessageToAllEditors(
	UINT		uMsg,		/*!< ポストするメッセージ */
	WPARAM		wParam,		/*!< 第1メッセージ パラメータ */
	LPARAM		lParam,		/*!< 第2メッセージ パラメータ */
	HWND		m_hWndLast	/*!< 最後に送りたいウィンドウ */
 )
{
	HWND*	phWndArr;
	int		i;
	int		j;
	j = m_pShareData->m_nEditArrNum;
	if( 0 == j ){
		return TRUE;
	}
	phWndArr = new HWND[j];
	for( i = 0; i < j; ++i ){
		phWndArr[i] = m_pShareData->m_pEditArr[i].m_hWnd;
	}
	for( i = 0; i < j; ++i ){
		//	Jan. 24, 2005 genta m_hWndLast == NULLのときにメッセージが送られるように
		if( m_hWndLast == NULL ||
			( NULL != m_hWndLast && phWndArr[i] != m_hWndLast ) ){
			if( IsEditWnd( phWndArr[i] ) ){
				/* トレイからエディタへメッセージをポスト */
				::PostMessage( phWndArr[i], uMsg, wParam, lParam );
			}
		}
	}
	if( NULL != m_hWndLast && IsEditWnd( m_hWndLast ) ){
		/* トレイからエディタへメッセージをポスト */
		::PostMessage( m_hWndLast, uMsg, wParam, lParam );
	}
	delete [] phWndArr;
	return TRUE;
}


/*! 全編集ウィンドウへメッセージを送る

	@date 2005.01.24 genta m_hWndLast == NULLのとき全くメッセージが送られなかった
*/
BOOL CShareData::SendMessageToAllEditors(
	UINT		uMsg,		/* ポストするメッセージ */
	WPARAM		wParam,		/* 第1メッセージ パラメータ */
	LPARAM		lParam,		/* 第2メッセージ パラメータ */
	HWND		m_hWndLast	/* 最後に送りたいウィンドウ */
 )
{
	HWND*	phWndArr;
	int		i;
	int		j;

	j = m_pShareData->m_nEditArrNum;
	if( 0 == j ){
		return TRUE;
	}
	phWndArr = new HWND[j];
	for( i = 0; i < j; ++i ){
		phWndArr[i] = m_pShareData->m_pEditArr[i].m_hWnd;
	}
	for( i = 0; i < j; ++i ){
		//	Jan. 24, 2005 genta m_hWndLast == NULLのときにメッセージが送られるように
		if( m_hWndLast == NULL ||
			( NULL != m_hWndLast && phWndArr[i] != m_hWndLast ) ){
			if( IsEditWnd( phWndArr[i] ) ){
				/* トレイからエディタへメッセージをポスト */
				::SendMessage( phWndArr[i], uMsg, wParam, lParam );
			}
		}
	}
	if( NULL != m_hWndLast && IsEditWnd( m_hWndLast ) ){
		/* トレイからエディタへメッセージをポスト */
		::SendMessage( m_hWndLast, uMsg, wParam, lParam );
	}
	delete [] phWndArr;
	return TRUE;
}


/* 指定ウィンドウが、編集ウィンドウのフレームウィンドウかどうか調べる */
BOOL CShareData::IsEditWnd( HWND hWnd )
{
	char	szClassName[64];
	if( !::IsWindow( hWnd ) ){
		return FALSE;
	}
	if( 0 == ::GetClassName( hWnd, szClassName, sizeof(szClassName) - 1 ) ){
		return FALSE;
	}
	if(0 == strcmp( GSTR_EDITWINDOWNAME, szClassName ) ){
		return TRUE;
	}else{
		return FALSE;
	}

}

/*! 現在開いている編集ウィンドウの配列を返す

	@param ppEditNode [out] 配列を受け取るポインタ
	@param bSort [in]	true: ソートあり / false: ソート無し

	@return 配列の要素数を返す
	@note 要素数>0 の場合は呼び出し側で配列をdeleteしてください

	@date 2003.06.28 MIK CRecent利用で書き換え
*/
int CShareData::GetOpenedWindowArr( EditNode** ppEditNode, BOOL bSort )
{
//	int			nRowNum;
//	int			i;
//	int			j;
//	int			k;
//	int			nMinIdx;
//	int			nMin;
//	HWND*		phWndArr;
//
//	nRowNum = 0;
//	// phWndArr = NULL;
//	*ppEditNode = NULL;
//	j = 0;
//	for( i = 0; i < m_pShareData->m_nEditArrNum; ++i ){
//		if( CShareData::IsEditWnd( m_pShareData->m_pEditArr[i].m_hWnd ) ){
//			j++;
//		}
//	}
//	if( j > 0 ){
//		phWndArr = new HWND[j];
//		*ppEditNode = new EditNode[j];
//		nRowNum = 0;
//		for( i = 0;i < j; ++i ){
//			phWndArr[i] = NULL;
//		}
//		k = 0;
//		for( i = 0; i < m_pShareData->m_nEditArrNum && k < j; ++i ){
//			if( CShareData::IsEditWnd( m_pShareData->m_pEditArr[i].m_hWnd ) ){
//				phWndArr[k] = m_pShareData->m_pEditArr[i].m_hWnd;
//				k++;
//			}
//		}
//		if( bSort ){
//			while( 1 ){
//				nMinIdx = 99999;
//				nMin = 99999;
//				for( i = 0; i < j; ++i ){
//					if( phWndArr[i] != NULL &&
//						nMin > ::GetWindowLongPtr( phWndArr[i], sizeof(LONG_PTR) )
//					){
//						nMinIdx = i;
//						nMin = ::GetWindowLongPtr( phWndArr[i], sizeof(LONG_PTR) );
//					}
//				}
//				if( nMinIdx != 99999 ){
//					i = nMinIdx;
//					(*ppEditNode)[nRowNum].m_nIndex = i;
//					(*ppEditNode)[nRowNum].m_hWnd = m_pShareData->m_pEditArr[i].m_hWnd;
//					nRowNum++;
//					phWndArr[i] = NULL;
//				}else{
//					break;
//				}
//			}
//		}else{
//			for( i = 0; i < k; ++i ){
//				(*ppEditNode)[i].m_nIndex = i;
//				(*ppEditNode)[i].m_hWnd = phWndArr[i];
//			}
//			nRowNum = k;
//		}
//
//		delete [] phWndArr;
//	}
//	return nRowNum;

	//編集ウインドウ数を取得する。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -