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

📄 ceditapp.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//	$Id: CEditApp.cpp,v 1.41 2005/01/24 04:47:30 Administrator Exp $
/*!	@file
	@brief 常駐部
	
	タスクトレイアイコンの管理,タスクトレイメニューのアクション,
	MRU、キー割り当て、共通設定、編集ウィンドウの管理など

	@author Norio Nakatani
	@date 1998/05/13 新規作成
	@date 2001/06/03 N.Nakatani grep単語単位で検索を実装するときのためにコマンドラインオプションの処理追加
	$Revision: 1.41 $
*/
/*
	Copyright (C) 1998-2001, Norio Nakatani
	Copyright (C) 2001, stonee, jepro, genta, aroka, hor
	Copyright (C) 2002, MIK
	Copyright (C) 2003, MIK

	This source code is designed for sakura editor.
	Please contact the copyright holders to use this code for other purpose.
*/

#define ID_HOTKEY_TRAYMENU	0x1234

#include <windows.h>
#include <io.h>
#include "debug.h"
#include "CEditApp.h"
// #include "CEditView.h"		//Nov. 21, 2000 JEPROtest
// #include "CEditDoc.h"		//Nov. 21, 2000 JEPROtest
#include "CEditWnd.h"		//Nov. 21, 2000 JEPROtest
#include "CDlgAbout.h"		//Nov. 21, 2000 JEPROtest
// #include "CDlgTypeList.h"	//Nov. 21, 2000 JEPROtest
#include "sakura_rc.h"
#include "mymessage.h"
#include "CDlgOpenFile.h"
#include "global.h"
#include "etc_uty.h"
#include "CRunningTimer.h"
#include <htmlhelp.h>


/////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK CEditAppWndProc( HWND, UINT, WPARAM, LPARAM );


CEditApp*	g_m_pCEditApp;

//Stonee, 2001/03/21
//Stonee, 2001/07/01  多重起動された場合は前回のダイアログを前面に出すようにした。
void CEditApp::DoGrep()
{
//	CDlgGrep	cDlgGrep;	// Jul. 2, 2001 genta
	char*			pCmdLine;
	char*			pOpt;
//  	int				nDataLen;
	int				nRet;
	CMemory			cmWork1;
	CMemory			cmWork2;
	CMemory			cmWork3;

	/* Grep */
	/*Grepダイアログの初期化1 */
//	cDlgGrep.Create( m_hInstance, /*m_hWnd*/NULL );

	//Stonee, 2001/06/30
	//前回のダイアログがあれば前面に (suggested by genta)
	if ( ::IsWindow(m_cDlgGrep.m_hWnd) ){
		::OpenIcon(m_cDlgGrep.m_hWnd);
		::BringWindowToTop(m_cDlgGrep.m_hWnd);
		return;
	}

	strcpy( m_cDlgGrep.m_szText, m_pShareData->m_szSEARCHKEYArr[0] );

	/* Grepダイアログの表示 */
	nRet = m_cDlgGrep.DoModal( m_hInstance, /*m_hWnd*/NULL, "" );
//					MYTRACE( "nRet=%d\n", nRet );
	if( FALSE == nRet || m_hWnd == NULL ){
		return;
	}

//					MYTRACE( "cDlgGrep.m_szText  =[%s]\n", cDlgGrep.m_szText );
//					MYTRACE( "cDlgGrep.m_szFile  =[%s]\n", cDlgGrep.m_szFile );
//					MYTRACE( "cDlgGrep.m_szFolder=[%s]\n", cDlgGrep.m_szFolder );

	/*======= Grepの実行 =============*/
	/* Grep結果ウィンドウの表示 */

	pCmdLine = new char[1024];
	pOpt = new char[64];

	cmWork1.SetDataSz( m_cDlgGrep.m_szText );
	cmWork2.SetDataSz( m_cDlgGrep.m_szFile );
	cmWork3.SetDataSz( m_cDlgGrep.m_szFolder );
	cmWork1.Replace( "\"", "\"\"" );
	cmWork2.Replace( "\"", "\"\"" );
	cmWork3.Replace( "\"", "\"\"" );

	/*
	|| -GREPMODE -GKEY="1" -GFILE="*.*;*.c;*.h" -GFOLDER="c:\" -GCODE=0 -GOPT=S
	*/
	wsprintf( pCmdLine, "-GREPMODE -GKEY=\"%s\" -GFILE=\"%s\" -GFOLDER=\"%s\" -GCODE=%d",
		cmWork1.GetPtr(),
		cmWork2.GetPtr(),
		cmWork3.GetPtr(),
		m_cDlgGrep.m_nGrepCharSet
	);

	pOpt[0] = '\0';
	if( m_cDlgGrep.m_bSubFolder ){			/* サブフォルダからも検索する */
		strcat( pOpt, "S" );
	}

	if( m_cDlgGrep.m_bLoHiCase ){				/* 英大文字と英小文字を区別する */
		strcat( pOpt, "L" );
	}
	if( m_cDlgGrep.m_bRegularExp ){			/* 正規表現 */
		strcat( pOpt, "R" );
	}
//	2002/09/20 Moca 文字コードセットオプションに統合
//	if( m_cDlgGrep.m_bKanjiCode_AutoDetect ){	/* 文字コード自動判別 */
//		strcat( pOpt, "K" );
//	}
	if( m_cDlgGrep.m_bGrepOutputLine ){		/* 行を出力するか該当部分だけ出力するか */
		strcat( pOpt, "P" );
	}
	if( m_cDlgGrep.m_bWordOnly ){				/* 単語単位で探す */
		strcat( pOpt, "W" );
	}
	if( 1 == m_cDlgGrep.m_nGrepOutputStyle ){	/* Grep: 出力形式 */
		strcat( pOpt, "1" );
	}
	if( 2 == m_cDlgGrep.m_nGrepOutputStyle ){	/* Grep: 出力形式 */
		strcat( pOpt, "2" );
	}


	if( 0 < lstrlen( pOpt ) ){
		strcat( pCmdLine, " -GOPT=" );
		strcat( pCmdLine, pOpt );
	}

	/* 新規編集ウィンドウの追加 ver 0 */
	CEditApp::OpenNewEditor( m_hInstance, m_pShareData->m_hwndTray, pCmdLine, 0, FALSE );

	delete [] pCmdLine;
	delete [] pOpt;
}

//	BOOL CALLBACK ExitingDlgProc(
//	  HWND hwndDlg,	// handle to dialog box
//	  UINT uMsg,	// message
//	  WPARAM wParam,// first message parameter
//	  LPARAM lParam	// second message parameter
//	)
//	{
//		switch( uMsg ){
//		case WM_INITDIALOG:
//			return TRUE;
//		}
//		return FALSE;
//	}


/* ウィンドウプロシージャじゃ */
LRESULT CALLBACK CEditAppWndProc(
	HWND	hwnd,	// handle of window
	UINT	uMsg,	// message identifier
	WPARAM	wParam,	// first message parameter
	LPARAM	lParam 	// second message parameter
)
{
	CEditApp* pSApp;
	switch( uMsg ){
	case WM_CREATE:
		pSApp = ( CEditApp* )g_m_pCEditApp;
		return pSApp->DispatchEvent( hwnd, uMsg, wParam, lParam );
	default:
		// Modified by KEITA for WIN64 2003.9.6
		pSApp = ( CEditApp* )::GetWindowLongPtr( hwnd, GWLP_USERDATA );
		if( NULL != pSApp ){
			return pSApp->DispatchEvent( hwnd, uMsg, wParam, lParam );
		}
		return ::DefWindowProc( hwnd, uMsg, wParam, lParam );
	}
}




/////////////////////////////////////////////////////////////////////////////
// CEditApp
//	@date 2002.2.17 YAZAKI CShareDataのインスタンスは、CProcessにひとつあるのみ。
CEditApp::CEditApp() :
	//	Apr. 24, 2001 genta
	m_uCreateTaskBarMsg( ::RegisterWindowMessage( TEXT("TaskbarCreated") ) ),
	m_bCreatedTrayIcon( FALSE ),	//トレイにアイコンを作った
	m_hInstance( NULL ),
	m_hWnd( NULL )
{
	/* 共有データ構造体のアドレスを返す */
	m_pShareData = CShareData::getInstance()->GetShareData();
	if( m_pShareData->m_hAccel != NULL ){
		::DestroyAcceleratorTable( m_pShareData->m_hAccel );
		m_pShareData->m_hAccel = NULL;
	}
	m_pShareData->m_hAccel =
		CKeyBind::CreateAccerelator(
			m_pShareData->m_nKeyNameArrNum,
			m_pShareData->m_pKeyNameArr
		);
	if( NULL == m_pShareData->m_hAccel ){
		::MessageBox( NULL, "CEditApp::CEditApp()\nアクセラレータ テーブルが作成できません。\nシステムリソースが不足しています。", GSTR_APPNAME, MB_OK | MB_ICONSTOP );
	}

//	#ifdef _DEBUG
//		m_pszAppName = "CEditApp[デバッグバージョン]";
//	#endif
//	#ifndef _DEBUG
		m_pszAppName = GSTR_CEDITAPP;
//	#endif

	m_bUseTrayMenu = false;

	return;
}


CEditApp::~CEditApp()
{
//	if( NULL != m_pEditArr ){
//		free( m_pEditArr );
//		m_pEditArr = NULL;
//		m_nEditArrNum = 0;
//	}
	return;
}

/////////////////////////////////////////////////////////////////////////////
// CEditApp メンバ関数




/* 作成 */
HWND CEditApp::Create( HINSTANCE hInstance )
{
	MY_RUNNINGTIMER( cRunningTimer, "CEditApp::Create" );

	WNDCLASS	wc;
//	HANDLE		hMutex;
//	HWND		hWnd;
//	MSG			msg;
	ATOM		atom;
//	char		szMutexName[260];
//	HICON		hIcon;
//	HACCEL		hAccel;
//	int			nRet;
	HWND		hwndWork;
//	const char *pszTitle="sakura new UR1.2.20.0";	//Nov. 12, 2000 JEPROtestnow トレイにバージョンが表示されなくなってしまったので修正してみたが失敗
//	const char *pszTips	="sakura tipsUR1.2.20.0";	//Nov. 12, 2000 JEPROtestnow トレイにバージョンが表示されなくなってしまったので修正してみたが失敗

	m_hInstance = hInstance;
	hwndWork = ::FindWindow( m_pszAppName, m_pszAppName );
	if( NULL != hwndWork ){
		return NULL;
	}



//	wsprintf( szMutexName, "%sIsAlreadyExist", m_pszAppName );
//	hMutex = CreateMutex( NULL, TRUE, szMutexName );
//	if( ERROR_ALREADY_EXISTS != GetLastError() ){
		wc.style			=	CS_HREDRAW |
								CS_VREDRAW |
								CS_DBLCLKS |
								CS_BYTEALIGNCLIENT |
								CS_BYTEALIGNWINDOW;
		wc.lpfnWndProc		= CEditAppWndProc;
		wc.cbClsExtra		= 0;
		wc.cbWndExtra		= 0;
		wc.hInstance		= m_hInstance;
		wc.hIcon			= LoadIcon( NULL, IDI_APPLICATION );
		wc.hCursor			= LoadCursor( NULL, IDC_ARROW );
		wc.hbrBackground	= (HBRUSH)(COLOR_WINDOW + 1);
		wc.lpszMenuName		= NULL;
		wc.lpszClassName	= m_pszAppName;
		atom = RegisterClass( &wc );
		if( 0 == atom ){
			::MessageBox( NULL, "CEditApp::Create()\nウィンドウクラスを登録できませんでした。",
					GSTR_APPNAME, MB_OK | MB_ICONSTOP );
		}
//	}else{
//		return NULL;
//	}
	g_m_pCEditApp = this;

	/*hWnd =*/ ::CreateWindow(
		m_pszAppName,						// pointer to registered class name
//		pszTitle,							// pointer to registered class name	//Nov. 12, 2000 JEPROtestnow トレイにバージョンが表示されなくなってしまったので修正してみたが失敗
		m_pszAppName,						// pointer to window name
//		pszTips,							// pointer to window name			//Nov. 12, 2000 JEPROtestnow トレイにバージョンが表示されなくなってしまったので修正してみたが失敗
		WS_OVERLAPPEDWINDOW/*WS_VISIBLE *//*| WS_CHILD *//* | WS_CLIPCHILDREN*/	,	// window style
		CW_USEDEFAULT,						// horizontal position of window
		0,									// vertical position of window
		100,								// window width
		100,								// window height
		NULL,								// handle to parent or owner window
		NULL,								// handle to menu or child-window identifier
		m_hInstance,						// handle to application instance
		NULL								// pointer to window-creation data
	);
//	m_hWnd = hWnd;
//	MYMESSAGEBOX( "m_hWnd=%08xH \n", m_hWnd );
	MY_TRACETIME( cRunningTimer, "Window is created" );

	//	Oct. 16, 2000 genta
	m_hIcons.Create( m_hInstance, m_hWnd );
	
	MY_TRACETIME( cRunningTimer, "Icons are created" );
	
	m_CMenuDrawer.Create( m_hInstance, m_hWnd, &m_hIcons );

	if( NULL != m_hWnd ){
		CreateTrayIcon( m_hWnd );
	}else{
	}
//	::ShowWindow( m_hWnd, SW_SHOW );

	/* Windows アクセラレータの作成 */
//	m_CKeyBind.Create( m_hInstance );
//	m_hAccel = m_CKeyBind.CreateAccerelator();
	return m_hWnd;
}

//! タスクトレイにアイコンを登録する
bool CEditApp::CreateTrayIcon( HWND hWnd )
{
	HICON hIcon;
//		::SetWindowLongPtr( m_hWnd, GWLP_USERDATA, (LONG)this );
		/* タスクトレイのアイコンを作る */
		if( TRUE == m_pShareData->m_Common.m_bUseTaskTray ){	/* タスクトレイのアイコンを使う */
			//	Dec. 02, 2002 genta
			hIcon = GetAppIcon( m_hInstance, ICON_DEFAULT_APP, FN_APP_ICON, true );
//From Here Jan. 12, 2001 JEPRO トレイアイコンにポイントするとバージョンno.が表示されるように修正
//			TrayMessage( m_hWnd, NIM_ADD, 0,  hIcon, GSTR_APPNAME );
			/* バージョン情報 */
			//	UR version no.を設定 (cf. cDlgAbout.cpp)
			char	pszTips[64];
			//	2004.05.13 Moca バージョン番号は、プロセスごとに取得する
			DWORD dwVersionMS, dwVersionLS;
			GetAppVersionInfo( NULL, VS_VERSION_INFO,
				&dwVersionMS, &dwVersionLS );

			wsprintf( pszTips, "%s %d.%d.%d.%d",		//Jul. 06, 2001 jepro UR はもう付けなくなったのを忘れていた
				GSTR_APPNAME,
				HIWORD( dwVersionMS ),
				LOWORD( dwVersionMS ),
				HIWORD( dwVersionLS ),
				LOWORD( dwVersionLS )
			);
			TrayMessage( m_hWnd, NIM_ADD, 0,  hIcon, pszTips );
//To Here Jan. 12, 2001
			m_bCreatedTrayIcon = TRUE;	/* トレイにアイコンを作った */
		}
	return true;
}




/* メッセージループ */
void CEditApp::MessageLoop( void )
{
//複数プロセス版
	MSG	msg;
	int ret;
	
	//2004.02.17 Moca GetMessageのエラーチェック
	while ( m_hWnd != NULL && (ret = ::GetMessage(&msg, NULL, 0, 0 )) ){
		if( ret == -1 ){
			break;

⌨️ 快捷键说明

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