📄 cdlgopenfile.cpp
字号:
po.x = rc.right;
po.y = rc.bottom;
::ScreenToClient( hwndOpenDlg, &po );
rc.right = po.x;
rc.bottom = po.y;
hFont = (HFONT)::SendMessage( hdlg, WM_GETFONT, 0, 0 );
/* 最近開いたファイル コンボボックス初期値設定 */
// 2003.06.22 Moca m_ppszMRU がNULLの場合を考慮する
if( NULL != m_ppszMRU ){
for( i = 0; m_ppszMRU[i] != NULL; ++i ){
::SendMessage( hwndComboMRU, CB_ADDSTRING, 0, (LPARAM)m_ppszMRU[i] );
}
}
::SetWindowPos( hwndComboMRU, 0, rc.left, rc.top, rc.right - rc.left + 100, rc.bottom - rc.top, SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER );
/* 最近開いたフォルダ コンボボックス初期値設定 */
// 2003.06.22 Moca m_ppszOPENFOLDER がNULLの場合を考慮する
if( NULL != m_ppszOPENFOLDER ){
for( i = 0; m_ppszOPENFOLDER[i] != NULL; ++i ){
::SendMessage( hwndComboOPENFOLDER, CB_ADDSTRING, 0, (LPARAM)m_ppszOPENFOLDER[i] );
}
}
::SetWindowPos( hwndComboOPENFOLDER, 0, rc.left, rc.top, rc.right - rc.left + 100, rc.bottom - rc.top, SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER );
// ::SetWindowLong( hwndOpenDlg, DWLP_USER, (LONG)pcDlgOpenFile );
/* サイズボックス */
// m_hwndSizeBox = ::CreateWindowEx(
// WS_EX_CONTROLPARENT, /* no extended styles */
// "SCROLLBAR", /* scroll bar control class */
// (LPSTR) NULL, /* text for window title bar */
// WS_VISIBLE | WS_CHILD | SBS_SIZEBOX | SBS_SIZEGRIP, /* scroll bar styles */
// 0, /* horizontal position */
// 0, /* vertical position */
// 0, /* width of the scroll bar */
// 0, /* default height */
// hwndOpenDlg/*hdlg*/, /* handle of main window */
// (HMENU) NULL, /* no menu for a scroll bar */
// pcDlgOpenFile->m_hInstance, /* instance owning this window */
// (LPVOID) NULL /* pointer not needed */
// );
// ::ShowWindow( m_hwndSizeBox, SW_SHOW );
break;
case WM_DESTROY:
/* フック解除 */
// Modified by KEITA for WIN64 2003.9.6
::SetWindowLongPtr( hwndOpenDlg, GWLP_WNDPROC, (LONG_PTR) m_wpOpenDialogProc );
return FALSE;
case WM_NOTIFY:
idCtrl = (int) wParam;
pofn = (OFNOTIFY*) lParam;
// MYTRACE( "=========WM_NOTIFY=========\n" );
// MYTRACE( "pofn->hdr.hwndFrom=%xh\n", pofn->hdr.hwndFrom );
// MYTRACE( "pofn->hdr.idFrom=%xh(%d)\n", pofn->hdr.idFrom, pofn->hdr.idFrom );
// MYTRACE( "pofn->hdr.code=%xh(%d)\n", pofn->hdr.code, pofn->hdr.code );
switch( pofn->hdr.code ){
case CDN_FILEOK:
/* 文字コード選択コンボボックス 値を取得 */
nIdx = ::SendMessage( hwndComboCODES, CB_GETCURSEL, 0, 0 );
lRes = ::SendMessage( hwndComboCODES, CB_GETITEMDATA, nIdx, 0 );
// lRes = ::SendMessage( hwndComboCODES, CB_GETCURSEL, 0, 0 );
pcDlgOpenFile->m_nCharCode = lRes; /* 文字コード */
// Feb. 9, 2001 genta
if( pcDlgOpenFile->m_bUseEol ){
nIdx = ::SendMessage( hwndComboEOL, CB_GETCURSEL, 0, 0 );
lRes = ::SendMessage( hwndComboEOL, CB_GETITEMDATA, nIdx, 0 );
// lRes = ::SendMessage( hwndComboCODES, CB_GETCURSEL, 0, 0 );
pcDlgOpenFile->m_cEol = (enumEOLType)lRes; /* 文字コード */
}
// From Here Jul. 26, 2003 ryoji
// BOMチェックボックスの状態を取得
if( pcDlgOpenFile->m_bUseBom ){
lRes = ::SendMessage( hwndCheckBOM, BM_GETCHECK, 0, 0 );
pcDlgOpenFile->m_bBom = (lRes == BST_CHECKED); /* BOM */
}
// To Here Jul. 26, 2003 ryoji
// MYTRACE( "文字コード lRes=%d\n", lRes );
// MYTRACE( "pofn->hdr.code=CDN_FILEOK \n" );break;
break; /* CDN_FILEOK */
case CDN_FOLDERCHANGE :
// MYTRACE( "pofn->hdr.code=CDN_FOLDERCHANGE \n" );
lRes = ::SendMessage( hwndOpenDlg, CDM_GETFOLDERPATH, sizeof( szFolder ), (LPARAM)szFolder );
// MYTRACE( "\tlRes=%d\tszFolder=[%s]\n", lRes, szFolder );
break;
// case CDN_HELP : MYTRACE( "pofn->hdr.code=CDN_HELP \n" );break;
// case CDN_INITDONE : MYTRACE( "pofn->hdr.code=CDN_INITDONE \n" );break;
// case CDN_SELCHANGE : MYTRACE( "pofn->hdr.code=CDN_SELCHANGE \n" );break;
// case CDN_SHAREVIOLATION : MYTRACE( "pofn->hdr.code=CDN_SHAREVIOLATION\n" );break;
// case CDN_TYPECHANGE : MYTRACE( "pofn->hdr.code=CDN_TYPECHANGE \n" );break;
// default: MYTRACE( "pofn->hdr.code=???\n" );break;
// 2005/02/20 novice 拡張子を省略したら補完する(不要な処理)
#if 0
case CDN_TYPECHANGE: //@@@ 2002.1.24 YAZAKI 名前を付けて保存するときに「テキストファイル(*.txt)」を選択したら、拡張子txtを補うように変更
switch (pOf->nFilterIndex){
case 1:
pOf->lpstrDefExt = NULL;
break;
case 2:
pOf->lpstrDefExt = "txt";
break;
case 3:
pOf->lpstrDefExt = NULL;
break;
}
::SendMessage( hwndOpenDlg, CDM_SETDEFEXT, 0, (LPARAM)pOf->lpstrDefExt );
break;
#endif
}
// MYTRACE( "=======================\n" );
break;
case WM_COMMAND:
wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle of control
switch( wNotifyCode ){
case CBN_SELCHANGE:
switch( (int) LOWORD(wParam) ){
// From Here Jul. 26, 2003 ryoji
// 文字コードの変更をBOMチェックボックスに反映
case IDC_COMBO_CODE:
nIdx = ::SendMessage( (HWND) lParam, CB_GETCURSEL, 0, 0 );
lRes = ::SendMessage( (HWND) lParam, CB_GETITEMDATA, nIdx, 0 );
switch( lRes ){
case CODE_UNICODE:
case CODE_UTF8:
case CODE_UNICODEBE:
::EnableWindow( hwndCheckBOM, TRUE );
if (lRes == pcDlgOpenFile->m_nCharCode){
fCheck = pcDlgOpenFile->m_bBom? BST_CHECKED: BST_UNCHECKED;
}else{
fCheck = (lRes == CODE_UTF8)? BST_UNCHECKED: BST_CHECKED;
}
break;
default:
::EnableWindow( hwndCheckBOM, FALSE );
fCheck = BST_UNCHECKED;
break;
}
::SendMessage( hwndCheckBOM, BM_SETCHECK, fCheck, 0 );
break;
// To Here Jul. 26, 2003 ryoji
case IDC_COMBO_MRU:
nIdx = ::SendMessage( (HWND) lParam, CB_GETCURSEL, 0, 0 );
if( CB_ERR != ::SendMessage( (HWND) lParam, CB_GETLBTEXT, nIdx, (LPARAM) (LPCSTR)szWork ) ){
// MYTRACE( "szWork=%s\n", szWork );
lRes = ::SendMessage( hwndOpenDlg, CDM_SETCONTROLTEXT, edt1,(LPARAM)(LPSTR)szWork );
}
break;
case IDC_COMBO_OPENFOLDER:
nIdx = ::SendMessage( (HWND) lParam, CB_GETCURSEL, 0, 0 );
if( CB_ERR != ::SendMessage( (HWND) lParam, CB_GETLBTEXT, nIdx, (LPARAM) (LPCSTR)szWork ) ){
// MYTRACE( "szWork=%s\n", szWork );
lRes = ::SendMessage( hwndOpenDlg, CDM_SETCONTROLTEXT, edt1,(LPARAM)(LPSTR)szWork );
::PostMessage( ::GetDlgItem( hwndOpenDlg, edt1), WM_KEYDOWN, VK_RETURN, (LPARAM)0 );
}
break;
}
break; /* CBN_SELCHANGE */
}
break; /* WM_COMMAND */
//@@@ 2002.01.08 add start
case WM_HELP:
{
HELPINFO *p = (HELPINFO *)lParam;
::WinHelp( (HWND)p->hItemHandle, m_szHelpFile, HELP_WM_HELP, (ULONG_PTR)(LPVOID)p_helpids );
}
return TRUE;
//Context Menu
case WM_CONTEXTMENU:
::WinHelp( hdlg, m_szHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)p_helpids );
return TRUE;
//@@@ 2002.01.08 add end
default:
return FALSE;
}
return TRUE;
}
CDlgOpenFile::CDlgOpenFile()
{
/* メンバの初期化 */
long lPathLen;
char szFile[_MAX_PATH + 1];
// int nCharChars;
char szDrive[_MAX_DRIVE];
char szDir[_MAX_DIR];
m_nCharCode = CODE_AUTODETECT; /* 文字コード *//* 文字コード自動判別 */
m_hInstance = NULL; /* アプリケーションインスタンスのハンドル */
m_hwndParent = NULL; /* オーナーウィンドウのハンドル */
m_hWnd = NULL; /* このダイアログのハンドル */
/* 共有データ構造体のアドレスを返す */
m_pShareData = CShareData::getInstance()->GetShareData();
/* OPENFILENAMEの初期化 */
memset( &m_ofn, 0, sizeof( OPENFILENAME ) );
m_ofn.lStructSize = sizeof( OPENFILENAME );
m_ofn.nFilterIndex = 1; //Jul. 09, 2001 JEPRO /* 「開く」での最初のワイルドカード */
// ::GetCurrentDirectory( _MAX_PATH, m_szInitialDir ); /* 「開く」での初期ディレクトリ */
lPathLen = ::GetModuleFileName(
::GetModuleHandle( NULL ),
szFile, sizeof( szFile )
);
_splitpath( szFile, szDrive, szDir, NULL, NULL );
strcpy( m_szInitialDir, szDrive );
strcat( m_szInitialDir, szDir );
strcpy( m_szDefaultWildCard, "*.*" ); /*「開く」での最初のワイルドカード */
/* ヘルプファイルのフルパスを返す */
::GetHelpFilePath( m_szHelpFile );
m_nHelpTopicID = 0;
return;
}
CDlgOpenFile::~CDlgOpenFile()
{
return;
}
#if 0
/*! 初期化
DoModal_GetSaveFileName/DoModal_GetOpenFileName用
@author Moca
@date 2003.06.23
*/
void CDlgOpenFile::Create(
HINSTANCE hInstance,
HWND hwndParent,
const char* pszUserWildCard,
const char* pszDefaultPath
)
{
Create(
hInstance,
hwndParent,
pszUserWildCard,
pszDefaultPath,
NULL,
NULL
);
}
#endif
/* 初期化 */
void CDlgOpenFile::Create(
HINSTANCE hInstance,
HWND hwndParent,
const char* pszUserWildCard,
const char* pszDefaultPath,
const char** ppszMRU,
const char** ppszOPENFOLDER
)
{
m_hInstance = hInstance;
m_hwndParent = hwndParent;
/* ユーザー定義ワイルドカード */
if( NULL != pszUserWildCard ){
strcpy( m_szDefaultWildCard, pszUserWildCard );
}
/* 「開く」での初期フォルダ */
if( pszDefaultPath && 0 < lstrlen( pszDefaultPath ) ){ //現在編集中のファイルのパス //@@@ 2002.04.18
char szDrive[_MAX_DRIVE];
char szDir[_MAX_DIR];
// Jun. 23, 2002 genta
my_splitpath( pszDefaultPath, szDrive, szDir, NULL, NULL );
wsprintf( m_szInitialDir, "%s%s", szDrive, szDir );
}
m_ppszMRU = ppszMRU;
m_ppszOPENFOLDER = ppszOPENFOLDER;
return;
}
/*! 「開く」ダイアログ モーダルダイアログの表示
@param[in,out] pszPath 初期ファイル名.選択されたファイル名の格納場所
@param[in] bSetCurDir カレントディレクトリを変更するか デフォルト: false
@date 2002/08/21 カレントディレクトリを変更するかどうかのオプションを追加
@date 2003.05.12 MIK 拡張子フィルタでタイプ別設定の拡張子を使うように。
拡張子フィルタの管理をCFileExtクラスで行う。
@date 2005/02/20 novice 拡張子を省略したら補完する
*/
BOOL CDlgOpenFile::DoModal_GetOpenFileName( 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;
// From Here Jun. 23, 2002 genta
// 「開く」での初期フォルダチェック強化
// 2005/02/20 novice デフォルトのファイル名は何も設定しない
char szDrive[_MAX_DRIVE];
char szDir[_MAX_DIR];
char szName[_MAX_FNAME];
char szExt [_MAX_EXT];
// Jun. 23, 2002 Thanks to sui
my_splitpath( pszPath, szDrive, szDir, szName, szExt );
// 指定されたファイルが存在しないとき szName == NULL
// ファイルの場所にディレクトリを指定するとエラーになるので
// ファイルが無い場合は全く指定しないことにする.
if( szName[0] == '\0' ){
pszPath[0] = '\0';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -