「メニューを表示する」の編集履歴(バックアップ)一覧はこちら
「メニューを表示する」(2014/05/11 (日) 00:23:37) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p><strong>FreeGlut のウインドウハンドルを取得してウインドウプロシージャを置き換えると<br />
win32api のメニューが使えます。</strong></p>
<p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&act=open&pageid=108&file=menu.png" /></strong></p>
<p>resource.h</p>
<table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td>#define IDR_MENU1 100<br />
#define ID_EXIT 101<br />
#define ID_TEST 102<br />
#define ID_A 103<br />
#define ID_B 104<br />
#define ID_Menu 105<br />
#define ID_Whats 106<br />
#define ID_Help 107</td>
</tr></tbody></table><p> menu.rc</p>
<table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td>
<p>#include "resource.h"</p>
<p>IDR_MENU1 MENU<br />
BEGIN<br />
POPUP "File"<br />
BEGIN<br />
MENUITEM "Exit", ID_EXIT<br />
END<br />
POPUP "Test"<br />
BEGIN<br />
MENUITEM "てすつ", ID_TEST<br />
END<br />
POPUP "Option"<br />
BEGIN<br />
MENUITEM "A", ID_A<br />
MENUITEM "B", ID_B<br />
MENUITEM "めにゅ~", ID_Menu<br />
MENUITEM "whats?", ID_Whats<br />
END<br />
MENUITEM "ヘルプ", ID_Help<br />
END</p>
</td>
</tr></tbody></table><p>main.cpp</p>
<table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td>
<p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")</p>
<p>#include <GL/freeglut/freeglut.h><br />
#include "resource.h"<br />
<br />
//FreeGlutのウインドウプロシージャを置き換える為の変数<br />
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ<br />
HWND hWnd2=NULL; //ウィンドウハンドル<br />
HMENU hMenu=NULL; //メニュー<br />
<br />
//Windowのサイズ<br />
int width = 320;<br />
int height = 240;<br />
<br />
//回転用<br />
float anglex = 0.0f;<br />
//白<br />
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };<br />
<br />
//置き換えた後のプロシージャ<br />
LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wParam , LPARAM
lParam){<br />
switch (msg) {<br />
case WM_SIZE:<br />
return 0;<br />
case WM_COMMAND:<br />
switch (LOWORD(wParam)){<br />
case ID_EXIT:<br />
PostQuitMessage(0);<br />
}<br />
return 0;<br />
case WM_DESTROY:<br />
exit(0);<br />
break;<br />
default:<br />
if(WndProc){<br />
return CallWindowProc(WndProc,hWnd , msg , wParam , lParam);<br />
}else{<br />
return DefWindowProc(hWnd,msg,wParam,lParam);<br />
}<br />
}<br />
}<br />
<br />
//ウィンドウの検索<br />
BOOL CALLBACK enumWindowsProc(HWND hWnd,LPARAM lParam){<br />
HANDLE hModule=(HANDLE)GetWindowLong(hWnd,GWL_HINSTANCE);<br />
if(GetModuleHandle(NULL)==hModule){<br />
wchar_t ClassName[256];<br />
GetClassNameW(hWnd,ClassName,sizeof(ClassName)/sizeof(ClassName[0]));<br />
if(wcsncmp(ClassName,L"FREEGLUT",wcslen(ClassName))==0){<br />
hWnd2=hWnd;<br />
return FALSE;<br />
}<br />
}<br />
return TRUE;<br />
}<br />
<br />
void display(void){<br />
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />
glViewport(0, 0, width, height);<br />
glMatrixMode(GL_PROJECTION);<br />
glLoadIdentity();<br />
<br />
gluPerspective(30.0, (double)width / (double)height, 1.0, 1000.0);<br />
glMatrixMode(GL_MODELVIEW);<br />
glLoadIdentity();<br />
<br />
gluLookAt(150.0,150.0,-150.0,<br />
0.0,0.0,0.0,<br />
0.0,1.0,0.0);<br />
<br />
glMaterialfv(GL_FRONT, GL_DIFFUSE, white);<br />
//回転<br />
glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転<br />
glutSolidSphere(40.0,16,16);<br />
<br />
<br />
glutSwapBuffers();<br />
}<br />
void idle(void){<br />
anglex+=2.0f;<br />
Sleep(1);<br />
glutPostRedisplay();<br />
}<br />
void Init(){<br />
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);<br />
glEnable(GL_DEPTH_TEST);<br />
//ワイヤーフレーム<br />
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);<br />
glutReshapeWindow(width,height);<br />
<br />
}<br />
void resize(int w, int h){<br />
glViewport(0, 0, w, h);<br />
//表示ウィンドウのサイズ<br />
width = w;<br />
height = h;<br />
}<br />
bool main(int argc, char *argv[]){<br />
glutInit(&argc, argv);<br />
glutInitWindowPosition(100, 100);<br />
glutInitWindowSize(width, height);<br />
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />
glutCreateWindow("メニュー表示");<br />
//FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える<br />
EnumWindows(enumWindowsProc,0);<br />
if(hWnd2){<br />
WndProc=(WNDPROC)GetWindowLong(hWnd2,GWL_WNDPROC);<br />
SetWindowLong(hWnd2,GWL_WNDPROC,(LONG)WndProc2);<br />
}else{<br />
return false;<br />
}<br />
hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1));<br />
if(hMenu){<br />
SetMenu(hWnd2,hMenu);<br />
}else{<br />
return false;<br />
}<br />
glutDisplayFunc(display);<br />
glutReshapeFunc(resize);<br />
glutIdleFunc(idle);<br />
Init();<br />
glutMainLoop();<br />
return true;<br />
}</p>
</td>
</tr></tbody></table><p> </p>
<p><strong>FreeGlut のウインドウハンドルを取得してウインドウプロシージャを置き換えると<br />
win32api のメニューが使えます。</strong></p>
<p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&act=open&pageid=108&file=menu.png" /></strong></p>
<p>resource.h</p>
<table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td>#define IDR_MENU1 100<br />
#define ID_EXIT 101<br />
#define ID_TEST 102<br />
#define ID_A 103<br />
#define ID_B 104<br />
#define ID_Menu 105<br />
#define ID_Whats 106<br />
#define ID_Help 107</td>
</tr></tbody></table><p> menu.rc</p>
<table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td>
<p>#include "resource.h"</p>
<p>IDR_MENU1 MENU<br />
BEGIN<br />
POPUP "File"<br />
BEGIN<br />
MENUITEM "Exit", ID_EXIT<br />
END<br />
POPUP "Test"<br />
BEGIN<br />
MENUITEM "てすつ", ID_TEST<br />
END<br />
POPUP "Option"<br />
BEGIN<br />
MENUITEM "A", ID_A<br />
MENUITEM "B", ID_B<br />
MENUITEM "めにゅ~", ID_Menu<br />
MENUITEM "whats?", ID_Whats<br />
END<br />
MENUITEM "ヘルプ", ID_Help<br />
END</p>
</td>
</tr></tbody></table><p>main.cpp</p>
<table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td>
<p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")</p>
<p>#include <GL/freeglut/freeglut.h><br />
#include "resource.h"<br />
<br />
//FreeGlutのウインドウプロシージャを置き換える為の変数<br />
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ<br />
HWND hWnd2=NULL; //ウィンドウハンドル<br />
HMENU hMenu=NULL; //メニュー<br />
<br />
//Windowのサイズ<br />
int width = 320;<br />
int height = 240;<br />
<br />
//回転用<br />
float anglex = 0.0f;<br />
//白<br />
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };<br />
<br />
//置き換えた後のプロシージャ<br />
LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wParam , LPARAM
lParam){<br />
switch (msg) {<br />
case WM_SIZE:<br />
return 0;<br />
case WM_COMMAND:<br />
switch (LOWORD(wParam)){<br />
case ID_EXIT:<br />
PostQuitMessage(0);<br />
}<br />
return 0;<br />
case WM_DESTROY:<br />
exit(0);<br />
break;<br />
default:<br />
if(WndProc){<br />
return CallWindowProc(WndProc,hWnd , msg , wParam , lParam);<br />
}else{<br />
return DefWindowProc(hWnd,msg,wParam,lParam);<br />
}<br />
}<br />
}<br />
<br />
//ウィンドウの検索<br />
BOOL CALLBACK enumWindowsProc(HWND hWnd,LPARAM lParam){<br />
HANDLE hModule=(HANDLE)GetWindowLong(hWnd,GWL_HINSTANCE);<br />
if(GetModuleHandle(NULL)==hModule){<br />
wchar_t ClassName[256];<br />
GetClassNameW(hWnd,ClassName,sizeof(ClassName)/sizeof(ClassName[0]));<br />
if(wcsncmp(ClassName,L"FREEGLUT",wcslen(ClassName))==0){<br />
hWnd2=hWnd;<br />
return FALSE;<br />
}<br />
}<br />
return TRUE;<br />
}<br />
<br />
void display(void){<br />
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />
glViewport(0, 0, width, height);<br />
glMatrixMode(GL_PROJECTION);<br />
glLoadIdentity();<br />
<br />
gluPerspective(30.0, (double)width / (double)height, 1.0, 1000.0);<br />
glMatrixMode(GL_MODELVIEW);<br />
glLoadIdentity();<br />
<br />
gluLookAt(150.0,150.0,-150.0,<br />
0.0,0.0,0.0,<br />
0.0,1.0,0.0);<br />
<br />
glMaterialfv(GL_FRONT, GL_DIFFUSE, white);<br />
//回転<br />
glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転<br />
glutSolidSphere(40.0,16,16);<br />
<br />
glutSwapBuffers();<br />
}<br />
void idle(void){<br />
anglex+=2.0f;<br />
Sleep(1);<br />
glutPostRedisplay();<br />
}<br />
void Init(){<br />
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);<br />
glEnable(GL_DEPTH_TEST);<br />
//ワイヤーフレーム<br />
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);<br />
}<br />
bool main(int argc, char *argv[]){<br />
glutInit(&argc, argv);<br />
glutInitWindowPosition(100, 100);<br />
glutInitWindowSize(width, height);<br />
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />
glutCreateWindow("メニュー表示");<br />
//FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える<br />
EnumWindows(enumWindowsProc,0);<br />
if(hWnd2){<br />
WndProc=(WNDPROC)GetWindowLong(hWnd2,GWL_WNDPROC);<br />
SetWindowLong(hWnd2,GWL_WNDPROC,(LONG)WndProc2);<br />
}else{<br />
return false;<br />
}<br />
hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1));<br />
if(hMenu){<br />
SetMenu(hWnd2,hMenu);<br />
}else{<br />
return false;<br />
}<br />
glutDisplayFunc(display);<br />
glutIdleFunc(idle);<br />
Init();<br />
glutMainLoop();<br />
return true;<br />
}</p>
</td>
</tr></tbody></table><p> </p>