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