Операционная система Windows 95 для программиста

Вызов функции создания окна 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 может состоять из нескольких строк. Новые строки создаются в том случае, если все кнопки не помещаются в одной строке
Ниже мы перечислим стили, которые можно использовать не только для 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, описывающей кнопки.


Содержание раздела