Sample2

[ダイアログ関係]


//--------------------------------------------------------------------------------
//
//【フォルダ選択ダイアログの実装】
//
#include "winnetwk.h"
#include "shlobj.h"

//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
void OnTest(HWND hWnd)
{
	char szFolder[MAX_PATH] ;

	if(GetOpenFolderName(hWnd, "c:\\", szFolder, MAX_PATH) == IDOK){
		MessageBox(hWnd, szFolder, "選択されたフォルダ", MB_OK) ;
	}
}
/////////////////////////////////////////////////////////////////////////////
// フォルダ選択ダイアログの起動

UINT GetOpenFolderName(HWND hWnd, LPCTSTR lpszDefaultFolder, LPTSTR lpszBuffer, DWORD dwBufferSize)
{
	BROWSEINFO bi ;
	ITEMIDLIST* pidl ;
	char szSelectedFolder[MAX_PATH] ;

	ZeroMemory(&bi, sizeof(BROWSEINFO)) ;
	bi.hwndOwner = hWnd ;
	// コールバック関数を指定
	bi.lpfn = SHBrowseProc ;
	// デフォルトで選択させておくフォルダを指定
	bi.lParam = (LPARAM)lpszDefaultFolder ;
	// タイトルの指定
	bi.lpszTitle = "フォルダを選択してください" ;
	// フォルダダイアログの起動
	pidl = SHBrowseForFolder(&bi) ;
	if(pidl){
		// 選択されたフォルダ名を取得
		SHGetPathFromIDList(pidl, szSelectedFolder) ;
		_SHFree(pidl) ;
		if((DWORD)lstrlen(szSelectedFolder) < dwBufferSize)
			lstrcpy(lpszBuffer, szSelectedFolder) ;
		// フォルダが選択された
		return IDOK ;
	}
	// フォルダは選択されなかった
	return IDCANCEL ;
}
/////////////////////////////////////////////////////////////////////////////
// SHBrowseForFolder()用コールバック関数

int CALLBACK SHBrowseProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
	if(uMsg == BFFM_INITIALIZED && lpData){
		// デフォルトで選択させるパスの指定
		SendMessage(hWnd, BFFM_SETSELECTION, TRUE, lpData) ;
	}
	return 0 ;
}

//(SDK)
/////////////////////////////////////////////////////////////////////////////
// システムが確保したITEMIDLISTを開放しなければならない

void _SHFree(ITEMIDLIST* pidl)
{
	IMalloc *pMalloc ;
	SHGetMalloc(&pMalloc) ;
	if(pMalloc){
		pMalloc->lpVtbl->Free(pm,pidl) ;
		pMalloc->lpVtbl->Release(pm) ;
	}
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
// システムが確保したITEMIDLISTを開放しなければならない

void _SHFree(ITEMIDLIST* pidl)
{
	IMalloc* pMalloc ;
	SHGetMalloc(&pMalloc) ;
	if(pMalloc){
		pMalloc->Free(pidl) ;
		pMalloc->Release() ;
	}
}

//--------------------------------------------------------------------------------
//
//【フォーマットダイアログの出し方】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
// GetProcAddress()用の関数型宣言
typedef DWORD(FAR PASCAL *SHFORMATDRIVE)(HWND hWnd, UINT drive, UINT fmtID, UINT options) ;

/////////////////////////////////////////////////////////////////////////////
void DoFormatDialog(HWND hWnd, int nDriveNum, int nFormatMode)
{
	SHFORMATDRIVE func_SHFormatDrive ;

	HINSTANCE hinstDll = LoadLibrary("Shell32.DLL") ;
	func_SHFormatDrive = (SHFORMATDRIVE)GetProcAddress(hinstDll, "SHFormatDrive") ;
	
	func_SHFormatDrive(hWnd,		// フォーマットダイアログの親ウィンドウハンドル
						nDriveNum,	// A=0, B=1,...
						0xffff,		// SHFMT_ID_DEFAULT
						nFormatMode) ;
	// nFormatModeの値(95の時) |(NT4.0の時)
	//  0 = クイックフォーマット |0 = 通常フォーマット
	//  1 = 通常フォーマット   |1 = クイックフォーマット
	//  2 = 起動専用       |

	// DLLを開放
	FreeLibrary(hinstDll) ;
}
//--------------------------------------------------------------------------------
//
//【コモンダイアログの表示位置変更】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
void OnTest(HWND hWnd)
{
	OPENFILENAME ofn ;
	char szFileName[MAX_PATH] ;

	szFileName[0] = '\0' ;

	ZeroMemory((LPVOID)&ofn, sizeof(OPENFILENAME)) ;
	ofn.lStructSize = sizeof(OPENFILENAME) ;
	ofn.hwndOwner = hWnd ;
	ofn.lpstrFilter = "全てのファイル(*.*)\0*.*\0\0" ;
	ofn.lpstrFileTitle = szFileName ;
	ofn.nMaxFileTitle = MAX_PATH ;
	ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ENABLEHOOK ;
	ofn.lpfnHook = OFNHookProc ;
	
	// ファイルダイアログの起動
	GetOpenFileName(&ofn) ;
}
/////////////////////////////////////////////////////////////////////////////
// ファイルダイアログ用コールバック関数

UINT CALLBACK OFNHookProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{
	switch(message){
		case WM_NOTIFY :
			OFNOTIFY* lpof = (OFNOTIFY*)lParam ;

			if(lpof->hdr.code == CDN_SELCHANGE){
				// ファイルが選択される度にダイアログが右へ移動する
				RECT rcWindow ;
				GetWindowRect(GetParent(hDlg), &rcWindow) ;
				SetWindowPos(GetParent(hDlg),
								HWND_TOP,
								rcWindow.left+10,
								rcWindow.top,
								-1,
								-1,
								SWP_NOSIZE) ;
				return TRUE ;
			}
			break ;
		default :
			break ;
	}
	return FALSE ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
void CTestWnd::OnTest() 
{
	CTestFileDialog	dlg(TRUE,
						"",
						"",
						OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
						"全てのファイル(*.*)|*.*||",
						this) ;

	// ファイルダイアログの起動
	dlg.DoModal() ;
}
/////////////////////////////////////////////////////////////////////////////
// CTestFileDialogはCFileDialogの派生クラス
// 手動で追加したOnNotify()関数

BOOL CTestFileDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
	OFNOTIFY* lpof = (OFNOTIFY*)lParam ;

	if(lpof->hdr.code == CDN_SELCHANGE){
		// ファイルが選択される度にダイアログが右へ移動する
		CRect rcWindow ;
		GetParent()->GetWindowRect(rcWindow) ;
		GetParent()->SetWindowPos(&wndTop,
									rcWindow.left+10,
									rcWindow.top, 
									-1,
									-1,
									SWP_NOSIZE) ;
	}
	*pResult = 0 ;
	return TRUE ;
}
//--------------------------------------------------------------------------------
//
//【ファイルダイアログのOKボタン名変更】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// ファイルダイアログ用コールバック関数

UINT CALLBACK OFNHookProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_INITDIALOG :
			CommDlg_OpenSave_SetControlText(GetParent(hDlg), IDOK, "このファイルを開く") ;
			return TRUE ;
		default :
			break ;
	}
	return FALSE ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
// CTestFileDialogはCFileDialogの派生クラス

BOOL CTestFileDialog::OnInitDialog() 
{
	CFileDialog::OnInitDialog() ;

	CommDlg_OpenSave_SetControlText(GetParent()->m_hWnd, IDOK, "このファイルを開く") ;

	return TRUE ;
}
--------------------------------------------------------------------------------
//
//【ファイルダイアログで複数選択の結果取得】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
void OnTest(HWND hWnd)
{
	OPENFILENAME ofn ;
	char szPathName[MAX_PATH] ;
	char szFolder[MAX_PATH] ;
	char szFileNameBuffer[100000] ;
	
	ZeroMemory((LPVOID)&ofn, sizeof(OPENFILENAME)) ;
	ofn.lStructSize = sizeof(OPENFILENAME) ;
	ofn.hwndOwner = hWnd ;
	ofn.lpstrFilter = "全てのファイル(*.*)\0*.*\0\0" ;
	ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ALLOWMULTISELECT ;
	ofn.lpstrFile = szFileNameBuffer ;
	ofn.nMaxFile = 100000 ;

	if(GetOpenFileName(&ofn) == TRUE){
		char szBuffer[512] ;
		LPTSTR lpEnd = strchr(szFileNameBuffer, '\0') ;
		LPTSTR lpszNextString = lpEnd + 1 ;
		if(lpEnd){
			if(*(lpszNextString) == '\0'){
				// ファイルが1つしか選択されていない
				lstrcpy(szBuffer, szFileNameBuffer) ;
			}
			else{
				// ファイルが複数選択されている
				int nLength;

				// フォルダ名の取得
				lstrcpy(szFolder, szFileNameBuffer) ;
				nLength = lstrlen(szFolder) ;
				// 「\」記号で終わっていなければ付加
				if(szFolder[nLength] != '\\')
					lstrcat(szFolder, "\\") ;

				szBuffer[0] = '\0' ;
				while(*(lpszNextString) != '\0'){
					// 選択されたファイルのパス名を作成
					lstrcpy(szPathName, szFolder) ;
					lstrcat(szPathName, lpszNextString) ;
					// 確認用のデータ作成
					lstrcat(szBuffer, szPathName) ;
					lstrcat(szBuffer, "\n") ;
					// 次のファイル名を探す
					lpEnd = strchr(lpszNextString, '\0') ;
					lpszNextString = lpEnd + 1 ;
				}
			}
			MessageBox(hWnd, szBuffer, "205選択されたファイル", MB_OK) ;
		}
	}
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
void CTestWnd::OnTest() 
{
	CString strPathName ;

	CFileDialog	dlg(TRUE,
						"",
						"",
						OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,
						"全てのファイル(*.*)|*.*||",
						this) ;

	char szFileNameBuffer[100000] ;				// この3行は複数のファイルを1度に
	dlg.m_ofn.lpstrFile = szFileNameBuffer ;	// 選択して開けるようにするためのもの
	dlg.m_ofn.nMaxFile = 100000 ;				//

	dlg.m_ofn.lpstrTitle = "205ファイルダイアログで複数選択の結果取得" ;
	if(dlg.DoModal()==IDOK){
		POSITION pos = dlg.GetStartPosition() ;
		while(pos){
			// ファイル名の取得
			strPathName += dlg.GetNextPathName(pos) ;
			strPathName += "\n" ;
		}
		MessageBox(strPathName, "205選択されたファイル") ;
	}
}
//--------------------------------------------------------------------------------
//
//【ダイアログでEnter・Escを無効にする】
//
//(MFC)
/////////////////////////////////////////////////////////////////////////////
// クラスウィザードによって追加された関数

BOOL CTestDialog::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message == WM_KEYDOWN){
		switch(pMsg->wParam){
			case VK_RETURN :  // Enterキー押下
				// 独自の処理

				// デフォルトの動作をさせたくない時はTRUEを返す
				return TRUE ;

			case VK_ESCAPE :  // Escキー押下
				// 独自の処理
				return TRUE ;
			default :
				break ;
		}
	}
	return CDialog::PreTranslateMessage(pMsg) ;
}
//--------------------------------------------------------------------------------
//
//【ダイアログにツールチップをつける】
//
//1. ダイアログのメンバ変数にツールチップコントロールを追加する

	CToolTipCtrl	m_ToolTip ;
	
//2. OnInitDialog()をオーバーライドする

	// ツールヒントコントロールを作成
	m_ToolTip.Create(this) ;

	// ツールヒントコントロールを OKボタンに結び付ける
	m_ToolTip.AddTool((CButton *)GetDlgItem(IDOK),	_T("This is OK button")) ;
	
//3. PreTranslateMessage()をオーバーライドする
{
	switch(pMsg->message){
		case WM_LBUTTONDOWN:            
		case WM_LBUTTONUP:              
		case WM_MOUSEMOVE:

		    // マウス メッセージをツール ヒント コントロールに渡して処理する
		    m_ToolTip.RelayEvent(pMsg) ;
	}

	return CDialog::PreTranslateMessage(pMsg) ;
}