#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib, "comctl32.lib")
#include <GL/freeglut/freeglut.h>
#include "resource.h"
#include <commctrl.h> //CreateStatusWindow()のために必要
//FreeGlutのウインドウプロシージャを置き換える為の変数
WNDPROC WndProc = NULL; //元のウィンドウプロシージャ
HWND hWnd2 = NULL; //ウィンドウハンドル
HMENU hMenu = NULL; //メニュー
HWND hStatusbar; // ステータスバーのハンドル
//Windowのサイズ
int width = 640;
int height = 480;
//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
//置き換えた後のプロシージャ
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 ID_EXIT:
PostQuitMessage(0);
}
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 = (__int64*)GetWindowLongPtr(hWnd, GWLP_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);
}
int main(int argc, char* argv[]) {
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(width, height);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow("メッセージボックス");
//FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える
EnumWindows(enumWindowsProc, 0);
if (hWnd2) {
WndProc = (WNDPROC)(__int64)GetWindowLongW(hWnd2, GWLP_WNDPROC);
SetWindowLongW(hWnd2, GWLP_WNDPROC, (LONG)(LRESULT)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);
MessageBox(hWnd2, L"メッセージボックスです。", L"タイトル", MB_OK);
glutDisplayFunc(display);
glutIdleFunc(idle);
Init();
glutMainLoop();
return true;
}
|