フラットツールバーを表示する

素のツールバーではボタンの集合体に見えるのでフラットタイプにしてみます。

resource.h

#define IDR_MENU1  100
#define ID_EXIT   101
#define ID_TEST   102
#define ID_A   103
#define ID_B   104
#define ID_Menu   105
#define ID_Whats  106
#define ID_Help   107
#define ID_STATUS  108
#define ID_TOOLBAR    109
 
#define IDM_NEW    1010
#define IDM_OPEN    1020
#define IDM_SAVE    1030
#define IDM_COPY    1040
#define IDM_PASTE   1050
#define IDM_DELETE  1060
#define IDM_CUT     1070
#define IDM_FIND  1080
#define IDM_HELP  1090
#define IDM_DETAILS 1100
#define IDM_PRINT  1110
#define IDM_REDOW  1120
#define IDM_REPLACE 1130

menu.rc

#include "resource.h"

IDR_MENU1 MENU
BEGIN
    POPUP "File"
    BEGIN
        MENUITEM "Exit",    ID_EXIT
    END
    POPUP "Test"
    BEGIN
        MENUITEM "てすつ",    ID_TEST
    END
    POPUP "Option"
    BEGIN
        MENUITEM "A",     ID_A
        MENUITEM "B",     ID_B
        MENUITEM "めにゅ~",   ID_Menu
        MENUITEM "whats?",    ID_Whats
    END
    MENUITEM "ヘルプ",     ID_Help
END

STRINGTABLE DISCARDABLE
BEGIN
    IDM_COPY                "コピーします"
    IDM_DELETE              "削除します"
    IDM_CUT                 "切り取ります"
    IDM_NEW                 "新規ファイル作成"
    IDM_OPEN                "ファイルをオープンします"
    IDM_SAVE                "保存します"
    IDM_FIND                "検索をします"
    IDM_HELP                "ヘルプです"
    IDM_PASTE               "貼り付け"
    IDM_DETAILS             "詳細表示"
    IDM_PRINT               "印刷をします"
    IDM_REDOW               "元に戻します"
    IDM_REPLACE             "置き換え"
END

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib, "comctl32.lib")
#include <GL/freeglut/freeglut.h>
#include "resource.h"
#include <commctrl.h> //CreateStatusWindow()のために必要

//FreeGlutのウインドウプロシージャを置き換える為の変数
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ
HWND hWnd2=NULL; //ウィンドウハンドル
HMENU hMenu=NULL; //メニュー
HWND hStatusbar;     // ステータスバーのハンドル
HWND hToolbar;   //ツールバーのハンドル

TBBUTTON tbb[] = {
 {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
 {STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
 {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
    {STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {STD_CUT, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
 {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
    {STD_FIND, IDM_FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {STD_HELP, IDM_HELP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {STD_PRINT, IDM_PRINT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {STD_REDOW, IDM_REDOW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {STD_REPLACE, IDM_REPLACE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0},
    {VIEW_DETAILS, IDM_DETAILS, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}
};
 
#define WIDTH 320
#define HEIGHT 240
 
//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
 
//置き換えた後のプロシージャ
LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){
 switch( msg ){
  case WM_SIZE:
   SendMessage( hStatusbar, WM_SIZE, wParam, lParam );
   SendMessage(hToolbar , msg , wParam , lParam);
   return 0;
  case WM_COMMAND:
   switch (LOWORD(wParam)){
    case ID_EXIT:
     PostQuitMessage(0);
    }
    return 0;
   case WM_DESTROY:
    exit(0);
    break;
   default:
    if(WndProc){
     return CallWindowProc(WndProc,hWnd , msg , wParam , lParam);
    }else{
     return DefWindowProc(hWnd,msg,wParam,lParam);
  }
 }
}
 
 //ウィンドウの検索
BOOL CALLBACK enumWindowsProc(HWND hWnd,LPARAM lParam){
 HANDLE hModule=(HANDLE)GetWindowLong(hWnd,GWL_HINSTANCE);
 if(GetModuleHandle(NULL)==hModule){
  wchar_t ClassName[256];
  GetClassNameW(hWnd,ClassName,sizeof(ClassName)/sizeof(ClassName[0]));
  if(wcsncmp(ClassName,L"FREEGLUT",wcslen(ClassName))==0){
   hWnd2=hWnd;
   return FALSE;
  }
 }
 return TRUE;
}
 
void display(void){
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glViewport(0, 0, WIDTH, HEIGHT);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 
 gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 
 gluLookAt(150.0,150.0,-150.0,
       0.0,0.0,0.0,
      0.0,1.0,0.0);
 
 glMaterialfv(GL_FRONT, GL_DIFFUSE, white);
 //回転
 glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転
 glutSolidSphere(40.0,16,16);
 
glutSwapBuffers();
}
void idle(void){
 anglex+=2.0f;
 Sleep(1);
 glutPostRedisplay();
}
void Init(){
 glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
 glEnable(GL_DEPTH_TEST);
 //ワイヤーフレーム
 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}

HWND CreateToolWnd(HWND hWnd){
    HWND hTool, hToolTip;
    static TBADDBITMAP tbab;
    static TOOLINFO ti;
    static int stdid, id;

    // ツールバーを作る
    hTool = CreateToolbarEx(
        hWnd,
        WS_CHILD | WS_VISIBLE,
        ID_TOOLBAR,
        15,
        (HINSTANCE)HINST_COMMCTRL,
        IDB_STD_SMALL_COLOR,
        (LPCTBBUTTON)tbb,
        15,
        0, 0,
        0, 0,
        sizeof(TBBUTTON));

    tbab.hInst = HINST_COMMCTRL;
    tbab.nID = IDB_VIEW_SMALL_COLOR;

    stdid = SendMessage(hTool, TB_ADDBITMAP, 1, (LPARAM)&tbab);
    for (id = 15; id <= 15; id++) {
        tbb[id].iBitmap += stdid;
    }
    SendMessage(hTool, TB_ADDBUTTONS, 1, (LPARAM)&tbb[15]);
    SendMessage(hTool, TB_AUTOSIZE, 0, 0);

    // ツールチップを作る
    hToolTip = CreateWindowEx(
        0,  //拡張ウィンドウスタイル
        TOOLTIPS_CLASS, //クラスネーム
        NULL, //ウィンドウネーム
        TTS_ALWAYSTIP, // ウィンドウスタイル
        CW_USEDEFAULT, // X座標
        CW_USEDEFAULT, // Y座標
        CW_USEDEFAULT, // 幅
        CW_USEDEFAULT, // 高さ
        hWnd, // 親ウィンドウのハンドル
        NULL, // メニューハンドル
        (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), // インスタンスハンドル
        NULL); // WM_CREATEデータ

    ti.cbSize = TTTOOLINFOW_V1_SIZE;
    ti.hwnd = hTool;
    ti.hinst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
    ti.uFlags = TTF_SUBCLASS;
    for (id = 0; id <= 15; id++) {
        SendMessage(hTool, TB_GETITEMRECT, id, (LPARAM)&ti.rect);
        ti.uId = tbb[id].idCommand;
        ti.lpszText = (LPTSTR)tbb[id].idCommand;
        SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);
    }
    SendMessage(hTool, TB_SETTOOLTIPS, (WPARAM)hToolTip, 0);
    return hTool;
}


bool main(int argc, char *argv[]){
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("フラットツールバー");
 //FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える
 EnumWindows(enumWindowsProc,0);
 if(hWnd2){
  WndProc=(WNDPROC)GetWindowLong(hWnd2,GWL_WNDPROC);
  SetWindowLong(hWnd2,GWL_WNDPROC,(LONG)WndProc2);
 }else{
  return false;
 }
 //メニューを作成
 hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1));
 if(hMenu){
  SetMenu(hWnd2,hMenu);
 }else{
  return false;
 }
 // コモンコントロール関係の初期化
 InitCommonControls();
 // ステータスバーを作成
 hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
   L"ステータスバー",hWnd2,ID_STATUS);

 hToolbar = CreateToolWnd(hWnd2);
 //フラット化
 static UINT ToolStyle = (UINT)GetWindowLong(hToolbar, GWL_STYLE);
 if (ToolStyle & TBSTYLE_FLAT)ToolStyle ^= TBSTYLE_FLAT;
 if (ToolStyle & TBSTYLE_TRANSPARENT)ToolStyle ^= TBSTYLE_TRANSPARENT;
 ToolStyle |= TBSTYLE_FLAT;
 SetWindowLong(hToolbar, GWL_STYLE, (LONG)ToolStyle);
 InvalidateRect(hToolbar, NULL, TRUE);
 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return true;
}

 

 

 

 

最終更新:2014年06月13日 22:30
添付ファイル