<Previous> <Next> <SDK Top> <Top>
5章.2節.クールバーにツールバーを挿入してみよう
前回はクールバーにボタンだけを挿入しましたが,今回はツールバーを挿入してみましょう.
ツールバーは,3章4節で作ったものを挿入してみようと思います.
今回はボタンを3つですね,そのボタンのIDを決めてやりましょう.
(IDの作り方を知らない方は,「別章.2節.ストリングテーブルを編集してみよう」を先に読んでください.)
| ID | キャプション |
| IDC_BUTTON1 | ボタン1 |
| IDC_BUTTON2 | ボタン2 |
| IDC_BUTTON3 | ボタン3 |
今回のポイントは,
@どうやってクールバーにツールバーを挿入するか?
というところですね.
では,プログラムを見ましょう.
#include "stdafx.h"
#include <commctrl.h>
#include "resource.h"
#pragma comment(lib, "comctl32.lib")
#define MAX_LOADSTRING 100
#define TOOL_HEIGHT (40)
// グローバル変数:
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 );
void DispText(HWND hWnd, char* pszBuf);
HWND ButtonCreate(char *pszName, HWND hParent, int id);
HWND CoolBarCreate(HWND hWnd);
void CoolBarInitialize(void);
void CoolBarInsert(char *pszName, HWND hWnd, int cx);
HWND ToolBarCreate(HWND hWnd);
void ToolBarAddButtons(int nBotton, TBBUTTON* tbb);
HWND hCool, hBut1, hToolBar;
RECT rtRebar;
HDC hdc;
REBARBANDINFO rbBand;
TBBUTTON tbb1[2] =
{
{0, IDC_BUTTON1, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0, 0},
{1, IDC_BUTTON2, TBSTATE_ENABLED, TBSTYLE_CHECK, 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:
//クールバーを生成
hCool = CoolBarCreate(hWnd);
//クールバーに必要な変数の初期設定
CoolBarInitialize();
//ボタン1の作成
hBut1 = ButtonCreate("ボタン3", hCool, IDC_BUTTON3 );
//クールバーにボタン1を挿入
CoolBarInsert("ボタン3", hBut1, 150);
//ツールバーの作成
hToolBar = ToolBarCreate( hWnd );
ToolBarAddButtons( 2, tbb1 );
GetWindowRect(hCool, &rtRebar);
//クールバーにツールバーを挿入
CoolBarInsert( "ツールバー", hToolBar, rtRebar.right - rtRebar.left - 150 );
break;
case WM_PAINT:
DispText( hWnd, szBuf );
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch( wmId )
{
case IDC_BUTTON1:
lstrcpy( szBuf, "ボタン1が押されました");
break;
case IDC_BUTTON2:
lstrcpy( szBuf, "ボタン2が押されました");
break;
case IDC_BUTTON3:
lstrcpy( szBuf, "ボタン3が押されました");
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
InvalidateRect(hWnd, NULL, FALSE);//クライアント全体を再描画する命令
break;
case WM_SIZE:
MoveWindow(hCool, 0, 0, LOWORD(lParam), TOOL_HEIGHT, TRUE);
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}
void DispText(HWND hWnd, char* pszBuf)
{
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint ( hWnd, &ps );
TextOut( hdc, 30, 100, (LPSTR)pszBuf, lstrlen(pszBuf) );
EndPaint( hWnd, &ps );
}
HWND ButtonCreate(char *pszName, HWND hParent, int id)
{
return CreateWindow("BUTTON", pszName, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0, hParent, (HMENU)id, hInst ,NULL);
}
HWND CoolBarCreate(HWND hWnd)
{
HWND hCool;
REBARINFO rbi;
INITCOMMONCONTROLSEX ic;
ic.dwSize = sizeof(INITCOMMONCONTROLSEX);
ic.dwICC = ICC_COOL_CLASSES;
InitCommonControlsEx(&ic);
//クールバーの設定
hCool = CreateWindowEx(WS_EX_TOOLWINDOW,
REBARCLASSNAME,
NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_BANDBORDERS | CCS_NODIVIDER ,
0, 0,
0, 0,
hWnd,
NULL,
hInst,
NULL);
ZeroMemory(&rbi, sizeof(REBARINFO));
rbi.cbSize = sizeof(REBARINFO);
SendMessage(hCool, RB_SETBARINFO, 0, (LPARAM)&rbi);
return hCool;
}
void CoolBarInitialize(void)
{
ZeroMemory(&rbBand, sizeof(REBARBANDINFO));
rbBand.cbSize = sizeof(REBARBANDINFO);
rbBand.fMask = RBBIM_TEXT | RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE;
rbBand.fStyle = RBBS_CHILDEDGE;
rbBand.cxMinChild = 0;
rbBand.cyMinChild = 40;
}
void CoolBarInsert(char *pszName, HWND hWnd, int cx)
{
rbBand.lpText = pszName;
rbBand.hwndChild = hWnd;
rbBand.cx = cx;
SendMessage(hCool, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
}
HWND ToolBarCreate(HWND hWnd)
{
HWND hTool;
InitCommonControls();
hTool = CreateWindowEx(
WS_EX_TOOLWINDOW,
TOOLBARCLASSNAME,
NULL,
WS_CHILD | WS_VISIBLE |
CCS_ADJUSTABLE | CCS_NORESIZE,//| TBSTYLE_FLAT*/,
0,0,0,0,
hWnd,
NULL,
hInst,
NULL);
SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
return hTool;
}
void ToolBarAddButtons(int nBotton, TBBUTTON* tbb)
{
int i;
char szBuf[256];
int nAddBotton[20];
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);
}
☆プログラムの解説☆ @どうやってクールバーにツールバーを挿入するか? //ツールバーの作成 hToolBar = ToolBarCreate( hWnd ); ToolBarAddButtons( 2, tbb1 ); GetWindowRect(hCool, &rtRebar); //クールバーにツールバーを挿入 CoolBarInsert( "ツールバー", hToolBar, rtRebar.right - rtRebar.left - 150 ); なんと今回は,新たに作った関数はありません. 前回ボタンを作ったら,CoolBarInsert関数の第2引数にボタンのハンドルを指定しました. 今回はそれとまったく同じです. CoolBarInsertの第2引数に,ToolBarCreateで作ったツールバーのハンドルを与えています. しかし!!気をつけなければならないことは, 「クールバーにツールバーを挿入する前に,ボタンをツールバーに入れなければならない」 ということです. 簡単にいうと, 「クールバーの中にツールバーがあって,ツールバーの中にボタンがある」 ということです. だから先にボタンを詰めたツールバーを作ってしまってから,それをクールバーに入れなくてはいけません. 順序を間違えてしまうと,たぶんおかしなことになってしまうでしょう.![]()
![]()
![]()
------------------------------------------------------------------------------------------------
当ページの一部または全部を転載、複写、複製することを禁じます。
また,当サイトを利用した結果に関するトラブル等は、一切関与いたしませんのでご容赦下さい。
Update 04/03/07 By 松本義弘
------------------------------------------------------------------------------------------------