ホームに戻る
 ファイルを開くダイアログ
 
#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;
}

inserted by FC2 system