Операционная система Windows 95 для программиста© Александр Фролов, Григорий ФроловТом 22, М.: Диалог-МИФИ, 1993, 271 стр. 2.1. Орган управления ToolbarДля начала займемся изображениями, которые нарисованы на кнопках Toolbar . Затем мы расскажем вам о том, как создать окно органа управления Toolbar. Подготовка изображений для кнопокВ предыдущих томах "Библиотеки системного программиста" мы создавали Toolbar средствами Win16. Тогда для каждой кнопки мы готовили три различных изображения - для отжатого, нажатого и заблокированного состояния. Если кнопок много, рисовать приходится долго. Теперь вам нужно только одно изображение, правда, в нем должны располагаться рисунки для всех кнопок. В качестве примера лучше всего взять файл TOOLBAR.BMP, который создается автоматически генератором приложений AppWizard из Microsoft Visual C++ (рис. 2.1).
Рис. 2.1. Изображение стандартных кнопок для органа управления Toolbar , которое создается генератором приложений AppWizard Вы можете создать свои изображения, взяв этот файл за основу, изменив существующие пиктограммы или добавив новые. Для этого можно воспользоваться, например, приложением Paint, которое входит в состав Microsoft Windows 95. Можно также создать новый bmp-файл, который должен быть 16-цветным. Другое условие - все пиктограммы в этом изображении должны быть одного размера. В любом случае вы должны добавить созданное изображение в файл ресурсов приложения, снабдив его идентификатором, например: IDB_TBBITMAP BITMAP DISCARDABLE "toolbar.bmp" Если вы пользуетесь Microsoft Visual C++, то эта среда разработки приложений внесет все необходимые изменения в rc-файл автоматически, как только вы определите соответствующий ресурс. Описание кнопокДалее вы должны создать массив структур TBBUTTON , который описывает кнопки и разделители между группами кнопок. В этом массиве необходимо зарезервировать по одной структуре для каждой кнопки и для каждого разделителя групп кнопок. В файле commctrl.h находится такое определение структуры TBBUTTON: typedef struct _TBBUTTON { int iBitmap; int idCommand; BYTE fsState; BYTE fsStyle; DWORD dwData; int iString; } TBBUTTON, NEAR * PTBBUTTON, FAR * LPTBBUTTON; typedef const TBBUTTON FAR * LPCTBBUTTON; В поле iBitmap каждой структуры массива необходимо записать номер кнопки (нумерация начинается с нуля). Для разделителя в этом поле следует указать нулевое значение. В поле idCommand вы должны записать идентификатор, который будет передаваться родительскому окну с сообщением WM_COMMAND, когда пользователь нажмет соответствующую кнопку. Если элемент массива структур TBBUTTON описывает разделитель группы кнопок, в поле idCommand вам нужно записать нулевое значение. Поле fsState должно содержать флаг исходного
состояния кнопки:
Теперь вам не нужно готовить отдельные изображения для разных состояний кнопок, так как при необходимости Toolbar изменяет внешний вид кнопок автоматически. После того как Toolbar будет создан, приложение может изменять состояние кнопки, посылая окну Toolbar сообщение TB_SETSTATE. Позже мы перечислим сообщения, которые можно посылать окну Toolbar. Теперь займемся полем fsStyle. Как видно из
названия, в это поле нужно записать стиль кнопки.
Здесь вы можете использовать комбинацию
следующих стилей:
Через поле dwData можно передать дополнительные данные, которые будут хранится в описании кнопки и использоваться при необходимости. Вы можете записать в это поле нулевое значение. И, наконец, в поле iString можно записать номер текстовой строки, которую необходимо написать на поверхности кнопки. Для добавления таких строк к внутреннему списку Toolbar необходимо послать сообщение TB_ADDSTRING , передав вместе с ним адрес буфера с текстовыми строками. Все строки в этом буфере должны быть закрыты двоичным нулем, а последняя - двумя двоичными нулями. Если текстовые строки не используются, в поле iString следует записать нулевой значение. Вот образец подготовленного массива структур TBBUTTON, описывающий восемь кнопок и три разделителя между ними: TBBUTTON tbButtons[] = { { 0, ID_FILE_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, { 1, ID_FILE_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, { 2, ID_FILE_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, 0}, { 3, ID_EDIT_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, { 4, ID_EDIT_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, { 5, ID_EDIT_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, 0}, { 6, ID_FILE_PRINT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}, { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, 0}, { 7, ID_HELP_ABOUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0} }; Вызов функции создания окна 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 , но и для других
стандартных органов управления:
Как мы уже говорили, вы можете создать 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, описывающей кнопки. Обработка извещений от ToolbarОрган управления Toolbar посылает в родительское окно сообщения WM_COMMAND и WM_NOTIFY. О том, как обрабатывать первое из них, вы знаете из предыдущих томов "Библиотеки системного программиста", посвященных программированию для Microsoft Windows. Остановимся на обработке нового для вас сообщения WM_NOTIFY . Через параметр wParam этого сообщения передается идентификатор органа управления. Если извещение пришло от Toolbar , то это должен быть идентификатор Toolbar. Параметр lParam содержит указатель на структуру типа NMHDR или на структуру большего размера, содержащую в своем начале структуру NMHDR : typedef struct tagNMHDR { HWND hwndFrom; UINT idFrom; UINT code; } NMHDR; В этой структуре поле hwndFrom содержит идентификатор окна, приславшего сообщение, поле idFrom - идентификатор органа управления, приславшего сообщение, а поле code - код извещения. Органы управления могут присылать следующие
коды извещения:
Перечисленные выше коды извещений используются всеми стандартными органами управления. Что же касается органа управления Toolbar , до для него имеются некоторые добавления. Во-первых, параметр lParam сообщения WM_NOTIFY содержит указатель на структуру TBNOTIFY (содержащую в самом начале только что описанную структуру NMHDR ): typedef struct { NMHDR hdr; int iItem; TBBUTTON tbButton; int cchText; LPTSTR pszText; } TBNOTIFY, FAR * LPTBNOTIFY; В этой структуре поле iItem содержит номер кнопки, от которой пришло извещение (напомним, что нумерация кнопок начинается с нуля). Структура tbButton типа TBBUTTON содержит описание кнопки. Мы уже рассказывали вам об этой структуре. В поле cchText находится длина текстовой строки, соответствующей кнопке. Адрес этой строки передается через параметр pszText. Во-вторых, для органа управления Toolbar
определены дополнительные коды извещений:
Ниже мы привели фрагмент кода из приложения Smart Application, обрабатывающий извещения от органа управления Toolbar : LRESULT WndProc_OnNotify(HWND hWnd, int idFrom, NMHDR* pnmhdr) { LPTOOLTIPTEXT lpToolTipText; LPTBNOTIFY lptbn; int nItem; static CHAR szBuf[128]; switch(pnmhdr->code) { case TTN_NEEDTEXT: lpToolTipText = (LPTOOLTIPTEXT)pnmhdr; LoadString(hInst, lpToolTipText->hdr.idFrom, szBuf, sizeof(szBuf)); lpToolTipText->lpszText = szBuf; break; case TBN_GETBUTTONINFO: lptbn = (LPTBNOTIFY)pnmhdr; nItem = lptbn->iItem; lptbn->tbButton.iBitmap = tbButtons[nItem].iBitmap; lptbn->tbButton.idCommand = tbButtons[nItem].idCommand; lptbn->tbButton.fsState = tbButtons[nItem].fsState; lptbn->tbButton.fsStyle = tbButtons[nItem].fsStyle; lptbn->tbButton.dwData = tbButtons[nItem].dwData; lptbn->tbButton.iString = tbButtons[nItem].iString; return((nItem < sizeof(tbButtons)/sizeof(tbButtons[0]))? TRUE : FALSE); break; case TBN_QUERYDELETE: lptbn = (LPTBNOTIFY)pnmhdr; nItem = lptbn->iItem; return (nItem == 0)? FALSE : TRUE; break; case TBN_QUERYINSERT: lptbn = (LPTBNOTIFY)pnmhdr; nItem = lptbn->iItem; return (nItem == 0)? FALSE : TRUE; break; case TBN_TOOLBARCHANGE: SendMessage(hwndTb, TB_AUTOSIZE, 0L, 0L); return TRUE; break; default: break; } return FALSE; } Рассмотрим особенности обработки отдельных извещений. TTN_NEEDTEXTЕсли при создании Toolbar был указан стиль TBSTYLE_TOOLTIP , пользователь может получить краткую справку о назначении любой кнопки Toolbar, просто установив на нее курсор мыши и подождав примерно одну секунду. При этом рядом с кнопкой появляется небольшое временное окно с описанием назначения кнопки. Для того чтобы использовать эту возможность, в файле ресурсов приложения вы должны подготовить таблицу строк, содержащих краткое описание назначения кнопок. Лучше подготовить эту таблицу для всех строк меню, а не только для тех, которые дублируются кнопками Toolbar . Вот пример такой таблицы (мы привели сокращенный вариант из приложения Smart Application): STRINGTABLE DISCARDABLE BEGIN ID_FILE_NEW "Creates a new document" ID_FILE_OPEN "Open an existing document" ID_FILE_CLOSE "Closes the active document" ID_FILE_SAVE "Save the active document" ID_FILE_PRINT "Prints the active document" END STRINGTABLE DISCARDABLE BEGIN ID_FILE_EXIT "Exit application" ID_FILE_SAVEAS "Saves the active document under" " a different name" ID_HELP_ABOUT "Displays information about application" END Как вы увидите в дальнейшем, эта таблица пригодится нам для органа управления Statusbar. Когда пользователь устанавливает курсор мыши на кнопку Toolbar и оставляет его в покое, окно, создавшее Toolbar, получает извещение TTN_NEEDTEXT. Обработчик извещения TTN_NEEDTEXT должен извлечь идентификатор кнопки, загрузить из ресурсов приложения соответствующую текстовую строку и записать ее адрес в поле lpszText: case TTN_NEEDTEXT: lpToolTipText = (LPTOOLTIPTEXT)pnmhdr; LoadString(hInst, lpToolTipText->hdr.idFrom, szBuf, sizeof(szBuf)); lpToolTipText->lpszText = szBuf; break; Вот и все, что нужно для того чтобы предоставить пользователю возможность определять назначение кнопок Toolbar с помощью органа управления Tool Tip. TBN_GETBUTTONINFOЭто извещение преследует двоякую цель. Во-первых, с его помощью родительское окно может узнать, что пользователь внес изменения в Toolbar . Во-вторых, при помощи этого извещения функция окна органа управления Toolbar может получить информацию о любой кнопке Toolbar (если, конечно, приложение предоставит такую информацию). Следующий фрагмент кода возвращает функции окна Toolbar сведения о кнопке, номер которой передается вместе с извещением: case TBN_GETBUTTONINFO: lptbn = (LPTBNOTIFY)pnmhdr; nItem = lptbn->iItem; lptbn->tbButton.iBitmap = [nItem].iBitmap; lptbn->tbButton.idCommand = tbButtons[nItem].idCommand; lptbn->tbButton.fsState = tbButtons[nItem].fsState; lptbn->tbButton.fsStyle = tbButtons[nItem].fsStyle; lptbn->tbButton.dwData = tbButtons[nItem].dwData; lptbn->tbButton.iString = tbButtons[nItem].iString; return((nItem < sizeof(tbButtons)/sizeof(tbButtons[0]))? TRUE : FALSE); break; Номер кнопки берется из поля iItem описанной ранее структуры TBNOTIFY, а информация о кнопке - из структуры tbButtons типа TBBUTTON, которая была подготовлена еще до создания Toolbar . Обратите внимание на то, что обработчик извещения TBN_GETBUTTONINFO возвращает TRUE, если номер кнопки не вышел за пределы возможных значений индекса массива структур tbButtons. В противном случае возвращается значение FALSE. Когда пользователь сделает двойной щелчок левой клавишей мыши по окну Toolbar для того чтобы вызвать диалоговую панель настройки этого органа управления, функция окна Toolbar будет присылать извещения TBN_GETBUTTONINFO до тех пор, пока соответствующий обработчик не вернет значение FALSE. При этом номер кнопки будет все время возрастать на единицу. В документации SDK сказано, что обработчик извещения TBN_GETBUTTONINFO должен возвращать TRUE, если он предоставил информацию о нужной кнопке и FALSE в противном случае. Вы, конечно, можете возвращать значение FALSE для любого номера кнопки, не предоставляя никакой информации, однако при этом диалоговая панель настройки Toolbar будет работать неправильно. В частности, с ее помощью вы сможете удалить любую кнопку, но вернуть ее обратно будет уже невозможно. TBN_QUERYDELETEВ процессе настройки органа управления Toolbar пользователь может удалить ненужные ему кнопки. Однако для некоторых кнопок вы можете запретить такую операцию, обеспечив специальную обработку извещения TBN_QUERYDELETE. Если обработчик извещения вернет значение TRUE, пользователь сможет удалить кнопку, номер которой передается вместе с извещением в поле iItem. Если же обработчик вернет значение FALSE, кнопка останется на своем месте. Ниже мы привели обработчик извещения TBN_QUERYDELETE, который запрещает удаление кнопки с номером ноль, но разрешает удаление любых других кнопок: case TBN_QUERYDELETE: lptbn = (LPTBNOTIFY)pnmhdr; nItem = lptbn->; return (nItem == 0)? FALSE : TRUE; break; TBN_QUERYINSERTИзвещение TBN_QUERYINSERT обрабатывается аналогично предыдущему. Если обработчик этого извещения вернет значение TRUE, пользователь сможет вставить новую кнопку слева от той, номер которой передается в поле iItem. В противном случае вставка новой кнопки в данной позиции будет невозможна. TBN_TOOLBARCHANGEИзвещение TBN_TOOLBARCHANGE посылается родительскому окну, создавшему Toolbar , когда пользователь изменил внешний вид этого органа управления. В ответ родительское окно обычно посылает органу Toolbar сообщение TB_AUTOSIZE, которое вызывает автоматическое изменение размеров Toolbar: case TBN_TOOLBARCHANGE: SendMessage(hwndTb, TB_AUTOSIZE, 0L, 0L); return TRUE; break; TBN_BEGINADJUSTЭто извещение поступает в родительское окно, когда пользователь приступил к настройке Toolbar . В ответ на него обработчик может вернуть любое значение, так как оно все равно будет проигнорировано. TBN_ENDADJUSTКогда пользователь закончил настройку Toolbar , родительское окно получает извещение TBN_ENDADJUST. Соответствующий обработчик может вернуть любое значение. TBN_BEGINDRAGЕсли пользователь начал передвигать кнопку по поверхности Toolbar , родительское окно получает извещение TBN_BEGINDRAG. Так же как и в предыдущих двух случаях, обработчик извещения может вернуть любое значение. TBN_ENDDRAGКогда пользователь закончит передвижение кнопки по поверхности Toolbar , родительское окно получит извещение TBN_ENDDRAG. В ответ оно может вернуть любое значение. TBN_RESETЕсли родительское окно получило извещение TBN_RESET, это означает, что пользователь нажал кнопку "Reset" в диалоговой панели, которая была вызвана для настройки Toolbar . Обработчик этого извещения (если он предусмотрен), должен восстановить исходный вид органа управления Toolbar и вернуть любое значение. Посылая органу Toolbar сообщение TB_SAVERESTORE вы можете сохранить в регистрационной базе данных и восстановить состояние Toolbar. TBN_CUSTHELPИзвещение TBN_CUSTHELP передается родительскому окну, когда пользователь нажал кнопку "Help" в диалоговой панели, которая была вызвана для настройки Toolbar . Обработчик этого извещения должен отобразить на экране соответствующий раздел справочной системы и вернуть любое значение. Сообщения для ToolbarПосылая сообщения органу Toolbar , приложение может управлять кнопками, получать информацию о состоянии кнопок, вызывать на экран диалоговую панель для настройки Toolbar и выполнять множество других действий. Ниже мы приведем краткое описание сообщений, предназначенных для Toolbar. Полную информацию вы сможете найти в справочной системе SDK для Win32. TB_ADDBITMAPДобавление одного или нескольких изображений к списку изображений органа управления Toolbar . Параметры сообщения: wParam = (WPARAM) nButtons; // количество добавляемых // изображений lParam = (LPARAM) (LPTBADDBITMAP) lptbab; // указатель на // структуру TBADDBITMAP Как мы уже говорили, для Toolbar вы должны подготовить изображение, содержащее несколько картинок, которые будут нарисованы на кнопках. Если вы создаете Toolbar функцией CreateWindowEx, для добавления изображений необходимо послать созданному окну сообщение TB_ADDBITMAP: tbab.hInst = hInst; tbab.nID = IDB_TBBITMAP; SendMessage(hwndTb, TB_ADDBITMAP, (WPARAM)8, (LPARAM)&tbab); TB_ADDBUTTONSДобавление кнопок к органу управления Toolbar . wParam = (WPARAM) (UINT) uNumButtons; // количество кнопок lParam = (LPARAM) (LPTBBUTTON) lpButtons; // указатель на // заполненный массив структур TBBUTTON Это сообщение используется в процессе создания Toolbar , так же как и предыдущее: SendMessage(hwndTb, TB_ADDBUTTONS, (WPARAM)11, (LPARAM)&tbButtons); Количество кнопок задается с учетом промежутков между группами кнопок. Каждый промежуток при этом считается за одну кнопку, хотя вы можете создавать промежутки размером в несколько кнопок (например, чтобы разместить там другие органы управления). TB_ADDSTRINGДобавление новых текстовых строк в список органа управления Toolbar . wParam = (WPARAM) (HINSTANCE) hinst; // идентификатор модуля lParam = (LPARAM) MAKELONG(idString, 0); // идентификатор // строки Вы можете добавлять текстовые строки не только из ресурсов приложения, но и из массива в оперативной памяти. В этом случае параметр hinst должен быть равен нулю, а через параметр lParam необходимо передать адрес массива строк. Каждая строка в массиве должна заканчиваться двоичным нулем, а последняя - двумя нулями. TB_AUTOSIZEПараметры этого сообщения должны быть равны нулю. Оно посылается органу управления Toolbar сразу после создания, а также при изменении количества или расположения кнопок. TB_BUTTONCOUNTПосле посылки этого сообщения органу управления Toolbar функция SendMessage возвращает количество кнопок, добавленных в него с момента создания. Параметры сообщения должны быть равны нулю. TB_BUTTONSTRUCTSIZEС помощью этого сообщения приложение, создавшее орган управления Toolbar , должно сообщить последнему размер структуры TBBUTTON. wParam = (WPARAM) cb; // размер структуры TBBUTTON Значение параметра lParam должно быть равно нулю. Сообщение TB_BUTTONSTRUCTSIZE следует послать органу Toolbar сразу после его создания функцией CreateWindowEx: SendMessage(hwndTb, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0); TB_CHANGEBITMAPЗамена изображения на поверхности кнопки. wParam = (WPARAM) idButton; // идентификатор кнопки lParam = (LPARAM) MAKELPARAM(iBitmap, 0); // номер нового // изображения TB_CHECKBUTTONС помощью этого сообщения можно переключать кнопку из отжатого состояния в нажатое и обратно. wParam = (WPARAM) idButton; // идентификатор кнопки lParam = (LPARAM) MAKELONG(fCheck, 0); // флаг Если значение флага равно TRUE, кнопка переводится в нажатое состояние, если FALSE - в отжатое. TB_COMMANDTOINDEXОпределение номера кнопки по ее идентификатору (нумерация кнопок начинается с нуля). wParam = (WPARAM) idButton; // идентификатор кнопки Значение параметра lParam должно быть равно нулю. Номер кнопки возвращается функцией SendMessage после посылки с ее помощью сообщения TB_COMMANDTOINDEX. TB_CUSTOMIZEЕсли окну Toolbar послать сообщение TB_CUSTOMIZE и если при создании Toolbar был указан стиль CCS_ADJUSTABLE, на экране появляется диалоговая панель настройки. С помощью этой панели (которая будет описана ниже) пользователь может изменять внешний вид органа управления Toolbar. Параметры сообщения должны быть равны нулю. TB_DELETEBUTTONС помощью этого сообщения приложение может удалить кнопку из окна Toolbar . Порядковый номер удаляемой кнопки передается через параметр wParam: wParam = (WPARAM) iButton; Параметр lParam должен быть равен нулю. Отметим, что вы можете определить порядковый номер кнопки по ее идентификатору с помощью сообщения TB_COMMANDTOINDEX, описанного выше. TB_ENABLEBUTTONС помощью сообщения TB_ENABLEBUTTON приложение может заблокировать или разблокировать кнопку. wParam = (WPARAM) idButton; // идентификатор кнопки lParam = (LPARAM) MAKELONG(fEnable, 0); // флаг блокировки Если флаг равен TRUE, кнопка разблокируется, если FALSE - блокируется. TB_GETBITMAPОпределение номера изображения по идентификатору кнопки. wParam = (WPARAM) idButton; // идентификатор кнопки Параметр lParam должен быть равен нулю. Порядковый номер изображения возвращается функцией SendMessage. TB_GETBITMAPFLAGSС помощью этого сообщения можно определить способность монитора отображать картинки большого размера. Это возможно в том случае, если в одном логическом дюйме контекста отображения экрана помещается не менее 120 пикселов. Если монитор может отображать большие картинки, в возвращаемом функцией SendMessage значении установлен флаг TBBF_LARGE. TB_GETBUTTONПолучение информации о кнопке, заданной своим номером. wParam = (WPARAM) iButton; // номер кнопки lParam = (LPARAM) (LPTBBUTTON) lpButton; // адрес структуры // TBBUTTON TB_GETBUTTONTEXTПолучение текстовой строки, связанной с кнопкой, которая задана своим номером. wParam = (WPARAM) idButton; // номер кнопки lParam = (LPARAM) (LPSTR) lpszText; // адрес буфера для строки TB_GETITEMRECTОпределение координат области, занимаемой кнопкой, которая задана своим номером. wParam = (WPARAM) iButton; // номер кнопки lParam = (LPARAM) (LPRECT) lprc; // адрес структуры RECT TB_GETROWSОпределение количества строк в органе управления Toolbar , имеющим стиль TBSTYLE_WRAPABLE. Параметры сообщения должны быть равны нулю. TB_GETSTATEОпределение состояния кнопки, заданной своим идентификатором. wParam = (WPARAM) idButton; // идентификатор кнопки Приведем список возможных состояний кнопки.
TB_GETTOOLTIPSОпределение идентификатора органа управления Tool Tip, связанного с данным органом управления Toolbar . Параметры сообщения должны быть равны нулю. TB_HIDEBUTTONС помощью этого сообщения можно отобразить или скрыть кнопку, заданную своим идентификатором. wParam = (WPARAM) idButton; // идентификатор кнопки lParam = (LPARAM) MAKELONG(fShow, 0); // флаг Если флаг равен TRUE, кнопка становится скрытой, если FALSE - отображается. TB_INDETERMINATEС помощью этого сообщения можно установить или отменить для кнопки неопределенное состояние, когда кнопка отображается серым цветом. wParam = (WPARAM) idButton; // идентификатор кнопки lParam = (LPARAM) MAKELONG(fIndeterminate, 0); // флаг Если флаг равен TRUE, неопределенное состояние устанавливается, если FALSE - отменяется. TB_INSERTBUTTONВставка кнопки в Toolbar . wParam = (WPARAM) iButton; // номер кнопки lParam = (LPARAM)(LPTBBUTTON)lpButton; // указатель на // структуру TBBUTTON Если кнопка была вставлена успешно, функция SendMessage вернет значение TRUE, в противном случае - FALSE. TB_ISBUTTONCHECKEDС помощью этого сообщения приложение может проверить состояние кнопки - нажата кнопка или нет. wParam = (WPARAM) idButton; // идентификатор кнопки Значение параметра lParam должно быть равно нулю. Если кнопка нажата, функция SendMessage вернет значение TRUE, в противном случае - FALSE. TB_ISBUTTONENABLEDС помощью этого сообщения приложение может проверить состояние блокировки кнопки - заблокирована кнопка или нет. wParam = (WPARAM) idButton; // идентификатор кнопки Значение параметра lParam должно быть равно нулю. Если кнопка разблокирована, функция SendMessage вернет значение TRUE, в противном случае - FALSE. TB_ISBUTTONHIDDENС помощью этого сообщения приложение может проверить, скрыта кнопка или нет. wParam = (WPARAM) idButton; // идентификатор кнопки Значение параметра lParam должно быть равно нулю. Если кнопка скрыта, функция SendMessage вернет значение TRUE, в противном случае - FALSE. TB_ISBUTTONINDETERMINATEС помощью этого сообщения приложение может проверить, находится ли кнопка в неопределенном состоянии, когда она отображается серым цветом. wParam = (WPARAM) idButton; // идентификатор кнопки Значение параметра lParam должно быть равно нулю. Если кнопка находится в неопределенном состоянии, функция SendMessage вернет значение TRUE, в противном случае - FALSE. TB_ISBUTTONPRESSEDС помощью этого сообщения приложение может проверить, находится ли кнопка в нажатом состоянии. wParam = (WPARAM) idButton; // идентификатор кнопки Значение параметра lParam должно быть равно нулю. Если кнопка находится в нажатом состоянии, функция SendMessage вернет значение TRUE, в противном случае - FALSE. TB_PRESSBUTTONС помощью этого сообщения приложение может установить кнопку в нажатое или отжатое состояние. wParam = (WPARAM) idButton; // идентификатор кнопки lParam = (LPARAM) MAKELONG(fPress, 0); // флаг Для того чтобы перевести кнопку в нажатое состояние, необходимо установить значение флага fPress равным TRUE, а для того чтобы перевести кнопку в отжатое состояние - равным FALSE. Если состояние кнопки было изменено успешно, функция SendMessage вернет значение TRUE, в противном случае - FALSE. TB_SAVERESTOREПосылая органу управления Toolbar сообщение TB_SAVERESTORE, приложение может сохранить или восстановить состояние Toolbar. Для хранения состояния Toolbar используется системная регистрационная база данных. wParam = (WPARAM) (BOOL) fSave; // флаг lParam = (LPARAM) (TBSAVEPARAMS *)ptbsp; // указатель на // структуру TBSAVEPARAMS Если значение флага fSave равно TRUE, будет выполнено сохранение состояния Toolbar , а если FALSE - восстановление. Через параметр ptbsp передается указатель на структуру типа TBSAVEPARAMS , приведенную ниже: typedef struct { HKEY hkr; // идентификатор ключа регистрации LPCTSTR pszSubKey; // имя ключа LPCTSTR pszValueName; // значение ключа } TBSAVEPARAMS; Работа с системной регистрационной базой данных Microsoft Windows 95 будет описана в одном из следующих томов "Библиотеки системного программиста". TB_SETBITMAPSIZEС помощью сообщения TB_SETBITMAPSIZE приложение может установить размер картинки, изображенной на поверхности кнопки. lParam = (LPARAM) MAKELONG(dxBitmap, dyBitmap); // размеры Значение параметра wParam должно быть равно нулю. Через параметры dxBitmap и dyBitmap передается, соответственно, ширина и высота изображения. TB_SETBUTTONSIZEС помощью сообщения TB_SETBUTTONSIZE приложение может установить размер кнопки. Param = (LPARAM) MAKELONG(dxButton, dyButton); // размеры Значение параметра wParam должно быть равно нулю. Через параметры dxButton и dyButton передается, соответственно, ширина и высота кнопки. TB_SETCMDIDС помощью этого сообщения можно присвоить кнопке с заданным номером командный идентификатор. wParam = (WPARAM) (UINT) index; // номер кнопки lParam = (WPARAM) (UINT) cmdId; // идентификатор TB_SETPARENTС помощью сообщения TB_SETPARENT приложение может назначить для органа управления Toolbar родительское окно. wParam = (WPARAM) (HWND) hwndParent; // идентификатор // родительского окна Значение параметра lParam должно быть равно нулю. TB_SETROWSУстановка количества строк кнопок в органе управления Toolbar . wParam = (WPARAM) MAKEWPARAM(cRows, fLarger); lParam = (LPARAM) (LPRECT) lprc; Через параметр cRows передается количество строк. Минимальное значение параметра равно одной строке, максимальное - количеству кнопок в окне Toolbar . Если параметр fLarger равен TRUE, при недостатке места для размещения всех кнопок в cRows строках будет создана дополнительная строка. Если же параметр fLarger равен FALSE, дополнительная строка не создается. Перед тем как послать окну Toolbar сообщение TB_SETROWS, вы должны подготовить структуру типа RECT. Ее адрес нужно передать через параметр lprc. После обработки сообщения в эту структуру будут записаны новые размеры окна Toolbar. TB_SETSTATEУстановка кнопки с заданным идентификатором в новое состояние. wParam = (WPARAM) idButton; // идентификатор кнопки lParam = (LPARAM) MAKELONG(fState, 0); // состояние кнопки Список возможных состояний кнопки приведен выше в описании сообщения TB_GETSTATE. TB_SETTOOLTIPSС помощью сообщения TB_SETTOOLTIPS приложение может назначить для Toolbar орган управления Tool Tip. wParam = (WPARAM)(HWND)hwndToolTip; // идентификатор Tool Tip Значение параметра lParam должно быть равно нулю. Заметим, что при создании Toolbar со стилем TBSTYLE_TOOLTIPS для него автоматически создается орган Tool Tip , поэтому вам не нужно посылать окну Toolbar дополнительное сообщение TB_SETTOOLTIPS. Однако если вы посылаете такое сообщение, в Tool Tip будут зарегистрированы только те кнопки, которые были добавлены в Toolbar до момента посылки сообщения TB_SETTOOLTIPS. |