ホーム > カテゴリ > C/C++ >

ツールバーコントロールを作成する(C/C++版)

ツールバーコントロールを作成するサンプルです。

サンプルの実行画面

ソースコード

[Sample72.c]

//--------------------------------------------------------------------------------------
//  ■ツールバーコントロールを作成す■ Sample NO.72
//
//--------------------------------------------------------------------------------------

//リンクの設定
//comctl32.lib をリンクしてください。

#include <windows.h>
#include <commctrl.h>

HWND  hTool=NULL;     //ツールバーコントロールのハンドル
#define ID_TOOLBAR 300
  #define ID_NEW   101
  #define ID_OPEN  102
  #define ID_SAVE  103
  #define ID_PRINT 104

//ウインドウを中央にする為にX座標(LEFT)とY座標(TOP)算出するマクロ
#define ScreenCenterX(Width) ((0)<((int)((GetSystemMetrics(SM_CXSCREEN)- Width) / 2)) ? ((int)((GetSystemMetrics(SM_CXSCREEN)- Width) / 2)) :(0))
#define ScreenCenterY(Height) ((0)<((int)((GetSystemMetrics(SM_CYSCREEN)- Height) / 2)) ? ((int)((GetSystemMetrics(SM_CYSCREEN)- Height) / 2)) :(0))

//いつものプロシージャ
HWND CreateMainWindow(int Width,int Height,LPCTSTR Caption,HINSTANCE hInstance,int nCmdShow,WNDPROC lpfnWndProc, DWORD dwstyle,DWORD dwExstyle,LPCTSTR MenuID,HICON hIcon);
int  WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow);
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);


//------------------------------------------------------
//■関数 CreateMainWindow
//■用途 メインウインドウを作成する
//■引数
//  Width       ...ウインドウの横幅
//  Height      ...ウインドウの縦幅
//  Caption     ...タイトル名
//  hInstance   ...インスタンスハンドル
//  nCmdShow    ...ウインドウの表示形態
//  lpfnWndProc ...コールバックプロシージャ
//  dwstyle     ...ウインドウスタイル
//  dwExstyle   ...拡張ウインドウスタイル
//  MenuID      ...メニューのID
//  hIcon       ...アイコン
//■戻り値
//  ウインドウのハンドル
//------------------------------------------------------
HWND CreateMainWindow(int Width,int Height,LPCTSTR Caption,HINSTANCE hInstance,int nCmdShow,WNDPROC lpfnWndProc, DWORD dwstyle,DWORD dwExstyle,LPCTSTR MenuID,HICON hIcon)
{
    HWND hWnd;         //メインウインドウのハンドル
    WNDCLASS myClass;  //WNDCLASS構造体
    
    //WNDCLASS構造体を0で初期化
    ZeroMemory(&myClass,sizeof(WNDCLASS));
 
//--->WNDCLASS構造体の設定&ウインドウクラスの登録

    myClass.style =CS_HREDRAW | CS_VREDRAW;       //ウインドウスタイルを設定 
    myClass.lpfnWndProc   = lpfnWndProc;          //コールバックプロシージャへのポインタ
    myClass.hInstance=hInstance;                  //インスタンスハンドルを設定
    myClass.hCursor=LoadCursor(NULL, IDC_ARROW);  //カーソルの設定(Windows標準リソースを使用)  
    myClass.hbrBackground=(HBRUSH)COLOR_WINDOW;   //ウインドウの背景を設定(デフォルトカラー)
    myClass.lpszClassName="TForm";                //クラス名の設定(Borland Delphi風)  
    myClass.hIcon =hIcon;                         //アイコンの指定
    myClass.lpszMenuName=MenuID;                  //メニューの設定

    //ウィンドウ クラスを登録
    RegisterClass(&myClass); 
    
//--->ウインドウの作成&表示
   
  //メインウインドウの生成
  hWnd = CreateWindowEx(
           dwExstyle,            //拡張ウインドウスタイル
           "TForm",              //登録されたクラス名のアドレス 
           Caption,              //ウインドウ名
           dwstyle,              //ウインドウスタイルを設定
           ScreenCenterX(Width), //X座標の位置設定
           ScreenCenterY(Height),//Y座標の位置設定
           Width,                //横幅を設定
           Height,               //縦幅を設定
           NULL,                 //親ウインドウを設定
           NULL,                 //メニューを設定
           hInstance,            //インスタンスを識別
           NULL);                //作成したウインドウに渡すデータへのポインタ
 
  //ウインドウの表示(表示方法はnCmdShowに従う)
  ShowWindow(hWnd, nCmdShow);
  return(hWnd);
}

//--------------------------------------------------------
//■関数 WinMain
//■用途 メインの関数 
//■引数
// hInstance    ...現在のインスタンスのハンドル
// hPrevInstance...以前のインスタンスのハンドル
// pszCmdLine   ...コマンド ラインのアドレス
// nCmdShow     ...ウィンドウの表示状態
//--------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
   MSG msg;

  //メインウインドウを作成
  CreateMainWindow(300,300,"ツールバーコントロールを作成する",hInstance,nCmdShow,(WNDPROC)WindowProc,
       WS_OVERLAPPEDWINDOW|WS_TABSTOP,WS_EX_CONTROLPARENT,NULL,LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION)));

  //送られてくるメッセージを翻訳してプロシージャに渡す  
  while (GetMessage(&msg, NULL, 0, 0)) 
  {
    TranslateMessage(&msg); 
    DispatchMessage(&msg);   
  } 
 return (msg.wParam);
}
//------------------------------------------------------
// ■関数 WindowProc
// ■用途 メインウインドウに送られるメッセージを処理
// ■引数
//   hwnd    ...ウインドウのハンドル
//   uMsg    ...メッセージID
//   wParam  ...第1メッセージ パラメータ    
//   lParam  ...第2メッセージ パラメータ
//------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{  
    TBBUTTON     TB[6];
    TBADDBITMAP  TBADD;

    TOOLINFO     ToolInfo;
    HWND         hToolTips;
 switch (uMsg)
 {
  case WM_CREATE: 
  {  
       ZeroMemory(TB,sizeof(TBBUTTON)*6);
       ZeroMemory(&TBADD,sizeof(TBADDBITMAP));

       //セパレータ 
       TB[0].fsStyle = TBSTYLE_SEP;
       
       TB[1].iBitmap   = STD_FILENEW;     //ボタンイメージのインデックス値
       TB[1].idCommand = ID_NEW;          //コマンドID
       TB[1].fsState   = TBSTATE_ENABLED; //ボタンの状態
       TB[1].fsStyle   = TBSTYLE_BUTTON;  //ボタンのスタイル

       TB[2].iBitmap   = STD_FILEOPEN;
       TB[2].idCommand = ID_OPEN;
       TB[2].fsState   = TBSTATE_ENABLED;
       TB[2].fsStyle   = TBSTYLE_BUTTON;

       TB[3].iBitmap   = STD_FILESAVE;
       TB[3].idCommand = ID_SAVE;
       TB[3].fsState   = 0;
       TB[3].fsStyle   = TBSTYLE_BUTTON;
       
       //セパレータ
       TB[4].fsStyle   = TBSTYLE_SEP;

       TB[5].iBitmap   = STD_PRINT;
       TB[5].idCommand = ID_PRINT;
       TB[5].fsState   = TBSTATE_ENABLED;
       TB[5].fsStyle   = TBSTYLE_BUTTON;
      
       //ビットマップが存在するモジュールのインスタンスハンドル(システムで定義したビットマップを使用)
       TBADD.hInst  = HINST_COMMCTRL;
       
        //コモンコントロールの初期化
        InitCommonControls(); 
        //ツールバーコントロールの作成
        hTool=CreateToolbarEx(hwnd,                                    //親ウインドウのハンドル
                        WS_CHILD | WS_VISIBLE|WS_BORDER,               //ウインドウスタイル
                        ID_TOOLBAR,                                    //コントールID
                        6,                                             //ボタンイメージの数
                        (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),  //インスタンスハンドル
                        IDB_STD_SMALL_COLOR,                           //ビットマップリソースのためのリソース識別子(NULlならばビットマップのハンドル)
                        TB,                                            //TBBUTTON へのポインタ
                        6,                                             //追加するボタン数
                        0,0,16,16,                                     //ボタンの領域
                        sizeof(TBBUTTON));                             //TBBUTTON構造体のサイズ

        //ビットマップリソースの追加
        SendMessage(hTool,TB_ADDBITMAP,6,(LPARAM)&TBADD);

         //以下はツールチップの付加--->

         hToolTips=CreateWindowEx(0,TOOLTIPS_CLASS,"",TTS_ALWAYSTIP,
                     CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hwnd,
                     (HMENU)NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),NULL);   
            
         ZeroMemory(&ToolInfo,sizeof(TOOLINFO));

         //構造体の設定
         ToolInfo.cbSize=sizeof(TOOLINFO);                               //構造体のサイズ
         ToolInfo.hwnd=hTool;                                            //親ウインドウのハンドル
         ToolInfo.uFlags=TTF_SUBCLASS    ;                                //フラグ
         ToolInfo.hinst=(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);   //インスタンスハンドル
         ToolInfo.uId=ID_NEW   ;                                         //表示するコントロールID
         ToolInfo.lpszText="新規作成";                                    //ツールチップのテキスト
         //ツールチップの表示対象領域                      
         SendMessage(hTool, TB_GETITEMRECT, ID_NEW, (LPARAM)&ToolInfo.rect);        
         //ツールチップを追加する
         SendMessage(hToolTips,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ToolInfo);
         
         ToolInfo.uId=ID_OPEN   ;                                         
         ToolInfo.lpszText="ファイルを開く";
         //ツールチップの表示対象領域                      
         SendMessage(hTool, TB_GETITEMRECT, ID_OPEN, (LPARAM)&ToolInfo.rect);        
         //ツールチップを追加する
         SendMessage(hToolTips,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ToolInfo);

         ToolInfo.uId=ID_SAVE   ;                                         
         ToolInfo.lpszText="ファイルを保存(現在使用できません)";
         //ツールチップの表示対象領域                      
         SendMessage(hTool, TB_GETITEMRECT, ID_SAVE, (LPARAM)&ToolInfo.rect);        
         //ツールチップを追加する
         SendMessage(hToolTips,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ToolInfo);

         ToolInfo.uId=ID_PRINT   ;                                         
         ToolInfo.lpszText="印刷";
         //ツールチップの表示対象領域                      
         SendMessage(hTool, TB_GETITEMRECT, ID_PRINT, (LPARAM)&ToolInfo.rect);        
         //ツールチップを追加する
         SendMessage(hToolTips,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ToolInfo);

         //今度はツールバーにツールチップをセットする
         SendMessage(hTool, TB_SETTOOLTIPS, (WPARAM)hToolTips, 0);

        break;
  }
 case WM_COMMAND:
       switch (LOWORD(wParam))
       {
            case ID_OPEN : MessageBox(hwnd,"ファイルを開くボタンをクリック","情報",MB_OK);break;
          case ID_NEW  : MessageBox(hwnd,"新規作成ボタンをクリック","情報",MB_OK);break;
          case ID_SAVE : MessageBox(hwnd,"このボタンは押せないはずなのに何故押せるの?","情報",MB_OK);break;
          case ID_PRINT: MessageBox(hwnd,"印刷ボタンをクリック","情報",MB_OK);break;
       }
      break;
 case WM_SIZE:
        SendMessage(hTool,WM_SIZE,wParam,lParam);
        break;
 case WM_DESTROY:
        PostQuitMessage(0);
        break;
 default: return(DefWindowProc(hwnd, uMsg, wParam, lParam)); 
 }
 
 return (0);

}

ソースコード一式のダウンロード

capi_sample72.zip 3,342 バイト

動作環境

このサンプルは 「Windows98」及び「Microsoft Visual C++5.0」「Borland C++ Compiler 5.5」で確認しております。環境が異なる場合は正常に動作しない場合もございますのでご了承下さい。

Visual C++5.0でのコンパイル

VC5.0でサンプルをコンパイルする場合は新規プロジェクト(Win32Application)を作成後、各ファイルを追加してビルドしてください。

Borland C++ Compiler 5.5でのコンパイル

BCC5.5でサンプルをコンパイルする場合は「bcc32.exe」で*.c又は*.cppファイルをコンパイルします。リソースがある場合は「brc32.exe」で*resファイルを付与してください。

サンプルについて

このWindows APIサンプル集(C/C++版)は2000年頃にC/C++言語の学習の為に作成したものです。コードはエレガントではなく「初心者レベルのコーディング」です。仕事などの業務で利用する際にはエラー処理やメモリ解放などの再確認を必ずして下さい。





関連記事



公開日:2015年03月19日
記事NO:00528