ホームに戻る
ファイルを開くダイアログ
#include <windows.h>
#include <string.h>
#define ID_B1 1000
#define ID_B2 1010
#define ID_EDIT1 2000
// ウィンドウプロシージャの宣言(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd, //ウィンドウハンドル(void型ポインタ)
UINT message, //メッセージ識別番号(unsigned int)
WPARAM wParam, //(32ビットlong)
LPARAM lParam); //(32ビットlong)
//ボタンを2個宣言
HWND hButton1, hButton2;
//エディットを1個宣言
HWND hEdit1;
//PAINTで使うフラグ
int show = 0;
char FileName[MAX_PATH], FileTitle[64];
//ファイルオープンダイアログ
void OpenFileDialog(HWND hwnd);
//メイン関数
int APIENTRY WinMain(
HINSTANCE hInstance, //インスタンスのハンドル
HINSTANCE hPreInstance, //以前のインスタンスハンドル
LPSTR cmdLine, //コマンド行の文字列
int cmdShow) //ウィンドウの表示状態
{
//ウィンドウクラスの宣言
WNDCLASS wd;
//ウィンドウクラス名
char *wdName = "window00";
//ウィンドウ登録のためのループ
if (!hPreInstance) {
//ウィンドウスタイル
wd.style = CS_HREDRAW | CS_VREDRAW; //幅、高さの変化に対し再描画する
//ウィンドウプロシージャ
wd.lpfnWndProc = (WNDPROC)WndProc;
//クラスの予備のメモリ領域
wd.cbClsExtra = 0;
//ウィンドウの予備のメモリ領域
wd.cbWndExtra = 0;
//プログラムのインスタンスハンドル
wd.hInstance = hInstance;
//アイコンのハンドル
wd.hIcon = NULL;
//カーソルのハンドル
wd.hCursor = LoadCursor(NULL, IDC_ARROW);
//バックグラウンドのブラシのハンドル
wd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//メニュー名
wd.lpszMenuName = NULL;
//クラス名
wd.lpszClassName = wdName;
//ウィンドウの登録(成功 非0、失敗 0)
if (!RegisterClass(&wd))
return FALSE;
}
//ウィンドウの生成(ハンドルを form00 とする)
HWND form00 = CreateWindowEx(
NULL, //拡張スタイル(なし)
wdName, //ウィンドウクラス名
"window", //ウィンドウの名前
WS_OVERLAPPEDWINDOW, //ウィンドウスタイル(オーバーラップ型)
CW_USEDEFAULT, //ウィンドウのX座標(ディフォルト)
CW_USEDEFAULT, //ウィンドウのY座標(ディフォルト)
200, //ウィンドウの幅(80に設定)
100, //ウィンドウの高さ(50に設定)
NULL, //親ウィンドウ(この場合自身が親)
NULL, //メニュー(なし)
hInstance, //プログラムのハンドル
NULL); //予備パラメータ
//ウィンドウの表示
ShowWindow(form00, cmdShow);
//ウィンドウの更新
UpdateWindow(form00);
//イベントのループ
MSG msg;
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// ウィンドウプロシージャ(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
//インスタンスハンドルを得る
HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
switch (message) {
//ウィンドウを表示するとき処理
case WM_CREATE:
//ボタン1の表示
hButton1 = CreateWindow(
"BUTTON",
"open",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10,
10,
80,
20,
hwnd,
(HMENU)ID_B1,
hInst
,NULL);
//ボタン2の表示
hButton2 = CreateWindow(
"BUTTON",
"clear",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
100,
10,
80,
20,
hwnd,
(HMENU)ID_B2,
hInst,
NULL);
//エディットの表示
hEdit1 = CreateWindow(
"EDIT",
"",
WS_CHILD | WS_VISIBLE,
10,
40,
170,
20,
hwnd,
(HMENU)ID_EDIT1,
hInst,
NULL);
break;
//ボタンを押したときの処理
case WM_COMMAND:
switch(LOWORD(wParam)){
//ボタン1を押したとき
case ID_B1:
//ファイルを開くコモンダイアログの設定
OpenFileDialog(hwnd);
break;
//ボタン2を押したとき
case ID_B2:
//エディットへの文字張り付け
//NULLなので文字列を消す
SetWindowText(hEdit1, NULL);
break;
default:
return(DefWindowProc(hwnd, message, wParam, lParam));
}
break;
//ウィンドウ描画時
case WM_PAINT:
if(show == 1){
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
SetWindowText(hEdit1, (LPTSTR)FileName);
EndPaint(hwnd, &ps);
}
else{
return(DefWindowProc(hwnd, message, wParam, lParam));
}
break;
//ウィンドウを破壊する時の処理
case WM_DESTROY:
//メイン関数のループを終了
PostQuitMessage(0);
break;
//デフォルトの処理に対してデフォルトの処理を返す
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return NULL;
}
/*オープンファイルコモンダイアログの構造体
typedef struct tagOFN { // ofn
DWORD lStructSize; //この構造体のサイズ
HWND hwndOwner; //親ウィンドウのハンドル
HINSTANCE hInstance; //インスタンス
LPCTSTR lpstrFilter; //フィルタ 区切り \0 最後 \0\0
LPTSTR lpstrCustomFilter; //ユーザー依存のフィルタ 使うとき nFilterIndex=0
DWORD nMaxCustFilter; //カスタムフィルタの
DWORD nFilterIndex; //最初に表示されるフィルタ
LPTSTR lpstrFile; //ファイルのフルパスを書き込む文字列変数を指定
DWORD nMaxFile; //ファイルパスの最大文字数 MAX_PATH 260
LPTSTR lpstrFileTitle; //選択したファイル名(パスを含まず)
DWORD nMaxFileTitle; //選択したファイルの文字列サイズ
LPCTSTR lpstrInitialDir; //ディレクトリ名
LPCTSTR lpstrTitle; //ダイアログウィンドウタイトルに表示する文字列
//OFN_ALLOWMULTISELECT 複数のファイル選択
//OFN_CREATEPROMPT ファイルがないとき新たに作成する
//OFN_ENABLEHOOK lpfnHookメンバを使用可にする
//OFN_ENABLETEMPLATE lpTemplateNameメンバを使用可にする
//OFN_ENABLETEMPLATEHANDLE ?
//OFN_EXPLORER 表示をエクスプローラ形式にする
//OFN_EXTENSIONDIFFERENT 拡張子がないときlpstrDefExtの拡張子を補充
//OFN_FILEMUSTEXIST 存在するファイル名でしか開けない
//OFN_HIDEREADONLY 読み込みのみのチェックボックスを隠す
//OFN_LONGNAMES ロングファイルネームに対応
//OFN_NOCHANGEDIR カレントディレクトリでダイアログを開く
//OFN_NODEREFERENCELINKS ショートカットのファイル名をダイレクトで表示
//OFN_NOLONGNAMES ロングファイルネームに対応しない
//OFN_NONETWORKBUTTON ネットワークボタンを返す
//OFN_NOREADONLYRETURN ?
//OFN_NOTESTFILECREATE ダイアログを閉じるとともにファイルを作成しない
//OFN_NOVALIDATE ?
//OFN_OVERWRITEPROMPT ファイルのオーバーライトを禁止する
//OFN_PATHMUSTEXIST 存在するファイル名、パスでしか開けない
//OFN_READONLY 読み込みのみのチェックボックスにチェックを入れる
//OFN_SHAREAWARE ?
//OFN_SHOWHELP ヘルプボタンを表示する
DWORD Flags;
WORD nFileOffset; //パスのはじめからファイル名までのオフセット
WORD nFileExtension; /パスのはじめからファイルの拡張子までのオフセット
LPCTSTR lpstrDefExt; ディフォルトの拡張子 例 "txt"
DWORD lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
}OPENFILENAME;
*/
void OpenFileDialog(HWND hwnd)
{
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "TXT files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
ofn.lpstrFile = (LPSTR)FileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST;
ofn.lpstrDefExt = NULL;
ofn.nMaxFileTitle = 64;
ofn.lpstrFileTitle = (LPSTR)FileTitle;
ofn.lpstrTitle = "File Open";
if(GetOpenFileName(&ofn)){
show = 1;
InvalidateRect(hwnd, NULL, TRUE);
}
return;
}