📄 ceditapp.cpp
字号:
ppszOPENFOLDER = new char*[ cMRUFolder.Length() + 1 ];
cMRUFolder.GetPathList(ppszOPENFOLDER);
//Stonee, 2001/12/21 UNCであれば接続を試みる
NetConnect( cMRUFolder.GetPath( nId - IDM_SELOPENFOLDER ) );
/* ファイルオープンダイアログの初期化 */
strcpy( szPath, "" );
nCharCode = CODE_AUTODETECT; /* 文字コード自動判別 */
bReadOnly = FALSE;
cDlgOpenFile.Create(
m_hInstance,
NULL/*m_hWnd*/,
"*.*",
ppszOPENFOLDER[ nId - IDM_SELOPENFOLDER ],
(const char **)ppszMRU,
(const char **)ppszOPENFOLDER
);
if( !cDlgOpenFile.DoModalOpenDlg( szPath, &nCharCode, &bReadOnly ) ){
delete [] ppszMRU;
delete [] ppszOPENFOLDER;
break;
}
if( NULL == m_hWnd ){
delete [] ppszMRU;
delete [] ppszOPENFOLDER;
break;
}
delete [] ppszMRU;
delete [] ppszOPENFOLDER;
/* 指定ファイルが開かれているか調べる */
if( CShareData::getInstance()->IsPathOpened( szPath, &hWndOwner ) ){
::SendMessage( hWndOwner, MYWM_GETFILEINFO, 0, 0 );
pfi = (FileInfo*)&m_pShareData->m_FileInfo_MYWM_GETFILEINFO;
int nCharCodeNew;
if( CODE_AUTODETECT == nCharCode ){ /* 文字コード自動判別 */
/*
|| ファイルの日本語コードセット判別
||
|| 【戻り値】
|| SJIS 0
|| JIS 1
|| EUC 2
|| Unicode 3
|| エラー -1
*/
nCharCodeNew = CMemory::CheckKanjiCodeOfFile( szPath );
if( -1 == nCharCodeNew ){
}else{
nCharCode = nCharCodeNew;
}
}
if( nCharCode != pfi->m_nCharCode ){ /* 文字コード種別 */
char* pszCodeNameCur = "";
char* pszCodeNameNew = "";
// gm_pszCodeNameArr_1 を使うように変更 Moca. 2002/05/26
if( -1 < pfi->m_nCharCode && pfi->m_nCharCode < CODE_CODEMAX ){
pszCodeNameCur = (char*)gm_pszCodeNameArr_1[pfi->m_nCharCode];
}
if( -1 < nCharCode && nCharCode < CODE_CODEMAX ){
pszCodeNameNew = (char*)gm_pszCodeNameArr_1[nCharCode];
}
::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST, GSTR_APPNAME,
"%s\n\n既に開いているファイルを違う文字コードで開く場合は、\n一旦閉じてからでないと開けません。\n\n現在の文字コードセット=%s\n新しい文字コードセット=%s",
szPath, pszCodeNameCur, pszCodeNameNew
);
}
/* 開いているウィンドウをアクティブにする */
/* アクティブにする */
ActivateFrameWindow( hWndOwner );
// if( ::IsIconic( hWndOwner ) ){
// ::ShowWindow( hWndOwner, SW_RESTORE );
// }else{
// ::ShowWindow( hWndOwner, SW_SHOW );
// }
// ::SetForegroundWindow( hWndOwner );
// ::SetActiveWindow( hWndOwner );
}else{
if( strchr( szPath, ' ' ) ){
char szFile2[_MAX_PATH + 3];
wsprintf( szFile2, "\"%s\"", szPath );
strcpy( szPath, szFile2 );
}
/* 新たな編集ウィンドウを起動 */
CEditApp::OpenNewEditor( m_hInstance, m_hWnd, szPath, nCharCode, bReadOnly );
}
}
}else{
}
break;
}
return 0L;
case WM_LBUTTONDBLCLK:
// MYTRACE( "WM_LBUTTONDBLCLK\n" );
bLDClick = true; /* 03/02/20 ai */
/* 新規編集ウィンドウの追加 */
OnNewEditor();
// Apr. 1, 2003 genta この後で表示されたメニューは閉じる
::PostMessage( m_hWnd, WM_CANCELMODE, 0, 0 );
return 0L;
case WM_RBUTTONDBLCLK:
// MYTRACE( "WM_RBUTTONDBLCLK\n" );
return 0L;
}
break;
case WM_QUERYENDSESSION:
/* すべてのウィンドウを閉じる */ //Oct. 7, 2000 jepro 「編集ウィンドウの全終了」という説明を左記のように変更
if( CloseAllEditor() ){
// Jan. 31, 2000 genta
// この時点ではWindowsの終了が確定していないので常駐解除すべきではない.
// DestroyWindow( hwnd );
return TRUE;
}else{
return FALSE;
}
case WM_CLOSE:
/* すべてのウィンドウを閉じる */ //Oct. 7, 2000 jepro 「編集ウィンドウの全終了」という説明を左記のように変更
if( CloseAllEditor() ){
DestroyWindow( hwnd );
}
return 0L;
// From Here Jan. 31, 2000 genta Windows終了時の後処理.
// Windows終了時はWM_CLOSEが呼ばれない上,DestroyWindowを
// 呼び出す必要もない.また,メッセージループに戻らないので
// メッセージループの後ろの処理をここで完了させる必要がある.
case WM_ENDSESSION:
// もしWindowsの終了が中断されたのなら何もしない
if( wParam != TRUE ) return 0;
// ホットキーの破棄
::UnregisterHotKey( m_hWnd, ID_HOTKEY_TRAYMENU );
// どうせExplorerも終了するのでトレイアイコンは処理しない.
// 終了処理中に新しいウィンドウを作るのもいやな感じなので
// オプションに関わらず終了ダイアログの表示は行わない
// 共有データの保存(重要)
CShareData::getInstance()->SaveShareData();
return 0; // もうこのプロセスに制御が戻ることはない
// To Here Jan. 31, 2000 genta
case WM_DESTROY:
::UnregisterHotKey( m_hWnd, ID_HOTKEY_TRAYMENU );
// /* 終了ダイアログを表示する */
// if( TRUE == m_pShareData->m_Common.m_bDispExitingDialog ){
// /* 終了中ダイアログの表示 */
// hwndExitingDlg = ::CreateDialog(
// m_hInstance,
// MAKEINTRESOURCE( IDD_EXITING ),
// m_hWnd/*::GetDesktopWindow()*/,
// (DLGPROC)ExitingDlgProc
// );
// ::ShowWindow( hwndExitingDlg, SW_SHOW );
// }
//
// /* 共有データの保存 */
// m_cShareData.SaveShareData();
//
// /* 終了ダイアログを表示する */
// if( TRUE == m_pShareData->m_Common.m_bDispExitingDialog ){
// /* 終了中ダイアログの破棄 */
// ::DestroyWindow( hwndExitingDlg );
// }
if( m_bCreatedTrayIcon ){ /* トレイにアイコンを作った */
TrayMessage( hwnd, NIM_DELETE, 0, NULL, NULL );
}
m_hWnd = NULL;
/* Windows にスレッドの終了を要求します。*/
::PostQuitMessage( 0 );
return 0L;
default:
// << 20010412 by aroka
// Apr. 24, 2001 genta RegisterWindowMessageを使うように修正
if( uMsg == m_uCreateTaskBarMsg ){
/* TaskTray Iconの再登録を要求するメッセージ.
Explorerが再起動したときに送出される.*/
CreateTrayIcon( m_hWnd ) ;
}
break; /* default */
// >> by aroka
}
return DefWindowProc( hwnd, uMsg, wParam, lParam );
}
/* WM_COMMANDメッセージ処理 */
void CEditApp::OnCommand( WORD wNotifyCode, WORD wID , HWND hwndCtl )
{
switch( wNotifyCode ){
/* メニューからのメッセージ */
case 0:
break;
}
return;
}
/*!
@brief 新規ウィンドウを作成する
タスクトレイからの新規作成の場合にはカレントディレクトリ=
保存時のデフォルトディレクトリを最後に使われたディレクトリとする.
ただし最後に使われたディレクトリが存在しない場合は次に使われたディレクトリとし,
順次存在するディレクトリが見つかるまで履歴を順に試す.
どの履歴も見つからなかった場合には現在のカレントディレクトリで作成する.
@author genta
@date 2003.05.30 新規作成
*/
void CEditApp::OnNewEditor(void)
{
const char* szCurDir = NULL;
// 最近使ったフォルダを順番にたどる
CMRUFolder mrufolder;
int nCount = mrufolder.Length();
for( int i = 0; i < nCount ; i++ ){
const char* recentdir = mrufolder.GetPath( i );
DWORD attr = GetFileAttributes( recentdir );
if( attr != -1 ){
if(( attr & FILE_ATTRIBUTE_DIRECTORY ) != 0 ){
szCurDir = recentdir;
break;
}
else {
// ::MYMESSAGEBOX( m_hWnd, MB_OK , GSTR_APPNAME,
// "Not directory: %d - %s", i, recentdir ? recentdir : NULL );
}
}
else {
// ::MYMESSAGEBOX( m_hWnd, MB_OK , GSTR_APPNAME,
// "Not found: %d - %s", i, recentdir ? recentdir : NULL );
}
}
OpenNewEditor( m_hInstance, m_hWnd, (char*)NULL, 0, FALSE, false, szCurDir );
}
/*! 新規編集ウィンドウの追加 ver 0
@param hInstance [in] インスタンスID (実は未使用)
@param hWndParent [in] 親ウィンドウハンドル.エラーメッセージ表示用
@param pszPath [in] 新規エディタで開くファイル名とオプション.NULLで新規エディタ作成.
@param nCharCode [in] 新規エディタの文字コード
@param bReadOnly [in] FALSEでなければ読みとり専用で開く
@param sync [in] trueなら新規エディタの起動まで待機する
@param szCurDir [in] 新規エディタのカレントディレクトリ
@date 2000.10.24 genta WinExec -> CreateProcess.同期機能を付加
@date 2002.02.17 YAZAKI CShareDataのインスタンスは、CProcessにひとつあるのみ。
@date 2003.05.30 genta 外部プロセス起動時のカレントディレクトリ指定を可能に.
*/
bool CEditApp::OpenNewEditor( HINSTANCE hInstance, HWND hWndParent, const char* pszPath, int nCharCode, BOOL bReadOnly, bool sync, const char* szCurDir )
{
DLLSHAREDATA* pShareData;
char szCmdLineBuf[1024]; // コマンドライン
char szEXE[MAX_PATH + 1]; // アプリケーションパス名
int nPos = 0; // コマンドライン構築用ポインタ
/* 共有データ構造体のアドレスを返す */
pShareData = CShareData::getInstance()->GetShareData();
/* 編集ウィンドウの上限チェック */
if( pShareData->m_nEditArrNum >= MAX_EDITWINDOWS ){ //最大値修正 //@@@ 2003.05.31 MIK
char szMsg[512];
wsprintf( szMsg, "編集ウィンドウ数の上限は%dです。\nこれ以上は同時に開けません。", MAX_EDITWINDOWS );
::MessageBox( NULL, szMsg, GSTR_APPNAME, MB_OK );
return false;
}
::GetModuleFileName( ::GetModuleHandle( NULL ), szEXE, sizeof( szEXE ) );
nPos += wsprintf( szCmdLineBuf + nPos, "\"%s\"", szEXE );
// ファイル名が指定されている場合
// コマンドライン引数が指定されているので,全体を""で囲んではいけない
if( pszPath != NULL ){
nPos += wsprintf( szCmdLineBuf + nPos, " %s", pszPath );
}
// コード指定がある場合
if( nCharCode != CODE_AUTODETECT ){
nPos += wsprintf( szCmdLineBuf + nPos, " -CODE=%d", nCharCode );
}
// 読み取り専用指定がある場合 //From Here Feb. 26, 2001 JEPRO 追加 (direcited by genta)
if( bReadOnly ){
nPos += wsprintf( szCmdLineBuf + nPos, " -R" );
} //To Here Feb. 26, 2001
//: do error check nPos
// DEBUG
// ::MessageBox( NULL, szCmdLineBuf, "OpenNewEditor", MB_OK );
// プロセスの起動
PROCESS_INFORMATION p;
STARTUPINFO s;
s.cb = sizeof( s );
s.lpReserved = NULL;
s.lpDesktop = NULL;
s.lpTitle = NULL;
/*
s.dwX = CW_USEDEFAULT;
s.dwY = CW_USEDEFAULT;
s.dwXSize = CW_USEDEFAULT;
s.dwYSize = CW_USEDEFAULT;
*/
s.dwFlags = STARTF_USESHOWWINDOW;
s.wShowWindow = SW_SHOWDEFAULT;
s.cbReserved2 = 0;
s.lpReserved2 = NULL;
// May 30, 2003 genta カレントディレクトリ指定を可能に
if( CreateProcess( szEXE, szCmdLineBuf, NULL, NULL, FALSE,
CREATE_DEFAULT_ERROR_MODE, NULL, szCurDir, &s, &p ) == 0 ){
// 失敗
LPVOID pMsg;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &pMsg,
0,
NULL
);
::MYMESSAGEBOX(
hWndParent,
MB_OK | MB_ICONSTOP,
GSTR_APPNAME,
"\'%s\'\nプロセスの起動に失敗しました。\n%s",
szEXE,
(char*)pMsg
);
::LocalFree( (HLOCAL)pMsg ); // エラーメッセージバッファを解放
return false;
}
if( sync ){
// 起動したプロセスが完全に立ち上がるまでちょっと待つ.
int nResult = WaitForInputIdle( p.hProcess, 10000 ); // 最大10秒間待つ
if( nResult != 0 ){
::MYMESSAGEBOX(
hWndParent,
MB_OK | MB_ICONSTOP,
GSTR_APPNAME,
"\'%s\'\nプロセスの起動に失敗しました。",
szEXE
);
CloseHandle( p.hThread );
CloseHandle( p.hProcess );
return false;
}
}
CloseHandle( p.hThread );
CloseHandle( p.hProcess );
return true;
}
/*! 新規編集ウィンドウの追加 ver 2:
@date Oct. 24, 2000 genta create.
*/
bool CEditApp::OpenNewEditor2( HINSTANCE hInstance, HWND hWndParent, const FileInfo* pfi, BOOL bReadOnly, bool sync )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -