Sample8

[その他]



//--------------------------------------------------------------------------------
//
//【IMEのON/OFF】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
#include "imm.h"
/////////////////////////////////////////////////////////////////////////////
// IMEをON/OFFする
// hWnd:目的のウィンドウハンドル
// bOn:TRUE…ON/FALSE…OFF

void ImeOn(HWND hWnd, BOOL bOn)
{
	// ハンドルを取得する
	HIMC hIMC = ImmGetContext(hWnd) ;

	// IMEのON/OFF
	ImmSetOpenStatus(hIMC, bOn) ;

	// 取得したハンドルを開放する
	ImmReleaseContext(hWnd, hIMC) ;
}

//--------------------------------------------------------------------------------
//
//【IMEの状態を取得する】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
#include "imm.h"
/////////////////////////////////////////////////////////////////////////////
// IMEの状態を返す
// 戻り値:TRUE…IME ON/FALSE…IME OFF

BOOL IsImeOn(HWND hWnd)
{
	// hWndは目的のウィンドウハンドル
	HIMC hIMC = ImmGetContext(hWnd) ;

	// IMEの状態取得
	BOOL bResult = ImmGetOpenStatus(hIMC) ;

	// 取得したハンドルを開放する
	ImmReleaseContext(hWnd, hIMC) ;

	return bResult ;
}
//--------------------------------------------------------------------------------
//
//【特定のウィンドウでIMEを起動できないようにする】
//
// IMEを起動できなくしたい ウィンドウのハンドルをhWndとすると

	ImmAssociateContext(hWnd, NULL) ; 
//--------------------------------------------------------------------------------
//
//【途中でアプリケーションを終了させる】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
{
	// hWndはメインウィンドウのハンドル
	PostMessage(hWnd, WM_CLOSE, 0, 0) ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
{
	AfxGetMainWnd()->PostMessage(WM_CLOSE) ;
}

//--------------------------------------------------------------------------------
//
//【ウィンドウ間で文字列の送信】
//
//●送り側
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
// 文字列送信
void SendText(HWND hwndTo, LPCTSTR lpszText)
{
	COPYDATASTRUCT cds ;
	cds.dwData = 0 ;
	cds.lpData = (void*)lpszText ;
	cds.cbData = lstrlen(lpszText) + 1 ; // 終端のNULLも送る
	// 文字列送信
	SendMessage(hwndTo, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds) ;
}

//●受け側
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// ウィンドウプロシージャ内のWM_COPYDATAハンドラ部分

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_COPYDATA :
			HWND			 hwndFrom = (HWND)wParam ;
			COPYDATASTRUCT* pcds	 = (COPYDATASTRUCT*)lParam ;
			
			MessageBox(hWnd, (LPCTSTR)pcds->lpData, "", MB_OK) ;
			return 0 ;
		default :
			break ;
	}
	return (DefWindowProc(hWnd, message, wParam, lParam)) ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
// クラスウィザードで追加されたWM_COPYDATAハンドラ

BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{
	MessageBox((LPCTSTR)pCopyDataStruct->lpData) ;
	return CFrameWnd::OnCopyData(pWnd, pCopyDataStruct) ;
}


//--------------------------------------------------------------------------------
//
//【NTか95かを判別する】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
{
	OSVERSIONINFO osInfo ;
	osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO) ;
	GetVersionEx(&osInfo) ;
	if(osInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS){
		// Windows 95の時の処理
	}
	else if(osInfo.dwPlatformId == VER_PLATFORM_WIN32_NT){
		// Windows NTの時の処理
	}
}

//--------------------------------------------------------------------------------
//
//【ショートカットの作り方】
//
//(MFC)
/////////////////////////////////////////////////////////////////////////////
#include "shlobj.h"

void CTestDialog::OnTest() 
{
	CString strTarget ;
	CString strLink ;

	m_ed1.GetWindowText(strTarget) ;
	strLink = strTarget ;
	strLink += "のショートカット.lnk" ;

	CreateLinkFile(strLink, "", strTarget) ;
}

/////////////////////////////////////////////////////////////////////////////
// ショートカットを作成する関数
BOOL CreateLinkFile(LPCTSTR lpszShortcutFile,	// 作成する[*.lnk]のフルパス名
					LPCTSTR lpszDescription,	// ディスクリプション名
					LPCTSTR lpszTargetFile)		// リンク元のファイルのフルパス名
{
	BOOL bRet = FALSE ;
	HRESULT hResult ;
	IShellLink* psl ; 

	// COMの初期化
	CoInitialize(NULL) ;
	// IShellLink インターフェースの取得
	hResult = CoCreateInstance(
							CLSID_ShellLink,
							NULL, CLSCTX_INPROC_SERVER,
							IID_IShellLink,
							(void **)&psl) ;
	if(SUCCEEDED(hResult)){
		IPersistFile* ppf ;

		// IPersistFileインターフェースの取得
		hResult = psl->QueryInterface(IID_IPersistFile, (void **)&ppf) ;
		if(SUCCEEDED(hResult)){
			WCHAR wszShortcutFile[MAX_PATH] ; // ユニコード用のバッファ

			// リンク元のファイルのパスをセットする
			hResult = psl->SetPath(lpszTargetFile) ;
			if(SUCCEEDED(hResult)){
				// ショートカットファイルのディスクリプションをセット
				hResult = psl->SetDescription(lpszDescription) ;
				if(SUCCEEDED(hResult)){
					MultiByteToWideChar(CP_ACP, 0, lpszShortcutFile, -1, wszShortcutFile, MAX_PATH) ;
					hResult = ppf->Save(wszShortcutFile, TRUE) ;
					if(SUCCEEDED(hResult)) 
						bRet = TRUE ;
				}
			}
			ppf->Release() ;
		}
		psl->Release() ;
	}

	CoUninitialize() ;

	return bRet ;
}


//--------------------------------------------------------------------------------
//
//【NumLockのON/OFF】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
{
	// NumLock押下
	keybd_event(VK_NUMLOCK, 0, 0, 0) ;
	keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0) ;
}

//--------------------------------------------------------------------------------
//
//【MFCでのSystemImageListの使い方】
//
//(MFC)
/////////////////////////////////////////////////////////////////////////////
{
	SHFILEINFO shfi ;
	// システムイメージリストのハンドルを取得
	HIMAGELIST hSystemImageList = (HIMAGELIST)SHGetFileInfo(………) ;

	CImageList imagelist ;
	imagelist.Attach(hSystemImageList) ;
	// 必要な処理
			:
			:
	// 処理が終わったら、DestroyされないためにDetachする
	imagelist.Detach() ;
}


//--------------------------------------------------------------------------------
//
//【長い処理をする時の対策】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
void	YieldMessage()
{
	MSG	msg ;
	if(PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)){
		TranslateMessage(&msg) ;
		DispatchMessage(&msg) ;
	}
}


//--------------------------------------------------------------------------------
//
//【現在のユーザ名を取得する】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
{
	char szUserName[256] ;
	DWORD dwBufferSize = 256 ;

	// ユーザ名の取得
	GetUserName(szUserName, &dwBufferSize) ;

	MessageBox(NULL, szUserName, "現在のユーザ名", MB_OK) ;
}

//--------------------------------------------------------------------------------
//
//【デスクトップのフォルダ名取得】
//
#include "winnetwk.h"
#include "shlobj.h"

//(SDK)
/////////////////////////////////////////////////////////////////////////////
{
	char szPath[MAX_PATH];
	ITEMIDLIST* pidl;
	IMalloc* pMalloc;

	if(SUCCEEDED(SHGetMalloc(&pMalloc))){
		SHGetSpecialFolderLocation(GetDesktopWindow(), CSIDL_DESKTOP, &pidl) ;
		SHGetPathFromIDList(pidl, szPath) ;

		MessageBox(NULL, szPath, "デスクトップのフォルダ", MB_OK) ;

		pMalloc->lpVtbl->Free(pMalloc, pidl) ;
		pMalloc->lpVtbl->Release(pMalloc) ;
	}
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
{
	char szPath[MAX_PATH] ;
	ITEMIDLIST* pidl ;
	LPMALLOC pMalloc ;

	if(SUCCEEDED(SHGetMalloc(&pMalloc))){
		SHGetSpecialFolderLocation(::GetDesktopWindow(), CSIDL_DESKTOP, &pidl) ;
		SHGetPathFromIDList(pidl, szPath) ;

		::MessageBox(NULL, szPath, "デスクトップのフォルダ", MB_OK) ;

		pMalloc->Free(pidl) ;
		pMalloc->Release() ;
	}
}

//--------------------------------------------------------------------------------
//
//【解像度を切り替える】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分

LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_INITDIALOG :
			DEVMODE devm ;
			char szText[256] ;
			DWORD dwModeIndex ;
			HWND hwndListBox = GetDlgItem(hDlg, IDC_LISTBOX) ;

			// 使用可能なディスプレイモードを列挙
			for(dwModeIndex=0 ; dwModeIndex < 64 ; dwModeIndex++){
				if(!EnumDisplaySettings(NULL, dwModeIndex, &devm))
					break ;
				wsprintf(szText, "[%2d] %dbitカラー, %4d x %4d, "
						"dmDisplayFlags=%d, 周波数 %d",
						dwModeIndex, devm.dmBitsPerPel, devm.dmPelsWidth,
						devm.dmPelsHeight, devm.dmDisplayFlags, devm.dmDisplayFrequency) ;
				// リストボックスにディスプレイモードを表示
				SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)szText) ;
			}
			return TRUE ;
		default :
			break ;
	}
	return FALSE ;
}
/////////////////////////////////////////////////////////////////////////////
void OnTest(HWND hWnd)
{
	DEVMODE devm ;
	HWND hwndListBox = GetDlgItem(hWnd, IDC_LISTBOX) ;

	// リストボックスで選択したインデックスを取得
	int nSelected = SendMessage(hwndListBox, LB_GETCURSEL, 0, 0) ;
	
	// ディスプレイモードの取得
	if(EnumDisplaySettings(NULL, nSelected, &devm)){
		// ディスプレイモードを変更
		ChangeDisplaySettings(&devm, 0) ;
	}
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
// WM_INITDIALOGハンドラ

BOOL CTestDialog::OnInitDialog()
{
	CDialog::OnInitDialog();

		:
		:

	DEVMODE devm ;
	char szText[256] ;

	// 使用可能なディスプレイモードを列挙
	for(DWORD dwModeIndex=0 ; dwModeIndex < 64 ; dwModeIndex++){
		if(!EnumDisplaySettings(NULL, dwModeIndex, &devm))
			break ;
		wsprintf(szText, "[%2d] %dbitカラー, %4d x %4d, "
				"dmDisplayFlags=%d, 周波数 %d",
				dwModeIndex, devm.dmBitsPerPel, devm.dmPelsWidth,
				devm.dmPelsHeight, devm.dmDisplayFlags, devm.dmDisplayFrequency) ;
		// リストボックスにディスプレイモードを表示
		// m_wndListBoxはCListBox型のオブジェクト
		m_wndListBox.AddString(szText) ;
	}
	return TRUE ;	// TRUE を返すとコントロールに設定したフォーカスは失われません。
}
/////////////////////////////////////////////////////////////////////////////
void CTestDialog::OnTest() 
{
	DEVMODE devm ;
	// リストボックスで選択したインデックスを取得
	int nSelected = m_wndListBox.GetCurSel() ;
	
	// ディスプレイモードの取得
	if(EnumDisplaySettings(NULL, nSelected, &devm)){
		// ディスプレイモードを変更
		ChangeDisplaySettings(&devm, 0) ;
	}
}


//--------------------------------------------------------------------------------
//
//【フォントの設定の仕方】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// ダイアログプロシージャ

LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_INITDIALOG :
			HWND hwndStatic = GetDlgItem(hDlg, IDC_STATIC1) ;

			// フォントの作成
			g_hFont = CreateFont(20,0,0,0,FW_NORMAL,FALSE,FALSE,0,SHIFTJIS_CHARSET,
				OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
				DEFAULT_PITCH,"MS Pゴシック") ;
			// フォントの設定
			SendMessage(hwndStatic, WM_SETFONT, (WPARAM)g_hFont, MAKELPARAM(FALSE,0)) ;
			return TRUE ;
		case WM_DESTROY :
			// フォントの削除
			DeleteObject(g_hFont) ;
			return 0 ;
		default :
			break ;
	}
	return FALSE ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
// コンストラクタ
CTestDialog::CTestDialog()
{
	// フォントの作成
	// m_fontはCFontオブジェクトでCTestDialogのメンバ
	m_font.CreateFont(20,0,0,0,FW_NORMAL,FALSE,FALSE,0,
		SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH,"MS Pゴシック") ;
}

/////////////////////////////////////////////////////////////////////////////
// クラスウィザードによってインプリメントされたWM_INITDIALOGハンドラ
CTestDialog:OnInitDialog()
{
	CDialog::OnInitDialog();

	// ここでコントロールにフォントをセット
	// m_staticはCStaticオブジェクト
	m_static.SetFont(&m_font) ;

	return TRUE ;
}


//--------------------------------------------------------------------------------
//
//【仮想画面で高速描画】
//
//(MFC)
/////////////////////////////////////////////////////////////////////////////
//[TestView.h]
/////////////////////////////////////////////////////////////////////////////
class CTestView : public CView
{
		:
		:

	CDC m_dcBuffer ;
	CBitmap m_bmpBuffer ;

	void BufferInit() ;
	void BufferDraw(CDC* pDC) ;
		:
		:
}
/////////////////////////////////////////////////////////////////////////////
//[TestView.cpp]
/////////////////////////////////////////////////////////////////////////////
// 仮想画面の作成
void CTestView::BufferInit()
{
	CRect rcClient ;
	GetClientRect(rcClient) ;
	CClientDC dc(this) ;
	// m_dcBufferはCDC型のメンバ変数
	m_dcBuffer.CreateCompatibleDC(&dc) ;
	// m_bmpBufferはCBitmap型のメンバ変数
	m_bmpBuffer.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height()) ;
	m_dcBuffer.SelectObject(&m_bmpBuffer) ;

	m_bBufDraw = FALSE ;
}
/////////////////////////////////////////////////////////////////////////////
// 仮想画面への描画(従来のOnDrawに相当)
void CTestView::BufferDraw(CDC* pDC)
{
	// 必要な描画処理を行う
}
/////////////////////////////////////////////////////////////////////////////
// 画面への描画は仮想画面(ビットマップ)の転送のみ
void CTestView::OnDraw(CDC* pDC)
{
	CRect rectClip ;
	// 描画すべき領域の取得
	int nClip = pDC->GetClipBox(&rectClip) ;
	if(nClip == ERROR || nClip == NULLREGION)
		return ;

	pDC->BitBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(),
			&m_dcBuffer, rectClip.left, rectClip.top, SRCCOPY) ;
}
/////////////////////////////////////////////////////////////////////////////
// クラスウィザードで追加したOnInitialUpdate()関数
void CTestView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// 仮想画面の初期化
	BufferInit() ;	
}


//--------------------------------------------------------------------------------
//
//【現在の日付と時刻を取得】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
{
	SYSTEMTIME st ;
	char szData[256] ;
	// 現在時刻の取得
	GetLocalTime(&st) ;
	// データの作成
	wsprintf(szData, TEXT("%d/%02d/%02d %02d:%02d:%02d"),
		st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond) ;
}


//--------------------------------------------------------------------------------
//
//【次のコントロールに移動】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
{
	// 次のコントロールに移動
	keybd_event(VK_TAB, 0, 0, 0) ;
	keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0) ;
}

{
	// 前のコントロールに移動
	keybd_event(VK_SHIFT, 0, 0, 0) ;
	keybd_event(VK_TAB,   0, 0, 0) ;
	keybd_event(VK_TAB,   0, KEYEVENTF_KEYUP, 0) ;
	keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0) ;
}

//--------------------------------------------------------------------------------
//
//【レジストリの使い方】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
//[Register.h]
/////////////////////////////////////////////////////////////////////////////
void SetRegistryKey(LPCTSTR lpszRegistryKey) ;
BOOL WriteRegInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue) ;
UINT GetRegInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault) ;
BOOL WriteRegString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue) ;
void GetRegString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault, 
					LPTSTR lpReturnedString, DWORD nSize) ;

HKEY EmxCreateRegKey(LPCTSTR lpszKey, HKEY hKey) ;
BOOL EmxSetRegDword(LPCTSTR lpszValueName, DWORD dwData, HKEY hKey) ;
BOOL EmxGetRegDword(LPCTSTR lpszValueName, DWORD* lpdwBuff, HKEY hKey) ;
BOOL EmxSetRegString(LPCTSTR lpszValueName, LPCSTR lpcszString, HKEY hKey) ;
BOOL EmxGetRegString(LPCTSTR lpszValueName, LPTSTR lpReturnedString, DWORD nSize, HKEY hKey) ;

/////////////////////////////////////////////////////////////////////////////
//[Register.c]
/////////////////////////////////////////////////////////////////////////////
#include "windows.h"
#include "Registry.h"

static HKEY g_hKey = NULL ;
/////////////////////////////////////////////////////////////////////////////
//
// ルートキーの設定
//

void SetRegistryKey(LPCTSTR lpszRegistryKey)
{
	char szOpenRegistry[MAX_PATH] = {"Software\\"} ;

	lstrcat(szOpenRegistry, lpszRegistryKey) ;
	g_hKey = EmxCreateRegKey(szOpenRegistry, HKEY_CURRENT_USER) ;
}
/////////////////////////////////////////////////////////////////////////////
//
// int値の書き込み
//

BOOL WriteRegInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue)
{
	HKEY hOpenKey ;
	
	if(g_hKey){
		hOpenKey = EmxCreateRegKey(lpszSection, g_hKey) ;
		if(hOpenKey)
			return EmxSetRegDword(lpszEntry, nValue, hOpenKey) ;
	}
	return FALSE ;
}
/////////////////////////////////////////////////////////////////////////////
//
// UINT値の取得
//

UINT GetRegInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault)
{
	UINT uResult = nDefault ;
	HKEY hOpenKey ;
	
	if(g_hKey){
		hOpenKey = EmxCreateRegKey(lpszSection, g_hKey) ;
		if(hOpenKey){
			if(!EmxGetRegDword(lpszEntry, &uResult, hOpenKey))
				uResult = nDefault ;
		}
	}
	return uResult ;
}
/////////////////////////////////////////////////////////////////////////////
//
// 文字列の書き込み
//

BOOL WriteRegString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue)
{
	HKEY hOpenKey ;
	
	if(g_hKey){
		hOpenKey = EmxCreateRegKey(lpszSection, g_hKey) ;
		if(hOpenKey)
			return EmxSetRegString(lpszEntry, lpszValue, hOpenKey) ;
	}
	return FALSE ;
}
/////////////////////////////////////////////////////////////////////////////
//
// 文字列の取得
//

void GetRegString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault, 
					LPTSTR lpReturnedString, DWORD nSize)
{
	HKEY hOpenKey ;
	
	if(g_hKey){
		hOpenKey = EmxCreateRegKey(lpszSection, g_hKey) ;
		if(hOpenKey){
			if(EmxGetRegString(lpszEntry, lpReturnedString, nSize, hOpenKey))
				return ;
		}
	}
	lstrcpy(lpReturnedString, lpszDefault) ;
}
/////////////////////////////////////////////////////////////////////////////
//
// キーの作成
//

HKEY EmxCreateRegKey(LPCTSTR lpszKey, HKEY hKey)
{
	DWORD dwDisposition ;
	HKEY hOpenedKey ;

	if(RegCreateKeyEx(hKey, lpszKey, 0, "", REG_OPTION_NON_VOLATILE, 
		KEY_ALL_ACCESS, NULL, &hOpenedKey, &dwDisposition) != ERROR_SUCCESS)
			hOpenedKey = NULL ;
	// 失敗したらNULLを返す
	return hOpenedKey ;
}
/////////////////////////////////////////////////////////////////////////////
//
// DWORD値の書き込み
//

BOOL EmxSetRegDword(LPCTSTR lpszValueName, DWORD dwData, HKEY hKey)
{
	DWORD	dwBuffer = dwData ;

	if(RegSetValueEx(hKey, lpszValueName, 0, REG_DWORD, 
		(LPBYTE)&dwBuffer, sizeof(DWORD)) != ERROR_SUCCESS)
			return FALSE ;

	return TRUE ;
}
/////////////////////////////////////////////////////////////////////////////
//
// DWORD値の取得
//

BOOL EmxGetRegDword(LPCTSTR lpszValueName, DWORD* lpdwBuff, HKEY hKey)
{
	DWORD	dwType ;
	DWORD	dwBufferSize = sizeof(DWORD) ;

	//ASSERT(g_hKey);
	if(RegQueryValueEx(hKey, lpszValueName, 0, &dwType,
		(LPBYTE)lpdwBuff, &dwBufferSize) != ERROR_SUCCESS)
		return FALSE ;

	return TRUE ;
}
/////////////////////////////////////////////////////////////////////////////
//
// 文字列の書き込み
//

BOOL EmxSetRegString(LPCTSTR lpszValueName, LPCSTR lpcszString, HKEY hKey)
{
	DWORD	dwBufferSize = lstrlen(lpcszString) ;

	if(RegSetValueEx(hKey, lpszValueName, 0, REG_SZ,
		(LPBYTE)lpcszString, dwBufferSize) != ERROR_SUCCESS)
			return FALSE ;

	return TRUE ;
}
/////////////////////////////////////////////////////////////////////////////
//
// 文字列の取得
//

BOOL EmxGetRegString(LPCTSTR lpszValueName, LPTSTR lpReturnedString, DWORD nSize, HKEY hKey)
{
	DWORD	dwType ;
	DWORD	dwBufferSize = nSize ;

	if(RegQueryValueEx(hKey, lpszValueName, 0, &dwType,
		(LPBYTE)lpReturnedString, &dwBufferSize) != ERROR_SUCCESS)
			return FALSE ;

	return TRUE ;
}
//--------------------------------------------------------------------------------
//
//【クライアント領域をキャプチャーしてクリップボードにコピーする】
//

{
	CDC memDC ;
	CBitmap bm ;
	CRect rect ;

	// クライアント領域の矩形を取得します
	GetClientRect(&rect) ;

	// デバイスコンテキストを取得します
	CDC* pDC = GetDC() ;

	// メモリデバイスコンテキストを作成します。
	memDC.CreateCompatibleDC(pDC) ;

	// ビットマップを作成します
	bm.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()) ;

	// ビットマップオブジェクトを選択します。
	// (後で元に戻すために現在のオブジェクトをとっておきます)
	CBitmap* pOldBmp = memDC.SelectObject(&bm) ;

	// 画面イメージをコピーします
	memDC.StretchBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, rect.Width(), rect.Height(), SRCCOPY) ;

	// クリップボードをオープンします
	OpenClipboard() ;

	// クリップボードをクリアします
	::EmptyClipboard() ;

	// クリップボードにビットマップをコピーします
	::SetClipboardData(CF_BITMAP, bm.GetSafeHandle()) ;

	// クリップボードをクローズします
	::CloseClipboard() ;

	// オブジェクトを切り離します
	bm.Detach() ;

	// オブジェクトを元に戻します。
	memDC.SelectObject(pOldBmp) ;
}
//--------------------------------------------------------------------------------
//
//【タスクバーの位置を取得する】
//
// ウィンドウクラス名に"Shell_TrayWnd"を指定してウィンドウを検索することによりタスクバーのウィンドウを検索できます。
{
	CRect rect ;
	CWnd* pWnd = FindWindow(_T("Shell_TrayWnd"), NULL) ;
	if(pWnd){
		pWnd->GetWindowRect(&rect) ;
		TRACE(_T("タスクバーの位置(left, top, right, bottom)は %d, %d, %d, %d です\n"),
						rect.left, rect.top, rect.right, rect.bottom) ;
	}
}
//--------------------------------------------------------------------------------
//
//【CRectTrackerクラスを使って矩形をマウスで移動させる】
//

// MFCのCRectTrackerクラスを使うと 矩形をマウスで簡単に移動させることができます。
// 以下に簡単なサンプルを示します。
// (1) AppWizardを使って プロジェクトRectTrackerTestを作成します。
//
// (2) クラスウィザードを使って、CRectTrackerTestViewクラスに メンバ変数 CRectTracker m_trackerを追加します。
// (ビュークラスのメンバとすべきかどうかは設計に依存すると思いますが、今回はCRectTrackerの説明だけのアプリケーションなのでとりあえずビュークラスのメンバとします。
//
// (3) CRectTrackerTestViewクラスのコンストラクタで m_trackerを初期化します。 
	m_tracker.m_rect.left = 10 ; // 左端の座標です
	m_tracker.m_rect.top = 10 ; // 上端の座標です
	m_tracker.m_rect.right = 101 ; // 右端の座標です
	m_tracker.m_rect.bottom = 101 ; // 下端の座標です

	m_tracker.m_nStyle |= CRectTracker::solidLine ; // 外の枠線のスタイルを指定します

// (4) CRectTrackerTestView::OnDraw(CDC* pDC)にm_trackerの描画処理を追加します 
	m_tracker.Draw(pDC) ;

// (5) クラスウィザードを使って、CRectTrackerTestViewクラスに WM_LBUTTONDOWNのメッセージハンドラを追加します。 
void CRectTrackerTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// クリックされた位置がm_tracker内か検査します
	if(m_tracker.HitTest(point) < 0){
		// HitTest()の結果がマイナスの場合 クリックされた位置は
		// m_trackerの外側です
	}
	else{
		// トラッキング処理を行います
		m_tracker.Track(this, point, FALSE) ;
		// 再描画します
		InvalidateRect(NULL) ;
	}
	
	CView::OnLButtonDown(nFlags, point) ;
}
//--------------------------------------------------------------------------------
//
//【ステータスバーに文字を出力する】
//
//ステータスバーに文字を出力するにはCStatusBarクラスのSetPaneText()を使います。
{
	// メインフレームウィンドウのポインタを取得します

	CFrameWnd* pWnd = (CFrameWnd*)AfxGetApp()->m_pMainWnd ;

	// ステータスバーのポインタを取得します
	CStatusBar* pStatusBar = (CStatusBar*)pWnd->GetMessageBar() ;

	// それぞれのペインに文字を出力します
	pStatusBar->SetPaneText(0, _T("Pane 0")) ;
	pStatusBar->SetPaneText(1, _T("Pane 1")) ;
	pStatusBar->SetPaneText(2, _T("Pane 2")) ;
}
//--------------------------------------------------------------------------------
//
//【時間のかかる処理の間マウスカーソルを砂時計にする】
//
// 時間のかかる処理の間マウスカーソルを砂時計にするマウスカーソルを砂時計にするのは非常に簡単です。
// MFCのCWaitCursorクラスのオブジェクトを宣言するだけです。
// APIのSetCursor()を使ってカーソルを変更する方法もありますが、これだと自分でまた 元に戻さないといけません。
// CWaitCursorはデストラクタでカーソルを元に戻してくれるので、自分で元に戻す必要がありません。 
    
// この例ではxxx::foo()が呼ばれると、マウスカーソルが砂時計になり、xxx::foo()を抜けると元に戻ります。
void Test::foo()
{    
	CWaitCursor wait ;
	// (時間のかかる処理)
}
     
//--------------------------------------------------------------------------------
//
//【特定のウィンドウ上でカーソルを変更する】
//
// CWnd::OnSetCursor()をオーバーライドして ::SetCursor()を呼び出します。 例えばリソースエディタで作成したマウスカーソル(IDC_XXX)に変更したい場合は
// OnSetCursor()を以下のようにオーバーライドします。 
CTestWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)  
{ 
	::SetCursor(AfxGetApp()->LoadCursor(IDC_XXX)) ; 
	return TRUE ; 
} 
//--------------------------------------------------------------------------------
//
//【起動引数を取得するには?】
//

// CWinAppのメンバ変数 m_lpCmdLineに格納されています。 
BOOL CTestApp::InitInstance()
{
	if(m_lpCmdLine[0] == _T('\0')){
		// 新しい (空の) ドキュメントを作成します。
		OnFileNew() ;
	}
	else{
		// 最初のコマンド ライン引数として渡されたファイルを開きます。
		OpenDocumentFile(m_lpCmdLine) ;
	}
}
//--------------------------------------------------------------------------------
//
//【アプリケーションクラスのオブジェクトにアクセスするには?】
//

// AfxGetApp()を使うとプログラムのどこからでもアプリケーションオブジェクトのポインタが取得できます。
{
	// アプリケーションメインウィンドポインタを取得
	CWnd* m_pMainWnd = AfxGetApp()->m_pMainWnd ;
	// アプリケーションメインウィンドポインタからメインフレームを取得
	CMainFrame* pMain = (CMainFrame*)m_pMainWnd ;
	// 次MDIを取得
	pMain->MDINext() ;
}
//--------------------------------------------------------------------------------
//
//【メインウィンドウのサイズを変えるには?】
//

//	AfxGetMainWnd()->MoveWindow()で変更できます。 
{
	RECT rcWindow ;
	// レジストリから前回のウィンドウ位置を取得
	// SetRegistryKey()の引数はプログラマ固有の文字列にする
	SetRegistryKey("ComposerName\\FooApp") ;
	rcWindow.left	= GetRegInt("Settings", "left", 0) ;
	rcWindow.top	= GetRegInt("Settings", "top", 0) ;
	rcWindow.right	= GetRegInt("Settings", "right", 200) ;
	rcWindow.bottom	= GetRegInt("Settings", "bottom", 150) ;
	// ウィンドウ位置修正
	AfxGetMainWnd()->MoveWindow(rcWindow.left, rcWindow.top,
		rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, FALSE) ;

//--------------------------------------------------------------------------------
//
//【拡張子にアプリケーションを関連付けるには?】
//

//	CWinApp::RegisterShellFileTypes()を使います。 
//--------------------------------------------------------------------------------
//
//【現在アクティブなウィンドウを取得するには?】
//
//	CWnd::GetForegroundWindow()を使います。 
{
	CWnd *p = GetForegroundWindow() ;
}
//--------------------------------------------------------------------------------
//
//【ツールバーの有効/無効を切り替えるには?】
//
	UPDATE_COMMAND_UIのメッセージハンドラを追加し、pCmdUI->Enable()で切り替えます。 
//--------------------------------------------------------------------------------
//
//【レジストリにアクセスする】
//
// まずはじめにCWinAppクラスのSetRegistryKey()でレジストリキーを設定します。
// その後、CWinAppクラスの以下のメンバ関数を使ってレジストリ値の取得/設定ができます。 
	GetProfileString 
	GetProfileInt 
	WriteProfileString 
	WriteProfileInt 
//--------------------------------------------------------------------------------
//
//【SendMessage()とPostMessage()の違いは?】
//

	SendMessage()の場合、相手がそのメッセージを処理するまで自分に制御が戻りません。
	PostMessage()の場合 メッセージをメッセージキューに入れるだけですぐにリターンします。
//--------------------------------------------------------------------------------
//
//【自アプリのパスを取得するには?】
//

	GetModuleFileName()を使います。自アプリのパスを取得する場合は第一引数は NULLでいいです。
//--------------------------------------------------------------------------------
//
//【拡張子に関連付けられたアプリケーションを取得するには?】
//
	FindExecutable()を使います 
//--------------------------------------------------------------------------------
//
//【ドライブのタイプを取得するには?】
//
	GetDriveType()を使います。【ドライブの存在チェック】を参照。 
//--------------------------------------------------------------------------------
//
//【ディスクの空き容量を取得するには?】
//
//	GetDiskFreeSpace[Ex]()を使います。 
//====================================================================
//  int CheckDiskFreeSpace(char *name, ULONG Warning)
//--------------------------------------------------------------------
//	機能   : ディスクの空き容量をチェックする。
//	引数   : char *name
//		テキストファイル名
//		ULONG Warning
//		警告を出す残り容量(メガバイト)
//--------------------------------------------------------------------
//	戻り値 : DISK_OK      = 正常終了(0)
//           DISK_WARNING = 容量警告(1)
//           DISK_ERR     = 書込不可能(-1)
//====================================================================
int CModemPort::CheckDiskFreeSpace(char *name, ULONG Warning)
{
	BOOL success ;
	ULARGE_INTEGER freeBytesToCaller, totalBytes, freeBytes ;
	ULONG WarningBytes ;
	char  drive[4] ;
	
	// ドライブを取得する。
	drive[0] = '\0' ;
	strncat(drive, name, 3) ;
	
	// 空きディスクサイズを取得する。
	success = GetDiskFreeSpaceEx(
				drive,
				&freeBytesToCaller,
				&totalBytes,
				&freeBytes) ;
	if(!success)
		return DISK_ERR ;
	
	// 容量警告をバイト単位に変換する。
	WarningBytes = Warning * 1024 * 1024 ;
	
	// 容量チェックをする
	if (freeBytes.QuadPart <= WarningBytes)
		return DISK_WARNING ;
	else
		return DISK_OK ;
}
//--------------------------------------------------------------------------------
//
//【特定のキー(例えばシフトキー)が押されている状態か判断するには?】
//
//	GetKeyState()を使います。
//	以下は シフトキーが押されているかどうか判断するプログラムのサンプルです。
{
	if(GetKeyState(VK_SHIFT) & 0x0100){
		// シフトキーが押されている
	}
	else{
		// シフトキーは押されていない
	}
}
//--------------------------------------------------------------------------------
//
//【コンピュータ名を取得する】
//
// GetComputerName()を使ってコンピュータ名を取得できます。
// 以下サンプルプログラムです。 
{
	TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1] ;
	DWORD dwNameLen = MAX_COMPUTERNAME_LENGTH ;
	
	if(!::GetComputerName(szComputerName, &dwNameLen))
		TRACE(_T("コンピュータ名を取得できませんでした\n")) ;
	else
		TRACE(_T("コンピュータ名は %s です\n"),szComputerName) ;
}