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

📄 cdlgopenfile.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		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 + -