<Previous> <Next> <SDK Top> <Top>
3章.6節.ツールバーに既存のビットマップ(STD, VIEW)を全部表示させてみよう
タイトルどおり既存のビットマップを小と大で全部表示させてみました.
今回は,
「文字とビットマップ(STD大)を挿入したツールバー」
「ビットマップ(VIEW大)を挿入したツールバー」
「ビットマップ(STD小, VIEW小)を挿入したツールバー」
の三本のツールバーを作ってみました.
今回はボタンが54個あります.しかし,同じアイコンを大と小で2回使っているので実質は27個ですね.
それでは,いつもどおり27個のボタンIDを作ってみましょう.
(IDの作り方を知らない方は,「別章.2節.ストリングテーブルを編集してみよう」を先に読んでください.)
ここに書き出すのが面倒なので,スクリーン画面でどうぞ.
今回のポイントは,
@ツールバーボタンの大・小をどうやって切り替える?
Aツールバーボタンの文字の表示・非表示をどうやって切り替える
というところですね.
では,プログラムを見ましょう.
#include "stdafx.h" #include <commctrl.h> #include "resource.h" #pragma comment(lib, "comctl32.lib") #define MAX_LOADSTRING 100 #define IDC_RICHEDIT (101) // グローバル変数: HINSTANCE hInst; // 現在のインスタンス TCHAR szTitle[MAX_LOADSTRING]; // タイトル バー テキスト TCHAR szWindowClass[MAX_LOADSTRING]; // タイトル バー テキスト // このコード モジュールに含まれる関数の前宣言: ATOM MyRegisterClass( HINSTANCE hInstance ); BOOL InitInstance( HINSTANCE, int ); LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); HWND ToolBarCreate(HWND hWnd); void ToolBarAddBitmapEx(HWND hToolBar, int nBotton, TBBUTTON* tbb, HINSTANCE hInst, UINT nID); void ToolBarAddButtonsEx(HWND hToolBar, int nBotton, TBBUTTON* tbb, BOOL bString); void ToolBarAddButtonSpaceEx(HWND hToolBar); HWND hToolBar1; HWND hToolBar2; HWND hToolBar3; #define TOOL1_HEIGHT (50) #define TOOL2_HEIGHT (40) #define TOOL3_HEIGHT (30) #define NUMTBB1 (15) #define NUMTBB2 (12) TBBUTTON tbb1[NUMTBB1] = { {STD_COPY, IDC_BUTTON1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_CUT, IDC_BUTTON2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_DELETE, IDC_BUTTON3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_FILENEW, IDC_BUTTON4, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_FILEOPEN, IDC_BUTTON5, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_FILESAVE, IDC_BUTTON6, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_FIND, IDC_BUTTON7, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_HELP, IDC_BUTTON8, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_PASTE, IDC_BUTTON9, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_PRINT, IDC_BUTTON10, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_PRINTPRE, IDC_BUTTON11, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_PROPERTIES, IDC_BUTTON12, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_REDOW, IDC_BUTTON13, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_REPLACE, IDC_BUTTON14, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_UNDO, IDC_BUTTON15, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, }; TBBUTTON tbb2[NUMTBB2] = { {VIEW_DETAILS, IDC_BUTTON16, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_LARGEICONS, IDC_BUTTON17, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_LIST, IDC_BUTTON18, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_NETCONNECT, IDC_BUTTON19, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_NETDISCONNECT, IDC_BUTTON20, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_NEWFOLDER, IDC_BUTTON21, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_PARENTFOLDER, IDC_BUTTON22, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_SMALLICONS, IDC_BUTTON23, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_SORTDATE, IDC_BUTTON24, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_SORTNAME, IDC_BUTTON25, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_SORTSIZE, IDC_BUTTON26, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {VIEW_SORTTYPE, IDC_BUTTON27, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, }; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg; HACCEL hAccelTable; // グローバル ストリングを初期化します LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_SAMPLE, szWindowClass, MAX_LOADSTRING); MyRegisterClass( hInstance ); // アプリケーションの初期化を行います: if( !InitInstance( hInstance, nCmdShow ) ) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SAMPLE); // メイン メッセージ ループ: while( GetMessage(&msg, NULL, 0, 0) ) { if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } return msg.wParam; } ATOM MyRegisterClass( HINSTANCE hInstance ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_SAMPLE); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCSTR)IDC_SAMPLE; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx( &wcex ); } BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) { HWND hWnd; hInst = hInstance; // グローバル変数にインスタンス ハンドルを保存します hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if( !hWnd ) { return FALSE; } ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; static char szBuf[256]=""; switch( message ) { case WM_CREATE: // ツールバーを作る hToolBar1 = ToolBarCreate( hWnd ); // ツールバーにグラフィックの挿入 ToolBarAddBitmapEx( hToolBar1, NUMTBB1, tbb1, HINST_COMMCTRL, IDB_STD_LARGE_COLOR ); // ツールバーにボタンを挿入する ToolBarAddButtonsEx( hToolBar1, NUMTBB1, tbb1, TRUE ); // ツールバーを作る hToolBar2 = ToolBarCreate( hWnd ); // ツールバーにグラフィックの挿入 ToolBarAddBitmapEx( hToolBar2, NUMTBB2, tbb2, HINST_COMMCTRL, IDB_VIEW_LARGE_COLOR ); // ツールバーにボタンを挿入する ToolBarAddButtonsEx( hToolBar2, NUMTBB2, tbb2, FALSE ); // ツールバーを作る hToolBar3 = ToolBarCreate( hWnd ); // ツールバーにグラフィックの挿入 ToolBarAddBitmapEx( hToolBar3, NUMTBB1, tbb1, HINST_COMMCTRL, IDB_STD_SMALL_COLOR ); // ツールバーにボタンを挿入する ToolBarAddButtonsEx( hToolBar3, NUMTBB1, tbb1, FALSE ); // ツールバーにスペース ToolBarAddButtonSpaceEx(hToolBar3); // ツールバーにグラフィックの挿入 ToolBarAddBitmapEx( hToolBar3, NUMTBB2, tbb2, HINST_COMMCTRL, IDB_VIEW_SMALL_COLOR ); // ツールバーにボタンを挿入する ToolBarAddButtonsEx( hToolBar3, NUMTBB2, tbb2, FALSE ); break; case WM_SIZE: MoveWindow(hToolBar1, 0, 0, LOWORD(lParam), TOOL1_HEIGHT, TRUE); MoveWindow(hToolBar2, 0, TOOL1_HEIGHT, LOWORD(lParam), TOOL2_HEIGHT, TRUE); MoveWindow(hToolBar3, 0, TOOL1_HEIGHT+TOOL2_HEIGHT, LOWORD(lParam), TOOL3_HEIGHT, TRUE); break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hWnd, message, wParam, lParam ); } return 0; } HWND ToolBarCreate(HWND hWnd) { HWND hTool; InitCommonControls(); hTool = CreateWindowEx( WS_EX_TOOLWINDOW, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | CCS_NORESIZE, 0,0,0,0, hWnd, NULL, hInst, NULL); SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); return hTool; } void ToolBarAddBitmapEx(HWND hToolBar, int nBotton, TBBUTTON* tbb, HINSTANCE hInst, UINT nID) { int i, index; TBADDBITMAP tbAddBmp; tbAddBmp.hInst = hInst; tbAddBmp.nID = nID; index = SendMessage(hToolBar, TB_ADDBITMAP, 0, (LPARAM)&tbAddBmp); for( i=0; i<nBotton; i++ ) tbb[i].iBitmap += index; } void ToolBarAddButtonsEx(HWND hToolBar, int nBotton, TBBUTTON* tbb, BOOL bString) { int i, index; char szBuf[256]; int nAddBotton[20]; if (bString == TRUE) { for( i=0; i<nBotton; i++ ) { LoadString(hInst, tbb[i].idCommand, (LPSTR)&szBuf, sizeof(szBuf)); nAddBotton[i] = (int)SendMessage(hToolBar, TB_ADDSTRING, 0, (LPARAM)(LPSTR)szBuf); tbb[i].iString = nAddBotton[i]; } } SendMessage(hToolBar, TB_ADDBUTTONS, (WPARAM)nBotton, (LPARAM)tbb); } void ToolBarAddButtonSpaceEx(HWND hToolBar) { TBBUTTON tbSpace = {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0}; SendMessage(hToolBar, TB_ADDBUTTONS, 1, (LPARAM)&tbSpace); }
☆プログラムの解説☆ @ツールバーボタンの大・小をどうやって切り替える? はじめに, void ToolBarAddBitmapEx(HWND hToolBar, int nBotton, TBBUTTON* tbb, HINSTANCE hInst, UINT nID); void ToolBarAddButtonsEx(HWND hToolBar, int nBotton, TBBUTTON* tbb, BOOL bString); void ToolBarAddButtonSpaceEx(HWND hToolBar); 今まで作ってきた関数名の最後にすべてExが付加されています. なぜ関数名にExをつけたかというと,引数にツールバーのハンドルを指定できるようにしたんです. 機能的な拡張はなく,ただそれだけです. これまでは,ツールバーが1つだったんですが, 今回は,ツールバーが3つもあるので,指定できるようにしました. てか,はじめから指定できるようにすればよかったんですね. 本題の「ボタンの大小の切り替え」ですが, ToolBarAddBitmapEx関数の最後の定数を STDなら:IDB_STD_SMALL_COLOR ⇔ IDB_STD_LARGE_COLOR VIEWなら:IDB_VIEW_SMALL_COLOR ⇔ IDB_VIEW_LARGE_COLOR を切り替えるだけです. Aツールバーボタンの文字の表示・非表示をどうやって切り替える ToolBarAddButtonsEx関数を覗いてみましょう. void ToolBarAddButtonsEx(HWND hToolBar, int nBotton, TBBUTTON* tbb, BOOL bString) { int i, index; char szBuf[256]; int nAddBotton[20]; if (bString == TRUE) { for( i=0; i<nBotton; i++ ) { LoadString(hInst, tbb[i].idCommand, (LPSTR)&szBuf, sizeof(szBuf)); nAddBotton[i] = (int)SendMessage(hToolBar, TB_ADDSTRING, 0, (LPARAM)(LPSTR)szBuf); tbb[i].iString = nAddBotton[i]; } } SendMessage(hToolBar, TB_ADDBUTTONS, (WPARAM)nBotton, (LPARAM)tbb); } この関数も最後にExがついて,引数にツールバーのハンドル(HWND hToolBarってやつ)が指定できるようになってますね. しかし,この関数だけもう1つ引数(BOOL bString)が増えています. この引数に TRUEを与えれば,文字列表示ボタン, FALSEを与えれば,文字列非表示ボタン, としています. ただそれだけですね. 最後に,WM_SIZEのところで3つのツールバーをどう配置しているかというところはポイントです!! プログラムを直接見ていただければ,わかると思います. 今回は特に機能的な拡張はありません.汎用性が増しただけですね.![]()
![]()
![]()
------------------------------------------------------------------------------------------------
当ページの一部または全部を転載、複写、複製することを禁じます。
また,当サイトを利用した結果に関するトラブル等は、一切関与いたしませんのでご容赦下さい。
Update 04/03/19 By 松本義弘
------------------------------------------------------------------------------------------------