シェブロンを表示する

「シェブロンを表示する」の編集履歴(バックアップ)一覧はこちら

シェブロンを表示する」(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&amp;act=open&amp;pageid=209&amp;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 &lt;GL/freeglut/freeglut.h&gt;<br /> #include "resource.h"<br /> #include &lt;commctrl.h&gt; //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-&gt;code == TTN_POP) {<br />        return 0;<br />     }<br />  switch (wParam) {<br />   case ID_REBAR:<br />            switch (lpnmhdr-&gt;code) {<br />     case RBN_CHEVRONPUSHED:<br />                     lpnmchevron = (NMREBARCHEVRON *)lParam;<br />                     if (SendMessage(hRebar, RB_GETRECT, (WPARAM)lpnmchevron-&gt;uBand, (LPARAM)&amp;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, &amp;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, &amp;pt);<br />                        rc1_scr.right = pt.x;<br />                        rc1_scr.bottom = pt.y;<br />                        memset(&amp;rbinfo, 0, sizeof(REBARBANDINFO));<br />                        rbinfo.cbSize = sizeof(REBARBANDINFO);<br />                        rbinfo.fMask = RBBIM_CHILD;<br />                            <br />                        if (SendMessage(hRebar, RB_GETBANDINFO, (WPARAM)lpnmchevron-&gt;uBand, (LPARAM)&amp;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 &lt; nBtn; i++) {<br />                            SendMessage(rbinfo.hwndChild, TB_GETITEMRECT, (WPARAM)i, (LPARAM)&amp;rc2);<br />                            pt.x = rc2.left;<br />                            pt.y = rc2.top;<br />                            ClientToScreen(rbinfo.hwndChild, &amp;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, &amp;pt);<br />                            rc2_scr.right = pt.x;<br />                            rc2_scr.bottom = pt.y;<br />                            IntersectRect(&amp;rc3_scr, &amp;rc2_scr, &amp;rc1_scr);<br />                            if (!EqualRect(&amp;rc2_scr, &amp;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 &lt; 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)&amp;tbab);<br />     for (i = 0; i &lt; 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(&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 />    INITCOMMONCONTROLSEX ic;<br />    ic.dwSize = sizeof(INITCOMMONCONTROLSEX);<br />    ic.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES | ICC_PAGESCROLLER_CLASS;<br />    InitCommonControlsEx(&amp;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(&amp;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)&amp;rbinfo);</span></p> <p><span style="font-size:small;">            GetWindowRect(hRebar, &amp;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)&amp;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&amp;act=open&amp;pageid=209&amp;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 &lt;GL/freeglut/freeglut.h&gt;<br /> #include "resource.h"<br /> #include &lt;commctrl.h&gt; //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-&gt;code == TTN_POP) {<br />        return 0;<br />     }<br />     switch (wParam) {<br />      case ID_REBAR:<br />            switch (lpnmhdr-&gt;code) {<br />             case RBN_CHEVRONPUSHED:<br />                lpnmchevron = (NMREBARCHEVRON *)lParam;<br />                if (SendMessage(hRebar, RB_GETRECT, (WPARAM)lpnmchevron-&gt;uBand, (LPARAM)&amp;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, &amp;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, &amp;pt);<br />                   rc1_scr.right = pt.x;<br />                   rc1_scr.bottom = pt.y;<br />                   memset(&amp;rbinfo, 0, sizeof(REBARBANDINFO));<br />                   rbinfo.cbSize = sizeof(REBARBANDINFO);<br />                   rbinfo.fMask = RBBIM_CHILD;<br />                          <br />                   if (SendMessage(hRebar, RB_GETBANDINFO, (WPARAM)lpnmchevron-&gt;uBand, (LPARAM)&amp;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 &lt; nBtn; i++) {<br />                       SendMessage(rbinfo.hwndChild, TB_GETITEMRECT, (WPARAM)i, (LPARAM)&amp;rc2);<br />                       pt.x = rc2.left;<br />                       pt.y = rc2.top;<br />                       ClientToScreen(rbinfo.hwndChild, &amp;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, &amp;pt);<br />                       rc2_scr.right = pt.x;<br />                       rc2_scr.bottom = pt.y;<br />                       IntersectRect(&amp;rc3_scr, &amp;rc2_scr, &amp;rc1_scr);<br />                       if (!EqualRect(&amp;rc2_scr, &amp;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 &lt; 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)&amp;tbab);<br />     for (i = 0; i &lt; 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(&amp;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(&amp;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(&amp;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)&amp;rbinfo);</p> <p> GetWindowRect(hRebar, &amp;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)&amp;rbinfo);</p> <p> glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table>

表示オプション

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