「ポップアップメニューを表示する」の編集履歴(バックアップ)一覧はこちら
「ポップアップメニューを表示する」(2014/05/16 (金) 13:18:53) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p><strong>右クリックでポップアップメニューを表示します。</strong></p>
<p><strong><img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=115&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 <GL/freeglut/freeglut.h><br />
#include "resource.h"<br />
#include <commctrl.h> //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, &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(&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&act=open&pageid=115&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 <GL/freeglut/freeglut.h><br />
#include "resource.h"<br />
#include <commctrl.h> //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, &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(&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>