ホームに戻る
メモ帳
//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;
}