📄 cdlgopenfile.cpp
字号:
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 + -