メニューを表示する

「メニューを表示する」の編集履歴(バックアップ)一覧はこちら

メニューを表示する」(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&amp;act=open&amp;pageid=108&amp;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 &lt;GL/freeglut/freeglut.h&gt;<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(&amp;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&amp;act=open&amp;pageid=108&amp;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 &lt;GL/freeglut/freeglut.h&gt;<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(&amp;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>

表示オプション

横に並べて表示:
変化行の前後のみ表示: