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

📄 cdlgopenfile.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	else {
		wsprintf( pszPath, "%s%s%s%s", szDrive, szDir, szName, szExt );
	}
	m_ofn.lpstrFile = pszPath;
	// To Here Jun. 23, 2002 genta
	m_ofn.nMaxFile = _MAX_PATH;
	m_ofn.lpstrFileTitle = NULL;
	m_ofn.nMaxFileTitle = 0;
	m_ofn.lpstrInitialDir = m_szInitialDir;
	m_ofn.lpstrTitle = NULL;
//	m_ofn.Flags =
//		/*OFN_CREATEPROMPT |*/ OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY
//		/* | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK */
	m_ofn.Flags =
		/*OFN_CREATEPROMPT |*/ OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY
		/* | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK */
		;
	m_ofn.nFileOffset = 0;
	m_ofn.nFileExtension = 0;
// 2005/02/20 novice 拡張子を省略したら補完する
	m_ofn.lpstrDefExt = "";
	m_ofn.lCustData = (LPARAM)this;
	m_ofn.lpfnHook = OFNHookProc;
	m_ofn.lpTemplateName = "IDD_FILEOPEN";
	if( ::GetOpenFileName( &m_ofn ) ){
		// 変わってしまった可能性のあるカレントディレクトリを元に戻す
		if( bGetCurDirSuc ){
			::SetCurrentDirectory( szCurDir );
		}
		return TRUE;
	}else{
		//	May 29, 2004 genta 関数にまとめた
		DlgOpenFail();
		return FALSE;
	}
}


/*! 保存ダイアログ モーダルダイアログの表示
	@param pszPath [i/o] 初期ファイル名.選択されたファイル名の格納場所
	@param bSetCurDir [in] カレントディレクトリを変更するか デフォルト: false
	@date 2002/08/21 カレントディレクトリを変更するかどうかのオプションを追加
	@date 2003.05.12 MIK 拡張子フィルタでタイプ別設定の拡張子を使うように。
		拡張子フィルタの管理をCFileExtクラスで行う。
	@date 2005/02/20 novice 拡張子を省略したら補完する
*/
BOOL CDlgOpenFile::DoModal_GetSaveFileName( char* pszPath, bool bSetCurDir )
{
	TCHAR	szCurDir[_MAX_PATH];
	bool	bGetCurDirSuc = false;
	if( false == bSetCurDir ){
		int nRetVal;
		nRetVal = ::GetCurrentDirectory( _MAX_PATH, szCurDir );
		if( 0 < nRetVal && _MAX_PATH > nRetVal ){
			bGetCurDirSuc = true;
		}
	}

	//	2003.05.12 MIK
	CFileExt	cFileExt;
	cFileExt.AppendExtRaw( "ユーザー指定",     m_szDefaultWildCard );
	cFileExt.AppendExtRaw( "テキストファイル", "*.txt" );
	cFileExt.AppendExtRaw( "すべてのファイル", "*.*" );

	/* 構造体の初期化 */
	m_ofn.lStructSize = sizeof( OPENFILENAME );
	m_ofn.hwndOwner = m_hwndParent;
	m_ofn.hInstance = m_hInstance;
	m_ofn.lpstrFilter = cFileExt.GetExtFilter();
	m_ofn.lpstrCustomFilter = NULL;
	m_ofn.nMaxCustFilter = 0;
// 2005/02/20 novice デフォルトのファイル名は何も設定しない
	m_ofn.lpstrFile = pszPath;
	m_ofn.nMaxFile = _MAX_PATH;
	m_ofn.lpstrFileTitle = NULL;
	m_ofn.nMaxFileTitle = 0;
	m_ofn.lpstrInitialDir = m_szInitialDir;
	m_ofn.lpstrTitle = NULL;
//	m_ofn.Flags =
//		/*OFN_CREATEPROMPT |*/ OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY
//		/* | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK */
//	m_ofn.Flags =
//		/*OFN_CREATEPROMPT |*/ OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY
//		/* | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK */
//		;
	m_ofn.Flags =
		OFN_CREATEPROMPT | OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
		 /*| OFN_ENABLETEMPLATE | OFN_ENABLEHOOK*/;
	m_ofn.nFileOffset = 0;
	m_ofn.nFileExtension = 0;
// 2005/02/20 novice 拡張子を省略したら補完する
	m_ofn.lpstrDefExt = "";
	m_ofn.lCustData = (LPARAM)this;
	m_ofn.lpfnHook = OFNHookProc;
	m_ofn.lpTemplateName = "IDD_FILEOPEN";
	if( ::GetSaveFileName( &m_ofn ) ){
		// 変わってしまった可能性のあるカレントディレクトリを元に戻す
		if( bGetCurDirSuc ){
			::SetCurrentDirectory( szCurDir );
		}
		return TRUE;
	}else{
		//	May 29, 2004 genta 関数にまとめた
		DlgOpenFail();
		return FALSE;
	}
}





/*! 「開く」ダイアログ モーダルダイアログの表示
	@date 2003.05.12 MIK 拡張子フィルタでタイプ別設定の拡張子を使うように。
		拡張子フィルタの管理をCFileExtクラスで行う。
	@date 2005/02/20 novice 拡張子を省略したら補完する
*/
BOOL CDlgOpenFile::DoModalOpenDlg( char* pszPath, int* pnCharCode, BOOL* pbReadOnly )
{
	m_bIsSaveDialog = FALSE;	/* 保存のダイアログか */

	int		i;

	//	2003.05.12 MIK
	CFileExt	cFileExt;
	cFileExt.AppendExtRaw( "すべてのファイル", "*.*" );
	cFileExt.AppendExtRaw( "テキストファイル", "*.txt" );
	for( i = 0; i < MAX_TYPES; i++ )
	{
		cFileExt.AppendExt( m_pShareData->m_Types[i].m_szTypeName, m_pShareData->m_Types[i].m_szTypeExts );
	}

	/* 構造体の初期化 */
	m_ofn.lStructSize = sizeof( OPENFILENAME );
	m_ofn.hwndOwner = m_hwndParent;
	m_ofn.hInstance = m_hInstance;
	m_ofn.lpstrFilter = cFileExt.GetExtFilter();
	m_ofn.lpstrCustomFilter = NULL;
	m_ofn.nMaxCustFilter = 0;
// 2005/02/20 novice デフォルトのファイル名は何も設定しない
	m_ofn.lpstrFile = pszPath;
	m_ofn.nMaxFile = _MAX_PATH;
	m_ofn.lpstrFileTitle = NULL;
	m_ofn.nMaxFileTitle = 0;
	m_ofn.lpstrInitialDir = m_szInitialDir;
	m_ofn.lpstrTitle = NULL;
//	m_ofn.Flags =
//		/*OFN_CREATEPROMPT |*/ OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY
//		/* | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK */
	m_ofn.Flags =
		/*OFN_CREATEPROMPT |*/ OFN_EXPLORER | OFN_CREATEPROMPT | OFN_FILEMUSTEXIST  /*| OFN_HIDEREADONLY*/
		 | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK /*| OFN_READONLY*/ | OFN_SHOWHELP | OFN_ENABLESIZING /*| OFN_ALLOWMULTISELECT*/
		;
	if( NULL != pbReadOnly ){
		m_bReadOnly = *pbReadOnly;
		if( TRUE == *pbReadOnly ){
			m_ofn.Flags |= OFN_READONLY;
		}
	}
	m_ofn.nFileOffset = 0;
	m_ofn.nFileExtension = 0;
// 2005/02/20 novice 拡張子を省略したら補完する
	m_ofn.lpstrDefExt = "";
	m_ofn.lCustData = (LPARAM)this;
	m_ofn.lpfnHook = OFNHookProc;
	m_ofn.lpTemplateName = "IDD_FILEOPEN";
//	m_ofn.lpTemplateName = MAKEINTRESOURCE( 149 );

	m_nCharCode = CODE_AUTODETECT;	/* 文字コード自動判別 */
	//Stonee, 2001/05/18 機能番号からヘルプトピック番号を調べるようにした
	m_nHelpTopicID = ::FuncID_To_HelpContextID(F_FILEOPEN);
	m_bUseEol = false;	//	Feb. 9, 2001 genta
	m_bUseBom = false;	//	Jul. 26, 2003 ryoji
	// 2002/08/22 カレントディレクトリを保存
	TCHAR	szCurDir[_MAX_PATH];
	bool	bGetCurDirSuc = false;
	int nRetVal;
	nRetVal = ::GetCurrentDirectory( _MAX_PATH, szCurDir );
	if( 0 < nRetVal && _MAX_PATH > nRetVal ){
		bGetCurDirSuc = true;
	}


	if( ::GetOpenFileName( &m_ofn ) ){

//		MYTRACE( "m_nCharCode = %d\n", m_nCharCode );	/* 文字コード */

		if( NULL != pnCharCode ){
			*pnCharCode = m_nCharCode;
		}
		if( NULL != pbReadOnly ){
			*pbReadOnly = m_bReadOnly;
		}
		if( bGetCurDirSuc ){
			::SetCurrentDirectory( szCurDir );
		}
		return TRUE;
	}else{
		//	May 29, 2004 genta 関数にまとめた
		DlgOpenFail();
		return FALSE;
	}
}

/*! 保存ダイアログ モーダルダイアログの表示

	@param pszPath [out]	取得したパス名
	@param pnCharCode [out]	文字コード
	@param pcEol [out]		改行コード
	@param pbBom [out]		BOM

	@date 2003.05.12 MIK 拡張子フィルタでタイプ別設定の拡張子を使うように。
		拡張子フィルタの管理をCFileExtクラスで行う。
	@date 2003.07.26 ryoji BOMパラメータ追加
	@date 2005/02/20 novice 拡張子を省略したら補完する
*/
BOOL CDlgOpenFile::DoModalSaveDlg( char* pszPath, int* pnCharCode, CEOL* pcEol, BOOL* pbBom )
{
	m_bIsSaveDialog = TRUE;	/* 保存のダイアログか */

	//	2003.05.12 MIK
	CFileExt	cFileExt;
	cFileExt.AppendExtRaw( "ユーザー指定",     m_szDefaultWildCard );
	cFileExt.AppendExtRaw( "テキストファイル", "*.txt" );
	cFileExt.AppendExtRaw( "すべてのファイル", "*.*" );

	/* 構造体の初期化 */
	m_ofn.lStructSize = sizeof( OPENFILENAME );
	m_ofn.hwndOwner = m_hwndParent;
	m_ofn.hInstance = m_hInstance;
	m_ofn.lpstrFilter = cFileExt.GetExtFilter();
	m_ofn.lpstrCustomFilter = NULL;
	m_ofn.nMaxCustFilter = 0;
// 2005/02/20 novice デフォルトのファイル名は何も設定しない
	m_ofn.lpstrFile = pszPath;
	m_ofn.nMaxFile = _MAX_PATH;
	m_ofn.lpstrFileTitle = NULL;
	m_ofn.nMaxFileTitle = 0;
	m_ofn.lpstrInitialDir = m_szInitialDir;
	m_ofn.lpstrTitle = NULL;
//	m_ofn.Flags =
//		/*OFN_CREATEPROMPT |*/ OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY
//		/* | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK */
	m_ofn.Flags =
		OFN_CREATEPROMPT | OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
		 /*| OFN_ENABLETEMPLATE | OFN_ENABLEHOOK*/ | OFN_SHOWHELP | OFN_ENABLESIZING;
	if( NULL != pnCharCode || NULL != pcEol ){
		m_ofn.Flags = m_ofn.Flags | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
	}
	m_ofn.nFileOffset = 0;
	m_ofn.nFileExtension = 0;
// 2005/02/20 novice 拡張子を省略したら補完する
	m_ofn.lpstrDefExt = "";
	m_ofn.lCustData = (LPARAM)this;
	m_ofn.lpfnHook = OFNHookProc;
	m_ofn.lpTemplateName = "IDD_FILEOPEN";

	// 2002/08/22 カレントディレクトリを保存
	TCHAR	szCurDir[_MAX_PATH];
	bool	bGetCurDirSuc = false;
	int nRetVal;
	nRetVal = ::GetCurrentDirectory( _MAX_PATH, szCurDir );
	if( 0 < nRetVal && _MAX_PATH > nRetVal ){
		bGetCurDirSuc = true;
	}

	if( NULL != pnCharCode ){
		m_nCharCode = *pnCharCode;
	}
	//	From Here Feb. 9, 2001 genta
	if( NULL != pcEol ){
		m_cEol = EOL_NONE;	//	初期値は「改行コードを保存」に固定
		m_bUseEol = true;
	}
	else{
		m_bUseEol = false;
	}
	//	To Here Feb. 9, 2001 genta
	//	Jul. 26, 2003 ryoji BOM設定
	if( NULL != pbBom ){
		m_bBom = *pbBom;
		m_bUseBom = true;
	}
	else{
		m_bUseBom = false;
	}

	m_nHelpTopicID = ::FuncID_To_HelpContextID(F_FILESAVEAS_DIALOG);	//Stonee, 2001/05/18 機能番号からヘルプトピック番号を調べるようにした
	if( ::GetSaveFileName( &m_ofn ) ){

//		MYTRACE( "m_nCharCode = %d\n", m_nCharCode );	/* 文字コード */

		if( NULL != pnCharCode ){
			*pnCharCode = m_nCharCode;
		}
		//	Feb. 9, 2001 genta
		if( m_bUseEol ){
			*pcEol = m_cEol;
		}
		//	Jul. 26, 2003 ryoji BOM設定
		if( m_bUseBom ){
			*pbBom = m_bBom;
		}
		if( bGetCurDirSuc ){
			::SetCurrentDirectory( szCurDir );
		}
		return TRUE;
	}else{
		//	May 29, 2004 genta 関数にまとめた
		DlgOpenFail();
		return FALSE;
	}
}

/*! @brief コモンダイアログボックス失敗処理

	コモンダイアログボックスからFALSEが返された場合に
	エラー原因を調べてエラーならメッセージを出す.
	
	@author genta
	@date 2004.05.29 genta 元々あった部分をまとめた
*/
void CDlgOpenFile::DlgOpenFail(void)
{
	const char*	pszError;
	DWORD dwError = ::CommDlgExtendedError();
	if( dwError == 0 ){
		//	ユーザキャンセルによる
		return;
	}
	
	switch( dwError ){
	case CDERR_DIALOGFAILURE  : pszError = "CDERR_DIALOGFAILURE  "; break;
	case CDERR_FINDRESFAILURE : pszError = "CDERR_FINDRESFAILURE "; break;
	case CDERR_NOHINSTANCE    : pszError = "CDERR_NOHINSTANCE    "; break;
	case CDERR_INITIALIZATION : pszError = "CDERR_INITIALIZATION "; break;
	case CDERR_NOHOOK         : pszError = "CDERR_NOHOOK         "; break;
	case CDERR_LOCKRESFAILURE : pszError = "CDERR_LOCKRESFAILURE "; break;
	case CDERR_NOTEMPLATE     : pszError = "CDERR_NOTEMPLATE     "; break;
	case CDERR_LOADRESFAILURE : pszError = "CDERR_LOADRESFAILURE "; break;
	case CDERR_STRUCTSIZE     : pszError = "CDERR_STRUCTSIZE     "; break;
	case CDERR_LOADSTRFAILURE : pszError = "CDERR_LOADSTRFAILURE "; break;
	case FNERR_BUFFERTOOSMALL : pszError = "FNERR_BUFFERTOOSMALL "; break;
	case CDERR_MEMALLOCFAILURE: pszError = "CDERR_MEMALLOCFAILURE"; break;
	case FNERR_INVALIDFILENAME: pszError = "FNERR_INVALIDFILENAME"; break;
	case CDERR_MEMLOCKFAILURE : pszError = "CDERR_MEMLOCKFAILURE "; break;
	case FNERR_SUBCLASSFAILURE: pszError = "FNERR_SUBCLASSFAILURE"; break;
	default: pszError = "UNKNOWN_ERRORCODE"; break;
	}

	::MessageBeep( MB_ICONSTOP );
	::MYMESSAGEBOX( m_hwndParent, MB_OK | MB_ICONSTOP | MB_TOPMOST, GSTR_APPNAME,
		"ダイアログが開けません。\n\nエラー:%s", pszError
	);
}

/*[EOF]*/

⌨️ 快捷键说明

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