Rich Edit で縦書きに表示する

VC++ で Rich Edit を使って日本語の文章を縦書きに表示します。
この機能は Windows95(98,Me)では使えますが、残念ながら XP では使えないようです。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. プログラムは至って簡単です。
    以下のオプションを設定して Rich Edit に表示して下さい。
    hEdit は Rich Edit のハンドルです。
        LPARAM  flag;
    
        flag= ECO_AUTOHSCROLL | ECO_AUTOVSCROLL | ECO_NOHIDESEL | ECO_SAVESEL |
              ECO_WANTRETURN | ECO_VERTICAL;
        SendMessage(hEdit,EM_SETOPTIONS,(WPARAM)ECOOP_SET,flag);
        
  2. あとは今までと同じです。

全ソースコード

超初心者の方のために全ソースコードを掲載します。 (^_^;)

/***********************************************/
/*★ Rich Edit に TEXT を表示する    前田 稔 ★*/
/***********************************************/
#define     NAME    "Rich Edit"
#include    <windows.h>
#include    <richedit.h>
#include    <commctrl.h>
#pragma     comment(lib,"comctl32.lib")
#define     MAXFILESIZE  0x000FFFFF

HINSTANCE   g_hInst;
HWND        g_hWnd;
HINSTANCE   hRtfLib = NULL;       //Rich Edit DLL
HWND        hEdit   = NULL;       //Rich Edit Handle
char        buf[MAXFILESIZE];

//プロトタイプ宣言
LRESULT  CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);
int      PASCAL     WinMain(HINSTANCE, HINSTANCE, LPSTR, int);

//★ fname から最大 len バイトのデータを buf に読み込む
//   buf は buf+1 バイト以上の領域を確保すること
DWORD  ReadData(LPSTR fname, void *buf, DWORD len)
{   HANDLE  hFile;              //File Handle
    DWORD   dwBytes;            //入力(出力)長

    hFile = CreateFile(fname,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if (hFile==INVALID_HANDLE_VALUE)
    {   MessageBox(NULL,"ReadData Open Error[main.cpp]","ReadData",MB_OK);
        return 0;
    }
    SetFilePointer(hFile,0,0,FILE_BEGIN);
    ReadFile(hFile,buf,len,&dwBytes,NULL);
    *((u_char*)buf+dwBytes)= 0;
    CloseHandle(hFile);
    return dwBytes;
}

//★ Ritch Edit を生成する
void  CreateRich(HWND hwnd)
{   LPARAM  flag;

    InitCommonControls();       //コモンコントロールの DLL を初期化
    hRtfLib = LoadLibrary("RICHED32.DLL");
    hEdit   = CreateWindowEx( WS_EX_CLIENTEDGE,
                              "RICHEDIT",
                              "",
                              WS_CHILD | WS_VISIBLE |
                              WS_BORDER | ES_MULTILINE |
                              WS_VSCROLL | WS_HSCROLL |
                              ES_AUTOVSCROLL | ES_NOHIDESEL,
                              0, 0,
                              0, 0,
                              hwnd,
                              (HMENU)1,
                              g_hInst,
                              NULL );
    flag= ECO_AUTOHSCROLL | ECO_AUTOVSCROLL | ECO_NOHIDESEL | ECO_SAVESEL |
          ECO_WANTRETURN | ECO_VERTICAL;
    SendMessage(hEdit,EM_SETOPTIONS,(WPARAM)ECOOP_SET,flag);
    ReadData("test.txt",buf,MAXFILESIZE-1);
    SetWindowText(hEdit,buf);
    SetFocus(hEdit);
    return;
}

//★ CALLBACK 関数
LRESULT  CALLBACK  WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {   case WM_CREATE:
            CreateRich(hWnd);
            break;
        case WM_SIZE:
            if (hEdit)  MoveWindow(hEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
            break;
        case WM_DESTROY:
            DestroyWindow(hEdit);
            PostQuitMessage(0);
            return 0L;
    }
    return  DefWindowProc(hWnd,msg,wParam,lParam);
}

//★ Windows Main 関数
int PASCAL  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
{   MSG         msg;

    g_hInst= hInst;
    WNDCLASS wc = { CS_CLASSDC,WndProc,0L,0L,hInst,NULL,LoadCursor(NULL,IDC_ARROW),
                    (HBRUSH)GetStockObject(WHITE_BRUSH),NULL,NAME };
    if (RegisterClass(&wc)==0)      return FALSE;
    g_hWnd= CreateWindow(NAME,NAME,WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
            NULL,NULL,hInst,NULL);
    if (!g_hWnd)    return FALSE;

    ShowWindow(g_hWnd,nCmdShow);    //Window を表示
    UpdateWindow(g_hWnd);           //表示を初期化
    SetFocus(g_hWnd);               //フォーカスを設定
    while (GetMessage(&msg,NULL,0,0))
    {   TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return S_OK;                    //return 0
}

超初心者のプログラム入門(C言語 Windows)