Вызов функции создания окна Toolbar
Теперь, когда вы подготовили файл изображения кнопок, создали для него идентификатор в файле ресурсов приложения и подготовили массив структур TBBITMAP , описывающий кнопки, можно создавать окно Toolbar. Проще всего это сделать при помощи специально предназначенной для этого функции CreateToolbarEx:
HWND CreateToolbarEx( HWND hwnd, // идентификатор родительского окна DWORD ws, // стили окна Toolbar UINT wID, // идентификатор органа Toolbar int nBitmaps,// количество пиктограмм с изображением кнопок HINSTANCE hBMInst, // идентификатор приложения UINT wBMID, // идентификатор битового изображения кнопок LPCTBBUTTON lpButtons, // адрес описания кнопок int iNumButtons, // количество кнопок int dxButton, // ширина кнопок (в пикселах) int dyButton, // высота кнопок int dxBitmap,// ширина пиктограмм, нарисованных на кнопках int dyBitmap,// высота пиктограмм, нарисованных на кнопках UINT uStructSize // размер структуры в байтах );
Как можно узнать из документации, эта функция создает окно Toolbar и добавляет в него кнопки, описанные в массиве структур TBBITMAP. При этом ей также нужно указать идентификатор изображения кнопок, а также другие параметры, перечисленные выше.
При удачном завершении функция CreateToolbarEx возвращает идентификатор созданного органа управления Toolbar , который можно будет использовать для посылки сообщений. Если же Toolbar по каким-либо причинам создать так и не удалось, функция возвращает значение NULL.
Перед первым вызовом этой функции следует вызвать функцию InitCommonControls, которая не имеет параметров, не возвращает никакого значения и служит для инициализации библиотеки стандартных органов управления.
Вот пример применения этой функции в приложении Smart Application, исходные тексты которого будут приведены позже:
hwndTb = CreateToolbarEx(hWnd, WS_CHILD | WS_BORDER | WS_VISIBLE | TBSTYLE_TOOLTIPS | CCS_ADJUSTABLE, IDT_TOOLBAR, // идентификатор органа Toolbar 8, // количество пиктограмм hInst, // идентификатор приложения IDB_TBBITMAP, // идентификатор битового изображения кнопок (LPCTBBUTTON)&tbButtons, // адрес описания кнопок 11, // количество кнопок 16, 16, // ширина и высота кнопок 16, 16, // ширина и высота пиктограмм sizeof(TBBUTTON)); // размер структуры в байтах
В качестве первого параметра мы передаем функции идентификатор главного окна приложения. Это окно будет получать от органа Toolbar извещения в виде сообщений WM_COMMAND и WM_NOTIFY.
Параметр ws определяет стили окна Toolbar . Так как это окно всегда является дочерним по отношению к создавшему его окну, необходимо использовать стиль WS_CHILD. Для того чтобы окно Toolbar имело рамку и было видимым, мы указываем стили WS_BORDER и WS_VISIBLE. Если нужно чтобы пользователь мог изменять внешний вид Toolbar, необходимо использовать стиль CCS_ADJUSTABLE.
Кроме того, для органа управления Toolbar вы можете задать следующие стили:
Стиль Toolbar | Описание |
TBSTYLE_TOOLTIP | Вывод краткого описания кнопки в окне органа управления Tool Tip |
TBSTYLE_ALTDRAG | Если не указан стиль TBSTYLE_ALTDRAG, то пользователь может передвигать кнопки по поверхности Toolbar левой клавишей мыши при нажатой клавише <Shift>. Если же этот стиль указан, для перемещения кнопок используется клавиша <Alt>. В любом случае кнопки можно передвигать только тогда, когда указан стиль CCS_ADJUSTABLE |
TBSTYLE_WRAPABLE | Окно Toolbar может состоять из нескольких строк. Новые строки создаются в том случае, если все кнопки не помещаются в одной строке |
Стиль | Описание |
CCS_ADJUSTABLE | Если указан этот стиль, пользователь может изменять конфигурацию органа управления |
CCS_BOTTOM | Орган управления должен быть расположен в нижней части внутренней области окна |
CCS_TOP | Орган управления должен быть расположен в верхней части внутренней области окна |
CCS_NODIVIDER | В верхней части органа управления не надо рисовать разделительную линию шириной 2 пиксела |
CCS_NOHILITE | В верхней части органа управления не надо рисовать выделяющую линию шириной 1 пиксел |
CCS_NOMOVEY | В ответ на сообщение WM_SIZE орган управления будет изменять свои горизонтальные размеры и будет передвигаться по горизонтали, однако при этом его вертикальные размеры останутся прежними |
CCS_NOPARENTALIGN | Орган управления не будет автоматически перемещаться в верхнюю или нижнюю часть родительского окна |
CCS_NORESIZE | При установке начальных размеров не будут использоваться размеры, заданные по умолчанию. Приложение должно задать размеры органа управления явным образом |
Как мы уже говорили, вы можете создать Toolbar при помощи функции CreateWindowEx. Однако в этом случае вам придется добавлять к Toolbar изображение кнопок и сами кнопки, посылая ему сообщения TB_ADDBITMAP и TB_ADDBUTTONS.
Ниже приведен фрагмент исходного текста приложения, создающего Toolbar при помощи функции CreateWindowEx:
TBADDBITMAP tbab; hwndTb = CreateWindowEx(0, TOOLBARCLASSNAME, (LPSTR)NULL, WS_CHILD | WS_BORDER | WS_VISIBLE | TBSTYLE_TOOLTIPS | CCS_ADJUSTABLE, 0, 0, 0, 0, hWnd, (HMENU)IDT_TOOLBAR, // идентификатор органа Toolbar hInst, // идентификатор приложения NULL); if(hwndTb == NULL) return FALSE;
SendMessage(hwndTb, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
tbab.hInst = hInst; tbab.nID = IDB_TBBITMAP; SendMessage(hwndTb, TB_ADDBITMAP, (WPARAM)8, (LPARAM)&tbab);
SendMessage(hwndTb, TB_ADDBUTTONS, (WPARAM)11, (LPARAM)&tbButtons);
Сразу после создания окна Toolbar мы посылаем ему сообщение TB_BUTTONSTRUCTSIZE, указывая в нем размер структуры TBBUTTON.
Затем мы заполняем структуру TBADDBITMAP:
typedef struct { HINSTANCE hInst; UINT nID; } TBADDBITMAP, *LPTBADDBITMAP;
В поле hInst этой структуры мы записываем идентификатор приложения, в поле nID - идентификатор изображения кнопок, определенного в ресурсах приложения.
Адрес заполненной структуры типа TBADDBITMAP и количество изображений мы передаем в качестве параметров сообщения TB_ADDBITMAP.
После этого мы добавляем в Toolbar кнопки, передавая ему сообщение TB_ADDBUTTONS. Через параметры этого сообщения мы передаем количество кнопок (с учетом разделителей) и адрес заполненной структуры TBBUTTON, описывающей кнопки.