#include <commctrl.h>
#pragma comment( lib, "comctl32.lib") // для CreateToolBarEx - comctl32.dll
ToolBar +RC+ WinAPI
Создал я окошечко CreateWindow - ом, соотвественно есть его хэндл.
Да и еще вопрос - как создать функции, реагирующие на нажатия соответствующих кнопок на тулбаре?
В WndProc прописать что-то типа такого:
=== куть ===
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case ID_BUT1:
DoSomethingProc();
break;
}
}
=== куть ===
Счас опишу все подробно, если еще кому-нибудь это будет нужно когда-либо.
ToolBar. Подключаеи ToolBar на WinAPI.
Итак, у меня в проекте есть ресурсный файл. Создаем там тулбар. Например, сделаем две кнопки.
Первая кнопка - ID_CUBE, вторая кнопка - ID_MOVE.
Если создать меню, в котором будет пункт "Куб" и установить у него ID_CUBE, то автоматически получаем связь ТулБара с меню =) (Ну об этом все знают).
Не забудьте подключить:
Код:
мои переменные и константы:
Код:
//Количество кнопок в тулбаре
#define NUM_TBBUTTONS 2
//Количест во картинок в тулбаре на кнопочках
#define NUM_TBBITMAPS 2
//Размеры картинки
#define BMP_CX 16
#define BMP_CY 16
//Минимальные размеры у Ребара.
#define MIN_CY 30
#define MIN_TBCX 200
#define ID_TOOLBAR 1000
#define ID_REBAR 13001
// Handles to tool control windows
HWND hWndToolBar, hWndRebar;
//Кнопочки для ТулБара
TBBUTTON tbButtons[] = {
{ 0, ID_CUBE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, ID_CUBE},
{ 1, ID_MOVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, ID_MOVE}
};
#define NUM_TBBUTTONS 2
//Количест во картинок в тулбаре на кнопочках
#define NUM_TBBITMAPS 2
//Размеры картинки
#define BMP_CX 16
#define BMP_CY 16
//Минимальные размеры у Ребара.
#define MIN_CY 30
#define MIN_TBCX 200
#define ID_TOOLBAR 1000
#define ID_REBAR 13001
// Handles to tool control windows
HWND hWndToolBar, hWndRebar;
//Кнопочки для ТулБара
TBBUTTON tbButtons[] = {
{ 0, ID_CUBE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, ID_CUBE},
{ 1, ID_MOVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, ID_MOVE}
};
Как я уже говорил, хэндл моего окна hWnd.
Далее. В функции WndProc прописываем по ON_CREATE:
Код:
if (!CreateRebar(hWnd)) //Если надо с Rebar-ом
//if (!CreateTheToolBar(hWnd)) //Если просто нужен ТулБар без Ребар-а
MessageBox (NULL, TEXT("Could not create rebar."), NULL, MB_OK );
break;
//if (!CreateTheToolBar(hWnd)) //Если просто нужен ТулБар без Ребар-а
MessageBox (NULL, TEXT("Could not create rebar."), NULL, MB_OK );
break;
А вот и сама функция:
Код:
/****************************************************************************
* FUNCTION: CreateRebar(HWND)
* PURPOSE: Creates the rebar
*****************************************************************************/
UINT CreateRebar(HWND hWndParent)
{
INITCOMMONCONTROLSEX icex;
//This is where we create the rebar control
// First, we initialize the common controls
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_COOL_CLASSES | ICC_USEREX_CLASSES; // load the rebar and combo
InitCommonControlsEx(&icex);
// Create the REBAR control
hWndRebar = CreateWindowEx(
0L,
REBARCLASSNAME,
NULL,
WS_VISIBLE | WS_BORDER | WS_CHILD | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NOPARENTALIGN |
RBS_VARHEIGHT | RBS_BANDBORDERS,
0, 0, 500, 20, //Собственно, размеры Ребара =)
hWndParent,
(HMENU)ID_REBAR,
hInst,
NULL );
if (!hWndRebar)
return 0;
// Создаем ТулБар и добавляем его к нашему ребару
if ((hWndToolBar = CreateTheToolBar(hWndRebar)) == NULL)
MessageBox (NULL, TEXT("Could not create the toolbar"), NULL, MB_OK );
return 1;
}
* FUNCTION: CreateRebar(HWND)
* PURPOSE: Creates the rebar
*****************************************************************************/
UINT CreateRebar(HWND hWndParent)
{
INITCOMMONCONTROLSEX icex;
//This is where we create the rebar control
// First, we initialize the common controls
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_COOL_CLASSES | ICC_USEREX_CLASSES; // load the rebar and combo
InitCommonControlsEx(&icex);
// Create the REBAR control
hWndRebar = CreateWindowEx(
0L,
REBARCLASSNAME,
NULL,
WS_VISIBLE | WS_BORDER | WS_CHILD | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NOPARENTALIGN |
RBS_VARHEIGHT | RBS_BANDBORDERS,
0, 0, 500, 20, //Собственно, размеры Ребара =)
hWndParent,
(HMENU)ID_REBAR,
hInst,
NULL );
if (!hWndRebar)
return 0;
// Создаем ТулБар и добавляем его к нашему ребару
if ((hWndToolBar = CreateTheToolBar(hWndRebar)) == NULL)
MessageBox (NULL, TEXT("Could not create the toolbar"), NULL, MB_OK );
return 1;
}
А вот код функции CreateTheToolBar:
Код:
/************************************************************************
*
* Создаем ТулБар и пихаем его в наш диалог
*
*************************************************************************/
HWND CreateTheToolBar (HWND hWndParent)
{
REBARBANDINFO rbBand;
hWndToolBar = CreateToolbarEx(hWndParent,
WS_CHILD | TBSTYLE_LIST | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | WS_VISIBLE,
ID_TOOLBAR, //Идентификатор ТулБара
NUM_TBBITMAPS, //Количество картинок
(HINSTANCE)hInst, //Module instance with the executable file that contains the bitmap resource.
IDR_TOOLBAR1, //Ресурсы
(LPCTBBUTTON)&tbButtons, //Кнопочки
NUM_TBBUTTONS, //количество кнопок
BMP_CX,BMP_CY, // width & height of buttons
BMP_CX,BMP_CY, // width & height of bitmaps
sizeof(TBBUTTON));
if (hWndToolBar == NULL )
{
MessageBox (NULL, TEXT("Toolbar not created!"), NULL, MB_OK );
return (HWND)NULL;
}
// Initialize REBARBANDINFO for all rebar bands
rbBand.cbSize = sizeof(REBARBANDINFO);
rbBand.fMask = RBBIM_COLORS | // clrFore and clrBack are valid
RBBIM_CHILD | // hwndChild is valid
RBBIM_CHILDSIZE | // cxMinChild and cyMinChild are valid
RBBIM_STYLE | // fStyle is valid
RBBIM_ID | // wID is valid
RBBIM_BACKGROUND; // hbmBack is valid
rbBand.clrFore = GetSysColor(COLOR_BTNTEXT);
rbBand.clrBack = GetSysColor(COLOR_BTNFACE);
rbBand.fStyle = RBBS_NOVERT | // do not display in vertical orientation
RBBS_CHILDEDGE |
RBBS_FIXEDBMP;
rbBand.hbmBack = LoadBitmap(hInst, MAKEINTRESOURCE(ID_CUBE));
rbBand.hwndChild = hWndToolBar;
rbBand.wID = ID_TOOLBAR;
rbBand.cxMinChild = MIN_TBCX;
rbBand.cyMinChild = MIN_CY;
// Insert band into rebar
SendMessage(hWndRebar, RB_INSERTBAND, (UINT) -1, (LPARAM) (LPREBARBANDINFO) &rbBand);
return (hWndToolBar);
}
*
* Создаем ТулБар и пихаем его в наш диалог
*
*************************************************************************/
HWND CreateTheToolBar (HWND hWndParent)
{
REBARBANDINFO rbBand;
hWndToolBar = CreateToolbarEx(hWndParent,
WS_CHILD | TBSTYLE_LIST | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | WS_VISIBLE,
ID_TOOLBAR, //Идентификатор ТулБара
NUM_TBBITMAPS, //Количество картинок
(HINSTANCE)hInst, //Module instance with the executable file that contains the bitmap resource.
IDR_TOOLBAR1, //Ресурсы
(LPCTBBUTTON)&tbButtons, //Кнопочки
NUM_TBBUTTONS, //количество кнопок
BMP_CX,BMP_CY, // width & height of buttons
BMP_CX,BMP_CY, // width & height of bitmaps
sizeof(TBBUTTON));
if (hWndToolBar == NULL )
{
MessageBox (NULL, TEXT("Toolbar not created!"), NULL, MB_OK );
return (HWND)NULL;
}
// Initialize REBARBANDINFO for all rebar bands
rbBand.cbSize = sizeof(REBARBANDINFO);
rbBand.fMask = RBBIM_COLORS | // clrFore and clrBack are valid
RBBIM_CHILD | // hwndChild is valid
RBBIM_CHILDSIZE | // cxMinChild and cyMinChild are valid
RBBIM_STYLE | // fStyle is valid
RBBIM_ID | // wID is valid
RBBIM_BACKGROUND; // hbmBack is valid
rbBand.clrFore = GetSysColor(COLOR_BTNTEXT);
rbBand.clrBack = GetSysColor(COLOR_BTNFACE);
rbBand.fStyle = RBBS_NOVERT | // do not display in vertical orientation
RBBS_CHILDEDGE |
RBBS_FIXEDBMP;
rbBand.hbmBack = LoadBitmap(hInst, MAKEINTRESOURCE(ID_CUBE));
rbBand.hwndChild = hWndToolBar;
rbBand.wID = ID_TOOLBAR;
rbBand.cxMinChild = MIN_TBCX;
rbBand.cyMinChild = MIN_CY;
// Insert band into rebar
SendMessage(hWndRebar, RB_INSERTBAND, (UINT) -1, (LPARAM) (LPREBARBANDINFO) &rbBand);
return (hWndToolBar);
}
и теперь только остается сделать обработчики. Они делаются просто. в WndProc прописать:
Код:
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case ID_CUBE:
MessageBox (NULL, TEXT("IN_CUBE."), NULL, MB_OK );
break;
case ID_MOVE:
DoSomethingProc();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case ID_CUBE:
MessageBox (NULL, TEXT("IN_CUBE."), NULL, MB_OK );
break;
case ID_MOVE:
DoSomethingProc();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;