ホームに戻る
 リッチエディットの使用

#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;
}

inserted by FC2 system