ホームに戻る
 メモ帳

//memo.rc

#include "memo.h"

MEMOMENU MENU DISCARDABLE 
BEGIN
    POPUP "ファイル"
    BEGIN
        MENUITEM "新規作成", IDM_NEW
        MENUITEM "開く", IDM_OPEN
        MENUITEM "上書き保存", IDM_OVERWRITE
        MENUITEM "名前を付けて保存", IDM_WRITE
        MENUITEM SEPARATOR
        MENUITEM "終了", IDM_END
    END
END

以上の記述を memo.rc に書いて保存

#include <windows.h>
#include <windowsx.h>

#define ID_EDIT 100

#define IDM_NEW 1000
#define IDM_OPEN 1010
#define IDM_OVERWRITE 1020
#define IDM_WRITE 1030
#define IDM_END 1040

// ウィンドウプロシージャの宣言(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
  HWND hwnd,    //ウィンドウハンドル(void型ポインタ)
  UINT message,    //メッセージ識別番号(unsigned int)
  WPARAM wParam,    //(32ビットlong)
  LPARAM lParam);    //(32ビットlong)

//インスタンスのハンドル
HINSTANCE hInst;

//エディットのハンドル
HWND hEdit;

//エディット用バッファ
char szStr[1024 * 64];

//オープンするファイル名(フルパス)
char szFileName[MAX_PATH];
//オープンするファイル名
char szFile[64];

//ファイルのオープン
int OpenFile(HWND hwnd);
//ファイルへの書き込み
int WriteFile(HWND hwnd);
//ファイルへの上書き
int OverWriteFile(HWND hwnd);
//新規ファイル作成
int MakeNewFile(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 =  "MEMOMENU";
    //クラス名
    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,      //ウィンドウの幅(200に設定)
    100,      //ウィンドウの高さ(100に設定)
    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)
  {
  RECT r;

  switch (message) {
  //ウィンドウ生成に対する処理
    case WM_CREATE:
      GetClientRect(hwnd, &r);
      hEdit = CreateWindow(
      "EDIT",
      NULL,
      WS_CHILD | WS_VISIBLE | 
      ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL |
      ES_AUTOHSCROLL | WS_HSCROLL,
      0, 0,
      r.right, r.bottom,
      hwnd,
      (HMENU)ID_EDIT,
      hInst,
      NULL);
      SendMessage(hEdit, EM_SETLIMITTEXT, (WPARAM)1024*64, 0);
      break;
  //ウィンドウサイズ変更に対する処理
    case WM_SIZE:
      GetClientRect(hwnd, &r);
      MoveWindow(hEdit
        ,r.left
        ,r.top
        ,r.right
        ,r.bottom
        ,TRUE); //再描画のフラグ
      break;
  //メニューに対する処理
    case WM_COMMAND:
      switch(LOWORD(wParam)){
        case IDM_END: //終了
          SendMessage(hwnd, WM_CLOSE, 0, 0);
          break;
        case IDM_OPEN: //ファイルのオープン
          OpenFile(hwnd);
          break;
        case IDM_WRITE: //ファイルへの書き込み
          WriteFile(hwnd);
          break;
        case IDM_OVERWRITE: //ファイルへの上書き
          OverWriteFile(hwnd);
          break;
        case IDM_NEW: //新規ファイル作成
          MakeNewFile(hwnd);
          break;
      }
      break;
  //ウィンドウを描画するとき処理
    case WM_PAINT:
      {
      //表示する文字列
      char *s = "abc";
      //描画の準備
      PAINTSTRUCT ps;
      HDC hdc = BeginPaint(hwnd, &ps);
      //文字列の描画
      TextOut(hdc, 0, 0, s, strlen(s));
      //描画の終了
      EndPaint(hwnd, &ps);
      }
      break;

  //ウィンドウを破壊する時の処理
    case WM_DESTROY:
      //メイン関数のループを終了
      PostQuitMessage(0);
      break;

  //デフォルトの処理に対してデフォルトの処理を返す
    default:
      return DefWindowProc(hwnd, message, wParam, lParam);
  }
  return NULL;
}

//ファイルのオープン
int OpenFile(HWND hwnd)
{
  DWORD dwSize = NULL;
  OPENFILENAME ofn;
  HANDLE hFile;
  DWORD dwAccBytes;
  char szTitle[64], *szTitle_org = "memo[%s]";

  if(SendMessage(hEdit, EM_GETMODIFY, 0, 0) == TRUE){
    int id;
    id = MessageBox(hwnd,
    "文書が変更されています。保存しますか?",
    "注意!",
    MB_OKCANCEL);
    if (id == IDOK)
      WriteFile(hwnd);
    }

  //OPENFILENAME構造体を 0 で埋める
  memset(&ofn, 0, sizeof(OPENFILENAME));
  //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)szFileName;
  ofn.nMaxFile = MAX_PATH;
  ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  ofn.lpstrDefExt = NULL;
  ofn.nMaxFileTitle = 64;
  ofn.lpstrFileTitle = (LPSTR)szFile;
  ofn.lpstrTitle = "File Open";

  if(GetOpenFileName(&ofn) == 0)
    return -1;
  hFile = CreateFile(szFileName, GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  dwSize = GetFileSize(hFile, NULL);
  //ファイルサイズのチェック(通常エディットなので 64k まで)
  if(dwSize >= 1024*64){
    MessageBox(hwnd, "ファイルサイズが大きすぎます", "Too Big File!", MB_OK);
    CloseHandle(hFile);
    dwSize = 0L;
    return -1;
  }
  SetFilePointer(hFile //ファイルハンドル 
    ,0 //ファイルポインタを移動する距離
    ,0 //距離64ビット分の上位32ビット 
    ,FILE_BEGIN); //位置

  ReadFile(hFile //ファイルハンドル 
    ,szStr //データを受け取るバッファのアドレス
    ,dwSize //読み込むバイト数
    ,&dwAccBytes //読みとったバイト数
    ,NULL); //
  szStr[dwAccBytes] = '\0'; //読んだ文字列の最後に \0 をつける
  Edit_SetText(hEdit, szStr); //エディットに文字列を貼り付ける
  wsprintf(szTitle, szTitle_org, szFile);
  SetWindowText(hwnd, szTitle);
  CloseHandle(hFile); //ファイルハンドルを閉じる
  return 0;
}

//ファイルへの書き込み
int WriteFile(HWND hwnd)
{
  OPENFILENAME ofn;
  HANDLE hFile;
  DWORD dwAccBytes;
  char szTitle[64], *szTitle_org = "memo[%s]";
  int nLen;
    
  memset(szStr, '\0', sizeof(szStr));
  nLen = GetWindowTextLength(hEdit);
  GetWindowText(hEdit, szStr, nLen + 1);
    
  memset(&ofn, 0, sizeof(OPENFILENAME));
  ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
  ofn.hwndOwner = hwnd;
  ofn.lpstrFilter = "text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0";
  ofn.lpstrFile = (LPSTR)szFileName;
  ofn.lpstrFileTitle = (LPSTR)szFile;
  ofn.nFilterIndex = 1;
  ofn.nMaxFile = sizeof(szFileName);
  ofn.nMaxFileTitle = sizeof(szFile);
  ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
  ofn.lpstrDefExt = "txt";
  ofn.lpstrTitle = "Save File";

  if(GetSaveFileName(&ofn) == 0)
    return -1;
  hFile = CreateFile(szFileName //ファイル名
    //GENERIC_READ 読み込み用
    //GENERIC_WRITE 書き込み用
    //0 デバイス属性の問い合わせ
    ,GENERIC_WRITE //アクセスモード
    ,0 //複数のプログラムでファイルを共有しない
    ,0 //?
    ,OPEN_ALWAYS //作り方
    ,FILE_ATTRIBUTE_NORMAL //ファイルの属性
    ,NULL); //テンプレートファイル
  WriteFile(hFile //ファイルハンドル
    ,szStr //書き込む文字列
    ,strlen(szStr) + 1 //書き込むバイト数
    ,&dwAccBytes //書き込んだバイト数
    ,NULL); //
  wsprintf(szTitle, szTitle_org, szFile);
  SetWindowText(hwnd, szTitle);
  if(CloseHandle(hFile) == 0)
    MessageBox(hwnd, "Error CloseHandle", "Error", MB_OK);
  SendMessage(hEdit, EM_SETMODIFY, FALSE, 0);
  return 0;
}

//ファイルへの上書き
int OverWriteFile(HWND hwnd)
{
  HANDLE hFile;
  DWORD dwAccBytes;
  int nLen;

  //バッファを \0 で埋める
  memset(szStr, '\0', sizeof(szStr));
  nLen = GetWindowTextLength(hEdit);
  //バッファにエディットの内容を書き込む
  GetWindowText(hEdit, szStr, nLen + 1);

  hFile = CreateFile(szFileName
    ,GENERIC_WRITE
    ,0
    ,0
    ,OPEN_ALWAYS
    ,FILE_ATTRIBUTE_NORMAL
    ,NULL);
  WriteFile(hFile //ファイルハンドル
    ,szStr //書き込む文字列
    ,strlen(szStr) + 1 //書き込むバイト数
    ,&dwAccBytes //書き込んだバイト数
    ,NULL); //
    SendMessage(hEdit, EM_SETMODIFY, FALSE, 0);
    if(CloseHandle(hFile) == 0){
      MessageBox(hwnd, "Error CloseHandle", "Error", MB_OK);
      return -1;
    }
  return 0;
}

//新規ファイル作成
int MakeNewFile(HWND hwnd)
{
  char szTitle[64], *szTitle_org = "memo[%s]";

  if(SendMessage(hEdit, EM_GETMODIFY, 0, 0) == TRUE){
    int id;
    id = MessageBox(hwnd
    ,"文書が更新されています。保存しますか?"
    ,"注意"
    ,MB_YESNO | MB_ICONQUESTION);
    if(id == IDYES)
      WriteFile(hwnd);
  }
  wsprintf(szTitle, szTitle_org, "default");
  SetWindowText(hwnd, szTitle);
  strcpy(szStr, "");
  Edit_SetText(hEdit, szStr);
  return 0;
}

inserted by FC2 system