リッチテキストエディットコントロールを表示する

リッチテキストエディットです。
頑張ればWordもどきも作れるかも知れませんね。

resource.h

#define IDR_MENU1  100
#define IDM_END 101
#define IDM_FONT 102
#define ID_STATUS  108

menu.rc

#include "resource.h"

IDR_MENU1 MENU DISCARDABLE
BEGIN
    POPUP "ファイル"
    BEGIN
        MENUITEM "終了",                    IDM_END
    END
    POPUP "編集"
    BEGIN
        MENUITEM "フォントの変更",          IDM_FONT
    END
END

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib, "comctl32.lib")
#include <windows.h>
#include <GL/freeglut/freeglut.h>
#include "resource.h"
#include <commctrl.h> //CreateStatusWindow()のために必要
#include <richedit.h>

//FreeGlutのウインドウプロシージャを置き換える為の変数
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ
HWND hWnd2=NULL; //ウィンドウハンドル
HMENU hMenu=NULL; //メニュー
HWND hStatusbar;     // ステータスバーのハンドル

HINSTANCE hRtLib;
HWND hEdit;
DWORD Mask; //CHARFORMATで使うマスク値

#define WIDTH 640
#define HEIGHT 480
 
//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };

 //最初のフォントの設定
BOOL SetInitialFont(HWND hEdit){
    CHARFORMAT cfm;
    memset(&cfm, 0, sizeof(CHARFORMAT));
    cfm.cbSize = sizeof(CHARFORMAT);
    cfm.dwMask = CFM_BOLD | CFM_CHARSET | CFM_COLOR |
        CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_STRIKEOUT |
        CFM_UNDERLINE;
    Mask = cfm.dwMask;
    cfm.bCharSet = SHIFTJIS_CHARSET;
    wcscpy(cfm.szFaceName, L"MS ゴシック");
    if (SendMessage(hEdit, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD,
        (LPARAM)&cfm) == 0) {
        MessageBox(hEdit, L"EM_SETCHARFORMAT失敗です", L"Error", MB_OK);
        return FALSE;
    }
    return TRUE;
}
BOOL SetFont(HWND hEdit){
    CHARFORMAT cfm;
    CHOOSEFONT cf;
    LOGFONT lf;
    HDC hDC;

    memset(&cf, 0, sizeof(CHOOSEFONT));
    memset(&lf, 0, sizeof(LOGFONT));
    cfm.cbSize = sizeof(CHARFORMAT);
   

    //今までの設定を取得してそれをCHOOSEFONT構造体に渡す
    SendMessage(hEdit, EM_GETCHARFORMAT, TRUE, (LPARAM)&cfm);
    hDC = GetDC(hEdit);
    lf.lfHeight = MulDiv(cfm.yHeight,
        GetDeviceCaps(hDC, LOGPIXELSY), -1440);
    ReleaseDC(hEdit, hDC);
    cfm.dwMask = Mask;
    if (cfm.dwEffects & CFE_BOLD)
        lf.lfWeight = FW_BOLD;
    else
        lf.lfWeight = FW_NORMAL;
    if (cfm.dwEffects & CFE_ITALIC)
        lf.lfItalic = TRUE;
    if (cfm.dwEffects & CFE_UNDERLINE)
        lf.lfUnderline = TRUE;
    if (cfm.dwEffects & CFE_STRIKEOUT)
        lf.lfStrikeOut = TRUE;
    lf.lfCharSet = cfm.bCharSet;
    lf.lfQuality = DEFAULT_QUALITY;
    lf.lfPitchAndFamily = cfm.bPitchAndFamily;
    wcscpy( lf.lfFaceName, cfm.szFaceName );
    cf.rgbColors = cfm.crTextColor;
    cf.lStructSize = sizeof(CHOOSEFONT);
    cf.hwndOwner = hEdit;
    cf.lpLogFont = &lf;
    cf.Flags = CF_SCREENFONTS | CF_EFFECTS | CF_INITTOLOGFONTSTRUCT;
   
    //フォント選択ダイアログを出して新しい設定を取得する
    if (ChooseFont(&cf))
    {
        cfm.cbSize = sizeof(CHARFORMAT);
        cfm.dwMask = Mask;
        cfm.yHeight = 2 * cf.iPointSize;
        cfm.dwEffects = 0;
        if (lf.lfWeight >= FW_BOLD)
            cfm.dwEffects |= CFE_BOLD;
        if (lf.lfItalic)
            cfm.dwEffects |= CFE_ITALIC;
        if (lf.lfUnderline)
            cfm.dwEffects |= CFE_UNDERLINE;
        if (lf.lfStrikeOut)
            cfm.dwEffects |= CFE_STRIKEOUT;
        cfm.crTextColor = (COLORREF)cf.rgbColors;
        cfm.bPitchAndFamily = lf.lfPitchAndFamily;
        cfm.bCharSet = lf.lfCharSet;
        wcscpy(cfm.szFaceName, lf.lfFaceName);
        if(SendMessage(hEdit, EM_SETCHARFORMAT,
            SCF_SELECTION, (LPARAM)&cfm) == 0) {
            MessageBox(hEdit, L"失敗です", L"Error", MB_OK);
            return FALSE;
        }
    }
    SetFocus(hEdit);
    return TRUE;
}
//置き換えた後のプロシージャ
LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){
 switch( msg ){
  case WM_SIZE:
   SendMessage( hStatusbar, WM_SIZE, wParam, lParam );
   return 0;
  case WM_COMMAND:
   switch (LOWORD(wParam)){
    case IDM_FONT:
     SetFont(hEdit);
     break;
    case IDM_END:
     PostQuitMessage(0);
     break;
   }
   return 0;
  case WM_DESTROY:
   exit(0);
   break;
  default:
   if(WndProc){
    return CallWindowProc(WndProc,hWnd , msg , wParam , lParam);
   }else{
    return DefWindowProc(hWnd,msg,wParam,lParam);
  }
 }
}
 
//ウィンドウの検索
BOOL CALLBACK enumWindowsProc(HWND hWnd,LPARAM lParam){
 HANDLE hModule=(HANDLE)GetWindowLong(hWnd,GWL_HINSTANCE);
 if(GetModuleHandle(NULL)==hModule){
  wchar_t ClassName[256];
  GetClassNameW(hWnd,ClassName,sizeof(ClassName)/sizeof(ClassName[0]));
  if(wcsncmp(ClassName,L"FREEGLUT",wcslen(ClassName))==0){
   hWnd2=hWnd;
   return FALSE;
  }
 }
 return TRUE;
}
 
void display(void){
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glViewport(0, 0, WIDTH, HEIGHT);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 
 gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 
 gluLookAt(150.0,150.0,-150.0,
       0.0,0.0,0.0,
      0.0,1.0,0.0);
 
 glMaterialfv(GL_FRONT, GL_DIFFUSE, white);
 //回転
 glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転
 glutSolidSphere(40.0,16,16);
 
 glutSwapBuffers();
}
void idle(void){
 anglex+=2.0f;
 Sleep(1);
 glutPostRedisplay();
}
void Init(){
 glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
 glEnable(GL_DEPTH_TEST);
 //ワイヤーフレーム
 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}
bool main(int argc, char *argv[]){
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("リッチテキストエディット");
 //FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える
 EnumWindows(enumWindowsProc,0);
 if(hWnd2){
  WndProc=(WNDPROC)GetWindowLong(hWnd2,GWL_WNDPROC);
  SetWindowLong(hWnd2,GWL_WNDPROC,(LONG)WndProc2);
 }else{
  return false;
 }
 //メニューを作成
 hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1));
 if(hMenu){
  SetMenu(hWnd2,hMenu);
 }else{
  return false;
 }
 // コモンコントロール関係の初期化
 InitCommonControls();
 // ステータスバーを作成
 hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
   L"文章をドラッグで選択後、メニューの編集でフォントの色や書式を変更できます。",hWnd2,ID_STATUS);

 hRtLib = LoadLibrary(L"RICHED32.DLL");
 hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, L"RICHEDIT", L"",
  WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE |WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
  0, 0,450, 350, hWnd2, (HMENU)1, (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE), NULL);
 SetInitialFont(hEdit);

 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return true;
}

 

 

 

 

 

最終更新:2014年06月14日 14:47
添付ファイル