ポップアップメニューを表示する

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

ポップアップメニューを表示する」(2014/05/16 (金) 13:18:53) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<p><strong>右クリックでポップアップメニューを表示します。</strong></p> <p><strong><img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=115&amp;file=popup.png" /></strong></p> <p>resource.h</p> <table border="1" cellspacing="1" cellpadding="1" width="600"><tbody><tr><td>#define IDR_MENU1  100<br /> #define ID_EXIT   101<br /> #define ID_Dialog  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<br /> #define ID_STATUS  108<br /> #define ID_TEXT   109<br /> #define ID_1   110<br /> #define ID_2   111<br /> #define ID_3   112<br /> #define ID_popup  113<br /> #define IDM_END   114</td> </tr></tbody></table><p>menu.rc</p> <table border="1" cellspacing="1" cellpadding="1" width="600"><tbody><tr><td> <p>#include "windows.h"<br /> #include "resource.h"</p> <p>IDR_MENU1 MENU<br /> BEGIN<br />     POPUP "File"<br />     BEGIN<br />         MENUITEM "Exit",    ID_EXIT<br />     END<br />     POPUP "Dialog"<br />     BEGIN<br />         MENUITEM "ダイアログ",    ID_Dialog<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> <p>OPTDLG DIALOG DISCARDABLE  0, 0, 121, 69<br /> STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU<br /> CAPTION "オプション"<br /> FONT 9, "MS Pゴシック"<br /> BEGIN<br />     DEFPUSHBUTTON   "OK",IDOK,7,38,50,14<br />     PUSHBUTTON      "キャンセル",IDCANCEL,61,37,50,14<br />     LTEXT           "ダイアログです。",ID_TEXT,36,19,48,8<br /> END</p> <p>POPUP MENU DISCARDABLE<br /> BEGIN<br />     POPUP "ダミー"<br />     BEGIN<br />         MENUITEM "終了",      IDM_END<br />         POPUP "オプション"<br />         BEGIN<br />             MENUITEM "1番目",                  ID_1<br />             MENUITEM "2番目",                  ID_2<br />             MENUITEM "3番目",       ID_3<br />             MENUITEM "popup",                  ID_popup<br />         END<br />     END<br /> END</p> </td> </tr></tbody></table><p>main.cpp</p> <table border="1" cellspacing="1" cellpadding="1" width="600"><tbody><tr><td> <p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #pragma comment(lib, "comctl32.lib")<br /> #include &lt;GL/freeglut/freeglut.h&gt;<br /> #include "resource.h"<br /> #include &lt;commctrl.h&gt; //CreateStatusWindow()のために必要</p> <p><br /> //FreeGlutのウインドウプロシージャを置き換える為の変数<br /> WNDPROC WndProc=NULL; //元のウィンドウプロシージャ<br /> HWND hWnd2=NULL; //ウィンドウハンドル<br /> HMENU hMenu=NULL; //メニュー<br /> HWND hStatusbar;     // ステータスバーのハンドル<br /> HINSTANCE hInstance;    //インスタンスハンドル</p> <p><br /> #define WIDTH 320<br /> #define HEIGHT 240</p> <p>//回転用<br /> float anglex = 0.0f;<br /> //白<br /> GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };</p> <p>LRESULT CALLBACK DlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)<br /> {<br />     switch (msg) {<br />         case WM_INITDIALOG:<br />             return FALSE;<br />         case WM_COMMAND:<br />             switch (LOWORD(wp)) {<br />                 case IDOK:<br />                     EndDialog(hDlgWnd, IDOK);<br />                     break;<br />                 case IDCANCEL:<br />                     EndDialog(hDlgWnd, IDCANCEL);<br />                     break;<br />                 default:<br />                     return FALSE;<br />             }<br />         default:<br />             return FALSE;<br />     }<br />     return TRUE;<br /> }</p> <p><br /> //置き換えた後のプロシージャ<br /> LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp)<br /> {<br />  POINT pt;<br />  HMENU hmenu,hSubmenu;<br />  switch( msg ){<br />  case WM_RBUTTONDOWN:<br />             pt.x = LOWORD(lp);<br />             pt.y = HIWORD(lp);<br />             hmenu = LoadMenu((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), L"POPUP");<br />             hSubmenu = GetSubMenu(hmenu, 0);<br />             ClientToScreen(hWnd, &amp;pt);<br />             TrackPopupMenu(hSubmenu, TPM_LEFTALIGN, pt.x, pt.y, 0, hWnd, NULL);<br />             DestroyMenu(hmenu);<br />             return 0;<br />  case WM_SIZE:<br />   SendMessage( hStatusbar, WM_SIZE, wp, lp );<br />   return 0;<br />  case WM_COMMAND:<br />   switch (LOWORD(wp)){<br />   case ID_Dialog:<br />    DialogBox(hInstance, L"OPTDLG", hWnd, (DLGPROC)DlgProc);<br />    break;<br />   case ID_EXIT:<br />    PostQuitMessage(0);<br />    break;<br />   }<br />   return 0;<br />  case WM_DESTROY:<br />   exit(0);<br />   break;<br />  default:<br />   if(WndProc){<br />    return CallWindowProc(WndProc,hWnd , msg , wp , lp);<br />   }else{<br />    return DefWindowProc(hWnd,msg,wp,lp);<br />   }<br />  }<br /> }</p> <p>//ウィンドウの検索<br /> BOOL CALLBACK enumWindowsProc(HWND hWnd,LPARAM lParam)<br /> {<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 /> }</p> <p>void display(void)<br /> {<br />  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glViewport(0, 0, WIDTH, HEIGHT);<br />  glMatrixMode(GL_PROJECTION);<br />  glLoadIdentity();</p> <p> gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);<br />  glMatrixMode(GL_MODELVIEW);<br />     glLoadIdentity();</p> <p> gluLookAt(150.0,150.0,-150.0,<br />       0.0,0.0,0.0,<br />      0.0,1.0,0.0);</p> <p> glMaterialfv(GL_FRONT, GL_DIFFUSE, white);<br />  //回転<br />  glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転<br />  glutSolidSphere(40.0,16,16);</p> <p> glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  anglex+=0.02f;<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);</p> <p>}<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<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 />  //メニューを作成<br />  hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1));<br />  if(hMenu){<br />  SetMenu(hWnd2,hMenu);<br />  }else{<br />  return false;<br />  }<br />  // コモンコントロール関係の初期化<br />  InitCommonControls();<br />  // ステータスバーを作成<br />  hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,<br />    L"ステータスバー",hWnd2,ID_STATUS);<br />  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />  glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>
<p><strong>右クリックでポップアップメニューを表示します。</strong></p> <p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=115&amp;file=popup.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_Dialog  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<br /> #define ID_STATUS  108<br /> #define ID_TEXT   109<br /> #define ID_1   110<br /> #define ID_2   111<br /> #define ID_3   112<br /> #define ID_popup  113<br /> #define IDM_END   114</td> </tr></tbody></table><p>menu.rc</p> <table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td> <p>#include "windows.h"<br /> #include "resource.h"</p> <p>IDR_MENU1 MENU<br /> BEGIN<br />     POPUP "File"<br />     BEGIN<br />         MENUITEM "Exit",    ID_EXIT<br />     END<br />     POPUP "Dialog"<br />     BEGIN<br />         MENUITEM "ダイアログ",    ID_Dialog<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> <p>OPTDLG DIALOG DISCARDABLE  0, 0, 121, 69<br /> STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU<br /> CAPTION "オプション"<br /> FONT 9, "MS Pゴシック"<br /> BEGIN<br />     DEFPUSHBUTTON   "OK",IDOK,7,38,50,14<br />     PUSHBUTTON      "キャンセル",IDCANCEL,61,37,50,14<br />     LTEXT           "ダイアログです。",ID_TEXT,36,19,48,8<br /> END</p> <p>POPUP MENU DISCARDABLE<br /> BEGIN<br />     POPUP "ダミー"<br />     BEGIN<br />         MENUITEM "終了",      IDM_END<br />         POPUP "オプション"<br />         BEGIN<br />             MENUITEM "1番目",                  ID_1<br />             MENUITEM "2番目",                  ID_2<br />             MENUITEM "3番目",       ID_3<br />             MENUITEM "popup",                  ID_popup<br />         END<br />     END<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")<br /> #pragma comment(lib, "comctl32.lib")<br /> #include &lt;GL/freeglut/freeglut.h&gt;<br /> #include "resource.h"<br /> #include &lt;commctrl.h&gt; //CreateStatusWindow()のために必要</p> <p><br /> //FreeGlutのウインドウプロシージャを置き換える為の変数<br /> WNDPROC WndProc=NULL; //元のウィンドウプロシージャ<br /> HWND hWnd2=NULL; //ウィンドウハンドル<br /> HMENU hMenu=NULL; //メニュー<br /> HWND hStatusbar;     // ステータスバーのハンドル<br /> HINSTANCE hInstance;    //インスタンスハンドル</p> <p><br /> //Windowのサイズ<br /> int width = 320;<br /> int height = 240;</p> <p>//回転用<br /> float anglex = 0.0f;<br /> //白<br /> GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };</p> <p>LRESULT CALLBACK DlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp){<br />     switch (msg) {<br />         case WM_INITDIALOG:<br />             return FALSE;<br />         case WM_COMMAND:<br />             switch (LOWORD(wp)) {<br />                 case IDOK:<br />                     EndDialog(hDlgWnd, IDOK);<br />                     break;<br />                 case IDCANCEL:<br />                     EndDialog(hDlgWnd, IDCANCEL);<br />                     break;<br />                 default:<br />                     return FALSE;<br />             }<br />         default:<br />             return FALSE;<br />     }<br />     return TRUE;<br /> }</p> <p><br /> //置き換えた後のプロシージャ<br /> LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp){<br />  POINT pt;<br />  HMENU hmenu,hSubmenu;<br />  switch( msg ){<br />  case WM_RBUTTONDOWN:<br />   pt.x = LOWORD(lp);<br />   pt.y = HIWORD(lp);<br />   hmenu = LoadMenu((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), L"POPUP");<br />   hSubmenu = GetSubMenu(hmenu, 0);<br />   ClientToScreen(hWnd, &amp;pt);<br />   TrackPopupMenu(hSubmenu, TPM_LEFTALIGN, pt.x, pt.y, 0, hWnd, NULL);<br />   DestroyMenu(hmenu);<br />   return 0;<br />  case WM_SIZE:<br />   SendMessage( hStatusbar, WM_SIZE, wp, lp );<br />   return 0;<br />  case WM_COMMAND:<br />   switch (LOWORD(wp)){<br />   case ID_Dialog:<br />    DialogBox(hInstance, L"OPTDLG", hWnd, (DLGPROC)DlgProc);<br />    break;<br />   case ID_EXIT:<br />    PostQuitMessage(0);<br />    break;<br />   }<br />   return 0;<br />  case WM_DESTROY:<br />   exit(0);<br />   break;<br />  default:<br />   if(WndProc){<br />    return CallWindowProc(WndProc,hWnd , msg , wp , lp);<br />   }else{<br />    return DefWindowProc(hWnd,msg,wp,lp);<br />   }<br />  }<br /> }</p> <p>//ウィンドウの検索<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 /> }</p> <p>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();</p> <p> gluPerspective(30.0, (double)width / (double)height, 1.0, 1000.0);<br />  glMatrixMode(GL_MODELVIEW);<br />     glLoadIdentity();</p> <p> gluLookAt(150.0,150.0,-150.0,<br />       0.0,0.0,0.0,<br />      0.0,1.0,0.0);</p> <p> glMaterialfv(GL_FRONT, GL_DIFFUSE, white);<br />  //回転<br />  glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転<br />  glutSolidSphere(40.0,16,16);</p> <p> 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 />  //メニューを作成<br />  hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1));<br />  if(hMenu){<br />   SetMenu(hWnd2,hMenu);<br />  }else{<br />   return false;<br />  }<br />  // コモンコントロール関係の初期化<br />  InitCommonControls();<br />  // ステータスバーを作成<br />  hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,<br />    L"ステータスバー",hWnd2,ID_STATUS);<br />  glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return true;<br /> }</p> </td> </tr></tbody></table><p> </p>

表示オプション

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