ホームに戻る
リッチエディットの使用
#include <windows.h>
#define FILENAME "test.txt"
#define EDIT_SIZE 1024 * 256
char buffer[EDIT_SIZE];
// ウィンドウプロシージャの宣言(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd, //ウィンドウハンドル(void型ポインタ)
UINT message, //メッセージ識別番号(unsigned int)
WPARAM wParam, //(32ビットlong)
LPARAM lParam); //(32ビットlong)
//インスタンスのハンドル
HINSTANCE hInst;
//メイン関数
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;
}
DWORD CALLBACK EditReadProc(DWORD dwCookie, LPBYTE pbBuf, LONG cb, LONG *pcb)
{
ReadFile((HANDLE)dwCookie, pbBuf, cb, (LPDWORD)pcb, NULL);
return(FALSE);
}
DWORD CALLBACK WriteSaveProc(DWORD dwCookie, LPBYTE pbbuf, LONG cb, LONG *pcb)
{
if (WriteFile((HANDLE)dwCookie, pbbuf, cb, (LPDWORD)pcb, NULL))
return FALSE;
else
return TRUE;
}
int str_length(char *s){
int i;
for(i = 0;;i++){
if(s[i] == '\0'){
break;
}
}
return i;
}
int AddText(HWND hEdit, char *s){
int i;
int nLen;
nLen = GetWindowTextLength(hEdit);
if(nLen + str_length(s) + 3 > EDIT_SIZE){
return 0;
}
GetWindowText(hEdit, buffer, nLen + 1);
for(i = 0;;i++){
if(s[i] == '\0'){
break;
}
buffer[nLen + i] = s[i];
}
buffer[nLen + i + 0] = '\r';
buffer[nLen + i + 1] = '\n';
buffer[nLen + i + 2] = '\0';
SetWindowText(hEdit, buffer);
return 1;
}
// ウィンドウプロシージャ(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
static HINSTANCE hDllHandle;
static HWND hEdit;
switch (message) {
//ウィンドウ生成に対する処理
case WM_CREATE:
{
HANDLE hFile;
EDITSTREAM eds;
//エディットの表示
hDllHandle = LoadLibrary("RICHED32.DLL");
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
"RICHEDIT",
"",
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE |
WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
0, 0, 0, 0,
hwnd,
(HMENU)1,
hInst,
NULL);
SendMessage(hEdit, EM_EXLIMITTEXT, 0, (LPARAM)EDIT_SIZE);
hFile = CreateFile(FILENAME, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE){
break;
}
eds.dwCookie = (DWORD)hFile;
eds.dwError = 0;
eds.pfnCallback = EditReadProc;
SendMessage(hEdit, EM_STREAMIN, SF_TEXT, (LPARAM)&eds);
CloseHandle(hFile);
AddText(hEdit, "add_text.");
}
break;
//ウィンドウサイズ変更に対する処理
case WM_SIZE:
RECT r;
GetClientRect(hwnd, &r);
MoveWindow(hEdit
,r.left
,r.top
,r.right
,r.bottom
,TRUE); //再描画のフラグ
break;
case WM_COMMAND:
switch(HIWORD(wParam)){
case EN_MAXTEXT:
MessageBox(hwnd, "OVER MAX_SIZE", "ALERT!", MB_OK);
SetFocus(hEdit);
break;
default:
break;
}
break;
//ウィンドウを描画するとき処理
case WM_PAINT:
break;
//ウィンドウを破壊する時の処理
case WM_DESTROY:
{
HANDLE hFile;
EDITSTREAM eds;
if(SendMessage(hEdit, EM_GETMODIFY, 0, 0)){
hFile = CreateFile(FILENAME, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL);
eds.dwCookie = (DWORD)hFile;
eds.dwError = 0;
eds.pfnCallback = WriteSaveProc;
SendMessage(hEdit, EM_STREAMOUT, (WPARAM)SF_TEXT, (LPARAM)&eds);
CloseHandle(hFile);
}
FreeLibrary(hDllHandle);
//メイン関数のループを終了
PostQuitMessage(0);
}
break;
//デフォルトの処理に対してデフォルトの処理を返す
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return NULL;
}