「シェブロンを表示する」の編集履歴(バックアップ)一覧はこちら
「シェブロンを表示する」(2014/06/14 (土) 15:15:56) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p><strong>シェブロンデース</strong></p>
<div><strong><br /></strong></div>
<div><strong>レバーコントロールで隠されてしまったコントロールを</strong></div>
<div><strong>ポップアップメニューで表示します。</strong></div>
<p><img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=209&file=che.png" /></p>
<p>resource.h</p>
<table width="600" border="1" cellspacing="1" cellpadding="1"><tbody><tr><td><span style="font-size:small;"> #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<br />
#define ID_STATUS 108<br />
#define ID_TOOLBAR 109<br />
<br />
#define IDM_NEW 1010<br />
#define IDM_OPEN 1020<br />
#define IDM_SAVE 1030<br />
#define IDM_COPY 1040<br />
#define IDM_PASTE 1050<br />
#define IDM_DELETE 1060<br />
#define IDM_CUT 1070<br />
#define IDM_FIND 1080<br />
#define IDM_HELP 1090<br />
#define IDM_PRINT 1110<br />
#define IDM_REDOW 1120<br />
#define IDM_REPLACE 1130<br />
#define ID_REBAR 1140<br />
#define ID_TOOL1 1150<br />
#define ID_TOOL2 1160</span></td>
</tr></tbody></table><p>menu.rc</p>
<table width="600" border="1" cellspacing="1" cellpadding="1"><tbody><tr><td>
<p><span style="font-size:small;"> #include "resource.h"</span></p>
<p><span style="font-size:small;"> 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</span></p>
<p><span style="font-size:small;">FILE MENU DISCARDABLE<br />
BEGIN<br />
POPUP "ダミー"<br />
BEGIN<br />
MENUITEM "新規作成", IDM_NEW<br />
MENUITEM "開く", IDM_OPEN<br />
MENUITEM "上書き保存", IDM_SAVE<br />
MENUITEM "コピー", IDM_COPY<br />
MENUITEM "切り取り", IDM_CUT<br />
MENUITEM "削除", IDM_DELETE<br />
END<br />
END</span></p>
<p><span style="font-size:small;">EDIT MENU DISCARDABLE<br />
BEGIN<br />
POPUP "ダミー"<br />
BEGIN<br />
MENUITEM "検索", IDM_FIND<br />
MENUITEM "ヘルプ", IDM_HELP<br />
MENUITEM "貼り付け", IDM_PASTE<br />
MENUITEM "印刷", IDM_PRINT<br />
MENUITEM "元に戻す", IDM_REDOW<br />
MENUITEM "置き換え", IDM_REPLACE<br />
END<br />
END<br /></span></p>
</td>
</tr></tbody></table><p>main.cpp</p>
<table width="600" border="1" cellspacing="1" cellpadding="1"><tbody><tr><td>
<p><span style="font-size:small;"> #pragma comment(linker, "/SUBSYSTEM:WINDOWS
/ENTRY:mainCRTStartup")<br />
#pragma comment(lib, "comctl32.lib")<br />
#define _WIN32_WINNT 0x0501<br />
#include <GL/freeglut/freeglut.h><br />
#include "resource.h"<br />
#include <commctrl.h> //CreateStatusWindow()のために必要</span></p>
<p><span style="font-size:small;">//FreeGlutのウインドウプロシージャを置き換える為の変数<br />
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ<br />
HWND hWnd2=NULL; //ウィンドウハンドル<br />
HMENU hMenu=NULL; //メニュー<br />
HWND hStatusbar; // ステータスバーのハンドル</span></p>
<p><span style="font-size:small;"> HWND hTool1, hTool2, hRebar;</span></p>
<p><span style="font-size:small;">TBBUTTON tbButton1[] = {<br />
{STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_CUT, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}<br />
};</span></p>
<p><span style="font-size:small;">TBBUTTON tbButton2[] = {<br />
{STD_FIND, IDM_FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_HELP, IDM_HELP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_PRINT, IDM_PRINT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_REDOW, IDM_REDOW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_REPLACE, IDM_REPLACE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}<br />
};<br />
<br />
#define WIDTH 320<br />
#define 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 />
{<br />
LPNMHDR lpnmhdr;<br />
NMREBARCHEVRON *lpnmchevron;<br />
RECT rc1, rc2;<br />
POINT pt;<br />
RECT rc1_scr, rc2_scr, rc3_scr;<br />
REBARBANDINFO rbinfo;<br />
int nBtn, i;<br />
int nHideBtn = 0;<br />
wchar_t szResourceName[32];<br />
HMENU hPopMenu, hSubMenu;<br />
switch( msg ){<br />
case WM_SETCURSOR:<br />
return DefWindowProc(hWnd,msg,wParam,lParam);<br />
case WM_SIZE:<br />
SendMessage(hRebar, WM_SIZE, wParam, lParam);<br />
SendMessage( hStatusbar, WM_SIZE, wParam, lParam );<br />
return 0;<br />
case WM_COMMAND:<br />
switch (LOWORD(wParam)){<br />
case IDM_NEW:<br />
MessageBox(hWnd, L"変更を保存しますか", L"注意", MB_YESNO |
MB_ICONQUESTION);<br />
break;<br />
case IDM_SAVE:<br />
MessageBox(hWnd, L"上書きしてもよろしいですか", L"上書き保存", MB_YESNO |
MB_ICONQUESTION);<br />
break;<br />
/* 他省略 */<br />
case ID_EXIT:<br />
PostQuitMessage(0);<br />
}<br />
return 0;<br />
case WM_DESTROY:<br />
exit(0);<br />
break;<br />
case WM_NOTIFY:<br />
lpnmhdr = (LPNMHDR)lParam;<br />
if (lpnmhdr->code == TTN_POP) {<br />
return 0;<br />
}<br />
switch (wParam) {<br />
case ID_REBAR:<br />
switch (lpnmhdr->code) {<br />
case RBN_CHEVRONPUSHED:<br />
lpnmchevron = (NMREBARCHEVRON *)lParam;<br />
if (SendMessage(hRebar, RB_GETRECT,
(WPARAM)lpnmchevron->uBand, (LPARAM)&rc1) == 0) {<br />
MessageBox(hWnd, L"RB_GETRECT ERROR", L"OK",
MB_OK);<br />
return FALSE;<br />
}<br />
pt.x = rc1.left;<br />
pt.y = rc1.top;<br />
ClientToScreen(hRebar, &pt);<br />
<br />
rc1_scr.left = pt.x;<br />
rc1_scr.top = pt.y;<br />
pt.x = rc1.right;<br />
pt.y = rc1.bottom;<br />
ClientToScreen(hRebar, &pt);<br />
rc1_scr.right = pt.x;<br />
rc1_scr.bottom = pt.y;<br />
memset(&rbinfo, 0, sizeof(REBARBANDINFO));<br />
rbinfo.cbSize = sizeof(REBARBANDINFO);<br />
rbinfo.fMask = RBBIM_CHILD;<br />
<br />
if (SendMessage(hRebar, RB_GETBANDINFO,
(WPARAM)lpnmchevron->uBand, (LPARAM)&rbinfo) == 0)<br />
MessageBox(hWnd, L"Error RB_GETBANDINFO", L"Error",
MB_OK);<br />
nBtn = SendMessage(rbinfo.hwndChild, TB_BUTTONCOUNT, 0,
0);<br />
<br />
for (i = 0; i < nBtn; i++) {<br />
SendMessage(rbinfo.hwndChild, TB_GETITEMRECT,
(WPARAM)i, (LPARAM)&rc2);<br />
pt.x = rc2.left;<br />
pt.y = rc2.top;<br />
ClientToScreen(rbinfo.hwndChild, &pt);<br />
rc2_scr.left = pt.x;<br />
rc2_scr.top = pt.y;<br />
pt.x = rc2.right;<br />
pt.y = rc2.bottom;<br />
ClientToScreen(rbinfo.hwndChild, &pt);<br />
rc2_scr.right = pt.x;<br />
rc2_scr.bottom = pt.y;<br />
IntersectRect(&rc3_scr, &rc2_scr,
&rc1_scr);<br />
if (!EqualRect(&rc2_scr, &rc3_scr)) {<br />
nHideBtn = nBtn - i;<br />
break;<br />
}<br />
}<br />
<br />
if (rbinfo.hwndChild == hTool1) {<br />
wcscpy(szResourceName, L"FILE");<br />
} else if (rbinfo.hwndChild == hTool2) {<br />
wcscpy(szResourceName, L"EDIT");<br />
} else {<br />
MessageBox(hWnd, L"Error", L"Error", MB_OK);<br />
return FALSE;<br />
}<br />
<br />
hPopMenu = LoadMenu((HINSTANCE)GetWindowLong(hWnd2,
GWL_HINSTANCE), szResourceName);<br />
if (hPopMenu == NULL) {<br />
MessageBox(hWnd, L"LoadMenu Error", L"Error",
MB_OK);<br />
break;<br />
}<br />
hSubMenu = GetSubMenu(hPopMenu, 0);<br />
if (nHideBtn == 0)<br />
nHideBtn = 1;<br />
for (i = 0; i < nBtn - nHideBtn; i++) {<br />
if (DeleteMenu(hSubMenu, 0, MF_BYPOSITION) == 0)
{<br />
MessageBox(hWnd, L"DeleteMenu Error", L"Error",
MB_OK);<br />
return 0;<br />
}<br />
}<br />
TrackPopupMenu(hSubMenu, TPM_LEFTALIGN,
rc1_scr.right-10, rc1_scr.bottom, 0, hWnd, NULL);<br />
DestroyMenu(hPopMenu);<br />
break;<br />
default:<br />
return DefWindowProc(hWnd, msg, wParam, lParam);<br />
}<br />
break;<br />
}<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 />
{<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 />
{<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 />
{<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);<br />
<br />
}</span></p>
<p><span style="font-size:small;">HWND MakeToolbar(HWND hWnd, int n, TBBUTTON
*tbButton, int id)<br />
{<br />
HWND hTool;<br />
TBADDBITMAP tbab;<br />
int stdid, i;</span></p>
<p><span style="font-size:small;"> hTool = CreateToolbarEx(hWnd, WS_VISIBLE
| WS_CHILD| CCS_NODIVIDER | CCS_NORESIZE | TBSTYLE_FLAT, id ,<br />
0, NULL, NULL, tbButton, 0, 0, 0, 0, 0, sizeof(TBBUTTON));<br />
tbab.hInst = HINST_COMMCTRL;<br />
tbab.nID = IDB_STD_SMALL_COLOR;</span></p>
<p><span style="font-size:small;"> stdid = SendMessage(hTool, TB_ADDBITMAP,
n, (LPARAM)&tbab);<br />
for (i = 0; i < n; i++)<br />
tbButton[i].iBitmap += stdid;</span></p>
<p><span style="font-size:small;"> SendMessage(hTool, TB_ADDBUTTONS, n,
(LONG)tbButton);<br />
SendMessage(hTool, TB_AUTOSIZE, 0, 0);</span></p>
<p><span style="font-size:small;"> return hTool;<br />
}</span></p>
<p><span style="font-size:small;"> 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 />
INITCOMMONCONTROLSEX ic;<br />
ic.dwSize = sizeof(INITCOMMONCONTROLSEX);<br />
ic.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES | ICC_PAGESCROLLER_CLASS;<br />
InitCommonControlsEx(&ic);<br />
// ステータスバーを作成<br />
hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM |
SBARS_SIZEGRIP,<br />
L"ステータスバー",hWnd2,ID_STATUS);</span></p>
<p><span style="font-size:small;"><br />
hRebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL,<br />
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |<br />
RBS_BANDBORDERS | RBS_VARHEIGHT,<br />
0, 0, 0, 0, hWnd2, (HMENU)ID_REBAR,
(HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE), NULL);<br />
<br />
hTool1 = MakeToolbar(hRebar, 6, tbButton1, ID_TOOL1);<br />
hTool2 = MakeToolbar(hRebar, 6, tbButton2, ID_TOOL2);<br />
REBARBANDINFO rbinfo;<br />
RECT rc;<br />
memset(&rbinfo, 0, sizeof(REBARBANDINFO));<br />
rbinfo.cbSize = sizeof(REBARBANDINFO);<br />
rbinfo.fMask = /*RBBIM_TEXT |*/ RBBIM_STYLE | RBBIM_CHILD |
RBBIM_CHILDSIZE |<br />
RBBIM_SIZE | RBBIM_IDEALSIZE;<br />
rbinfo.fStyle = RBBS_CHILDEDGE | RBBS_USECHEVRON;<br />
rbinfo.hwndChild = hTool1;<br />
rbinfo.cxMinChild = 0;<br />
rbinfo.cyMinChild = 25;<br />
rbinfo.cxIdeal = 144;<br />
rbinfo.cx = 160;<br />
SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1,
(LPARAM)&rbinfo);</span></p>
<p><span style="font-size:small;"> GetWindowRect(hRebar,
&rc);<br />
rbinfo.hwndChild = hTool2;<br />
rbinfo.cxMinChild = 0;<br />
rbinfo.cyMinChild = 25;<br />
rbinfo.cxIdeal = 176;<br />
rbinfo.cx = 192;<br />
SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1,
(LPARAM)&rbinfo);</span></p>
<p><span style="font-size:small;"> glutInitDisplayMode(GLUT_RGBA |
GLUT_DOUBLE);<br />
glutDisplayFunc(display);<br />
glutIdleFunc(idle);<br />
Init();<br />
glutMainLoop();<br />
return 0;<br />
}</span></p>
</td>
</tr></tbody></table>
<p><strong>シェブロンデース</strong></p>
<div> </div>
<div><strong>レバーコントロールで隠されてしまったコントロールを</strong></div>
<div><strong>ポップアップメニューで表示します。</strong></div>
<p><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&act=open&pageid=209&file=che.png" /></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<br />
#define ID_STATUS 108<br />
#define ID_TOOLBAR 109<br />
<br />
#define IDM_NEW 1010<br />
#define IDM_OPEN 1020<br />
#define IDM_SAVE 1030<br />
#define IDM_COPY 1040<br />
#define IDM_PASTE 1050<br />
#define IDM_DELETE 1060<br />
#define IDM_CUT 1070<br />
#define IDM_FIND 1080<br />
#define IDM_HELP 1090<br />
#define IDM_PRINT 1110<br />
#define IDM_REDOW 1120<br />
#define IDM_REPLACE 1130<br />
#define ID_REBAR 1140<br />
#define ID_TOOL1 1150<br />
#define ID_TOOL2 1160</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>
<p>FILE MENU DISCARDABLE<br />
BEGIN<br />
POPUP "ダミー"<br />
BEGIN<br />
MENUITEM "新規作成", IDM_NEW<br />
MENUITEM "開く", IDM_OPEN<br />
MENUITEM "上書き保存", IDM_SAVE<br />
MENUITEM "コピー", IDM_COPY<br />
MENUITEM "切り取り", IDM_CUT<br />
MENUITEM "削除", IDM_DELETE<br />
END<br />
END</p>
<p>EDIT MENU DISCARDABLE<br />
BEGIN<br />
POPUP "ダミー"<br />
BEGIN<br />
MENUITEM "検索", IDM_FIND<br />
MENUITEM "ヘルプ", IDM_HELP<br />
MENUITEM "貼り付け", IDM_PASTE<br />
MENUITEM "印刷", IDM_PRINT<br />
MENUITEM "元に戻す", IDM_REDOW<br />
MENUITEM "置き換え", IDM_REPLACE<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 />
#define _WIN32_WINNT 0x0501<br />
#include <GL/freeglut/freeglut.h><br />
#include "resource.h"<br />
#include <commctrl.h> //CreateStatusWindow()のために必要</p>
<p>//FreeGlutのウインドウプロシージャを置き換える為の変数<br />
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ<br />
HWND hWnd2=NULL; //ウィンドウハンドル<br />
HMENU hMenu=NULL; //メニュー<br />
HWND hStatusbar; // ステータスバーのハンドル</p>
<p>HWND hTool1, hTool2, hRebar;</p>
<p>TBBUTTON tbButton1[] = {<br />
{STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_CUT, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}<br />
};</p>
<p>TBBUTTON tbButton2[] = {<br />
{STD_FIND, IDM_FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_HELP, IDM_HELP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_PRINT, IDM_PRINT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_REDOW, IDM_REDOW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},<br />
{STD_REPLACE, IDM_REPLACE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}<br />
};<br />
<br />
#define WIDTH 320<br />
#define 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 />
LPNMHDR lpnmhdr;<br />
NMREBARCHEVRON *lpnmchevron;<br />
RECT rc1, rc2;<br />
POINT pt;<br />
RECT rc1_scr, rc2_scr, rc3_scr;<br />
REBARBANDINFO rbinfo;<br />
int nBtn, i;<br />
int nHideBtn = 0;<br />
wchar_t szResourceName[32];<br />
HMENU hPopMenu, hSubMenu;<br />
switch( msg ){<br />
case WM_SETCURSOR:<br />
return DefWindowProc(hWnd,msg,wParam,lParam);<br />
case WM_SIZE:<br />
SendMessage(hRebar, WM_SIZE, wParam, lParam);<br />
SendMessage( hStatusbar, WM_SIZE, wParam, lParam );<br />
return 0;<br />
case WM_COMMAND:<br />
switch (LOWORD(wParam)){<br />
case IDM_NEW:<br />
MessageBox(hWnd, L"変更を保存しますか", L"注意", MB_YESNO |
MB_ICONQUESTION);<br />
break;<br />
case IDM_SAVE:<br />
MessageBox(hWnd, L"上書きしてもよろしいですか", L"上書き保存", MB_YESNO |
MB_ICONQUESTION);<br />
break;<br />
/* 他省略 */<br />
case ID_EXIT:<br />
PostQuitMessage(0);<br />
}<br />
return 0;<br />
case WM_DESTROY:<br />
exit(0);<br />
break;<br />
case WM_NOTIFY:<br />
lpnmhdr = (LPNMHDR)lParam;<br />
if (lpnmhdr->code == TTN_POP) {<br />
return 0;<br />
}<br />
switch (wParam) {<br />
case ID_REBAR:<br />
switch (lpnmhdr->code) {<br />
case RBN_CHEVRONPUSHED:<br />
lpnmchevron = (NMREBARCHEVRON *)lParam;<br />
if (SendMessage(hRebar, RB_GETRECT,
(WPARAM)lpnmchevron->uBand, (LPARAM)&rc1) == 0) {<br />
MessageBox(hWnd, L"RB_GETRECT ERROR", L"OK", MB_OK);<br />
return FALSE;<br />
}<br />
pt.x = rc1.left;<br />
pt.y = rc1.top;<br />
ClientToScreen(hRebar, &pt);<br />
<br />
rc1_scr.left = pt.x;<br />
rc1_scr.top = pt.y;<br />
pt.x = rc1.right;<br />
pt.y = rc1.bottom;<br />
ClientToScreen(hRebar, &pt);<br />
rc1_scr.right = pt.x;<br />
rc1_scr.bottom = pt.y;<br />
memset(&rbinfo, 0, sizeof(REBARBANDINFO));<br />
rbinfo.cbSize = sizeof(REBARBANDINFO);<br />
rbinfo.fMask = RBBIM_CHILD;<br />
<br />
if (SendMessage(hRebar, RB_GETBANDINFO,
(WPARAM)lpnmchevron->uBand, (LPARAM)&rbinfo) == 0)<br />
MessageBox(hWnd, L"Error RB_GETBANDINFO", L"Error",
MB_OK);<br />
nBtn = SendMessage(rbinfo.hwndChild, TB_BUTTONCOUNT, 0,
0);<br />
<br />
for (i = 0; i < nBtn; i++) {<br />
SendMessage(rbinfo.hwndChild, TB_GETITEMRECT, (WPARAM)i,
(LPARAM)&rc2);<br />
pt.x = rc2.left;<br />
pt.y = rc2.top;<br />
ClientToScreen(rbinfo.hwndChild, &pt);<br />
rc2_scr.left = pt.x;<br />
rc2_scr.top = pt.y;<br />
pt.x = rc2.right;<br />
pt.y = rc2.bottom;<br />
ClientToScreen(rbinfo.hwndChild, &pt);<br />
rc2_scr.right = pt.x;<br />
rc2_scr.bottom = pt.y;<br />
IntersectRect(&rc3_scr, &rc2_scr,
&rc1_scr);<br />
if (!EqualRect(&rc2_scr, &rc3_scr)) {<br />
nHideBtn = nBtn - i;<br />
break;<br />
}<br />
}<br />
<br />
if (rbinfo.hwndChild == hTool1) {<br />
wcscpy(szResourceName, L"FILE");<br />
} else if (rbinfo.hwndChild == hTool2) {<br />
wcscpy(szResourceName, L"EDIT");<br />
} else {<br />
MessageBox(hWnd, L"Error", L"Error", MB_OK);<br />
return FALSE;<br />
}<br />
<br />
hPopMenu = LoadMenu((HINSTANCE)GetWindowLong(hWnd2,
GWL_HINSTANCE), szResourceName);<br />
if (hPopMenu == NULL) {<br />
MessageBox(hWnd, L"LoadMenu Error", L"Error",
MB_OK);<br />
break;<br />
}<br />
hSubMenu = GetSubMenu(hPopMenu, 0);<br />
if (nHideBtn == 0)<br />
nHideBtn = 1;<br />
for (i = 0; i < nBtn - nHideBtn; i++) {<br />
if (DeleteMenu(hSubMenu, 0, MF_BYPOSITION) == 0) {<br />
MessageBox(hWnd, L"DeleteMenu Error", L"Error",
MB_OK);<br />
return 0;<br />
}<br />
}<br />
TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, rc1_scr.right-10,
rc1_scr.bottom, 0, hWnd, NULL);<br />
DestroyMenu(hPopMenu);<br />
break;<br />
default:<br />
return DefWindowProc(hWnd, msg, wParam, lParam);<br />
}<br />
break;<br />
}<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 />
}</p>
<p>HWND MakeToolbar(HWND hWnd, int n, TBBUTTON *tbButton, int id){<br />
HWND hTool;<br />
TBADDBITMAP tbab;<br />
int stdid, i;</p>
<p> hTool = CreateToolbarEx(hWnd, WS_VISIBLE | WS_CHILD| CCS_NODIVIDER |
CCS_NORESIZE | TBSTYLE_FLAT, id ,<br />
0, NULL, NULL, tbButton, 0, 0, 0, 0, 0, sizeof(TBBUTTON));<br />
tbab.hInst = HINST_COMMCTRL;<br />
tbab.nID = IDB_STD_SMALL_COLOR;</p>
<p> stdid = SendMessage(hTool, TB_ADDBITMAP, n, (LPARAM)&tbab);<br />
for (i = 0; i < n; i++)tbButton[i].iBitmap += stdid;</p>
<p> SendMessage(hTool, TB_ADDBUTTONS, n, (LONG)tbButton);<br />
SendMessage(hTool, TB_AUTOSIZE, 0, 0);</p>
<p> return hTool;<br />
}</p>
<p>bool main(int argc, char *argv[]){<br />
glutInitWindowPosition(100, 100);<br />
glutInitWindowSize(WIDTH, HEIGHT);<br />
glutInit(&argc, argv);<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 />
INITCOMMONCONTROLSEX ic;<br />
ic.dwSize = sizeof(INITCOMMONCONTROLSEX);<br />
ic.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES | ICC_PAGESCROLLER_CLASS;<br />
InitCommonControlsEx(&ic);<br />
// ステータスバーを作成<br />
hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM |
SBARS_SIZEGRIP,<br />
L"ステータスバー",hWnd2,ID_STATUS);</p>
<p> hRebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL,<br />
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |<br />
RBS_BANDBORDERS | RBS_VARHEIGHT,<br />
0, 0, 0, 0, hWnd2, (HMENU)ID_REBAR,
(HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE), NULL);<br />
<br />
hTool1 = MakeToolbar(hRebar, 6, tbButton1, ID_TOOL1);<br />
hTool2 = MakeToolbar(hRebar, 6, tbButton2, ID_TOOL2);<br />
REBARBANDINFO rbinfo;<br />
RECT rc;<br />
memset(&rbinfo, 0, sizeof(REBARBANDINFO));<br />
rbinfo.cbSize = sizeof(REBARBANDINFO);<br />
rbinfo.fMask = /*RBBIM_TEXT |*/ RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE
|<br />
RBBIM_SIZE | RBBIM_IDEALSIZE;<br />
rbinfo.fStyle = RBBS_CHILDEDGE | RBBS_USECHEVRON;<br />
rbinfo.hwndChild = hTool1;<br />
rbinfo.cxMinChild = 0;<br />
rbinfo.cyMinChild = 25;<br />
rbinfo.cxIdeal = 144;<br />
rbinfo.cx = 160;<br />
SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo);</p>
<p> GetWindowRect(hRebar, &rc);<br />
rbinfo.hwndChild = hTool2;<br />
rbinfo.cxMinChild = 0;<br />
rbinfo.cyMinChild = 25;<br />
rbinfo.cxIdeal = 176;<br />
rbinfo.cx = 192;<br />
SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo);</p>
<p> glutDisplayFunc(display);<br />
glutIdleFunc(idle);<br />
Init();<br />
glutMainLoop();<br />
return 0;<br />
}</p>
</td>
</tr></tbody></table>