word のように、というので、文字のサイズやフォンや色を変更できる
ものを作りたいのかと思って、それは難しいからと放置していたのですが、
メモ帳程度でよいのなら、エディットコントロールでできます。
コード:
#undef UNICODE
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h> // fopen, fclose, fread, fwrite, fseek, ftell
#include <stdlib.h> // malloc, free
char *fname, *text;
BOOL modified = FALSE;
HWND hEdit;
HINSTANCE hInst;
void onCreate(HWND hwnd)
{
hEdit = CreateWindowA("EDIT", NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL
| ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_LEFT | ES_MULTILINE,
10, 10, 600, 420, hwnd, (HMENU)1, hInst, NULL);
SetWindowText(hEdit, text);
}
void onDestroy()
{
if (modified) {
FILE *fp = fopen(fname, "wb");
if (fp) {
int size = GetWindowTextLength(hEdit);
char *p = (char *)malloc(size + 1);
if (p) {
size = GetWindowText(hEdit, p, size + 1);
fwrite(p, 1, size, fp);
fclose(fp);
free(p);
}
}
}
free(text);
PostQuitMessage(0);
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_CREATE: onCreate(hwnd); break;
case WM_DESTROY: onDestroy(); break;
case WM_COMMAND:
if (LOWORD(wp) == 1 && HIWORD(wp) == EN_UPDATE) modified = TRUE;
break;
default: return DefWindowProc(hwnd, msg, wp, lp);
}
return 0;
}
int WINAPI WinMain(HINSTANCE h, HINSTANCE prev, LPSTR cl, int cs)
{
if (*cl) {
fname = cl;
FILE *fp = fopen(fname, "rb");
if (!fp) {
MessageBox(NULL, "ファイルがオープンできない", "", 0);
return 0;
}
fseek(fp, 0, SEEK_END);
int size = ftell(fp);
rewind(fp);
text = (char *)malloc(size + 1);
if (!text) return 0;
size = fread(text, 1, size, fp);
text[size] = '\0';
fclose(fp);
}
else fname = (char *)"無題.txt";
hInst = h;
WNDCLASS wcl = { 0, WindowProc, 0, 0, h, NULL,
LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1), NULL, "wc" };
if (!RegisterClass(&wcl)) return FALSE;
if (!CreateWindowEx(WS_EX_COMPOSITED, "wc", fname,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
80, 60, 640, 480, NULL, NULL, h, NULL)) return 0;
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
コマンドラインの第1引数をファイル名とします。
Visual Studio で実行する場合は、
プロジェクトのプロパティの構成プロパティのデバッグの
コマンド引数に、ファイル名を書いてから実行してください。
エクスプローラで、ファイルを実行ファイルのアイコンに
ドラッグ&ドロップしても動きます。
終了するとき、テキストが修正されてればファイルを更新します。