Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ch-12_1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
456.7 Кб
Скачать

Изменение конфигурации панели инструментов

Конфигурация панелей инструментов может быть изменена пользователем во время работы программы. Для этого существует диалоговое окно изменения конфигурации панели инструментов (Customize Toolbar dialog box), показанное на рис. 12.6. В этом окне диалога находятся два списка: первый — список доступных кнопок, второй — список кнопок, находящихся в данный момент на панели инструментов. Пользователь имеет возможность щелкнуть на кнопках Add (добавить) и Remove (удалить) для перемещения элементов между двумя этими списками. Кроме того, оба окна списков поддерживают операции типа drag and drop, поэтому пользователь может перетаскивать элементы из одного списка в другой. Активизируется окно изменения конфигурации панели инструментов путем посылки ей сообщения TB_CUSTOMIZE.

Рис. 12.6. Диалоговое окно изменения конфигурации панели инструментов

Два флага стиля обеспечивают доступ к возможностям панели инструментов с помощью мыши. Панель инструментов, созданная с использованием флага CCS_ADJUSTABLE, выводит на экран диалоговое окно изменения конфигурации в ответ на двойной щелчок левой клавиши мыши на теле панели инструментов. (Этот флаг не требуется, если необходимо, чтобы диалоговое окно изменения конфигурации панели инструментов появлялось под управлением программы; просто необходимо послать сообщение TB_CUSTOMIZE.) Кроме того, пользователь может перемещать кнопки по панели инструментов с помощью клавиатуры и мыши: нажимая и удерживая клавишу <Shift> и левую кнопку мыши. Пользователь может удалить кнопку из панели инструментов путем нажатия и удержания левой кнопки мыши и перетаскивания кнопки за пределы панели инструментов. Использование флага TBSTYLE_ALTDRAG позволяет сделать так, что для операций перетаскивания кнопок будет необходимо использование клавиши <ALT> (как в программе Microsoft Word for Windows) вместо клавиши <Shift>.

Ключ к изменению конфигурации панели инструментов лежит в правильной обработке соответствующих уведомляющих сообщений. Даже перед тем как появиться на экране, диалоговое окно изменения конфигурации панели инструментов посылает три инициализирующих запроса: TBN_QUERYINSERT, TBN_QUERYDELETE и TBN_GETBUTTONINFO. Все уведомляющие сообщения, связанные с диалоговым окном изменения конфигурации панели инструментов, приведены в следующей таблице:

Уведомляющее сообщение

Описание

TBN_BEGINADJUST и TBN_ENDADJUST

Существование диалогового окна изменения конфигурации ограничено этими двумя уведомлениями.

TBN_QUERYINSERT

Запрашивает разрешение на вставку в заданной позиции. Когда диалоговое окно запускается, возвращайте TRUE. В противном случае диалоговое окно выведено не будет.

TBN_QUERYDELETE

Запрашивает разрешение на удаление кнопки. Возвращайте TRUE, если "да", и FALSE — если "нет".

TBN_GETBUTTONINFO

Наборы этих сообщений запрашивают информацию обо всех кнопках, которые могут быть выведены на панель инструментов. Кнопки, не находящиеся в данный момент на панели инструментов заносятся в список доступных кнопок.

TBN_TOOLBARCHANGE

Кнопки на панели инструментов были перемещены, удалены или вставлены.

TBN_RESET

Пользователь нажал кнопку Reset в диалоговом окне изменения конфигурации.

TBN_CUSTHELP

Пользователь нажал кнопку Help в диалоговом окне изменения конфигурации.

Уведомление TBN_QUERYINSERT запрашивает разрешение на вставку любой новой кнопки в панель инструментов. Если ответ отрицателен (возвращаемое значение равно нулю или FALSE), то диалоговое окно на мгновение высвечивается на экране и исчезает. Это может удивить пользователя. Для того, чтобы быть уверенным в том, что диалоговое окно изменения конфигурации панели инструментов будет выведено на экран, необходимо в ответ на первый запрос вернуть "да" (не ноль или TRUE):

case WM_NOTIFY:

{

LPNMHDR pnmh = (LPNMHDR) lParam ;

// Разрешаем изменение конфигурации панели инструментов

if (pnmh->code == TBN_QUERYINSERT)

{

return 1 ;

}

Набор уведомлений TBN_QUERYDELETE — одно на каждую кнопку панели инструментов — посылаются с запросом о том, может ли быть удалена конкретная кнопка. Ответ вызывает открытие доступа или закрытие доступа к кнопке Remove в диалоговом окне: TRUE разрешает удаление кнопки, FALSE — запрещает.

Последовательности уведомлений TBN_GETBUTTONINFO обеспечивают родительскому окну панели управления возможность идентифицировать все кнопки, которые могут располагаться в панели инструментов. Для каждого запроса заполняется структура типа TBBUTTON для каждой возможной кнопки, включая текст строки, который выводится рядом с изображением кнопки в диалоговом окне изменения конфигурации панели инструментов. Возврат значения TRUE означает, что вы заполнили данные внутри структуры и хотите вновь получить это уведомление. Возврат значения FALSE означает, что кнопок больше нет. В результате этого запроса заполняется список доступных кнопок (Available buttons) диалогового окна изменения конфигурации панели инструментов. Однако, в этот список заносятся только те кнопки, которые в данный момент времени не находятся в панели инструментов. Ниже приведен фрагмент программы для ответа на это сообщение для двух кнопок:

LPTBNOTIFY ptbn = (LPTBNOTIFY) lParam ;

switch (ptbn->iItem)

{

case 0 :

lstrcpy (ptbn->pszText, "Help") ;

ptbn->tbButton.iBitmap = STD_HELP ;

ptbn->tbButton.idCommand = 1l ;

ptbn->tbButton.fsState = TBSTATE_ENABLED ;

ptbn->tbButton.fsStyle = TBSTYLE_BUTTON ;

ptbn->tbButton.dwData = 0 ;

ptbn->tbButton.iString = 10 ;

return 1;

case 1 :

lstrcpy (ptbn->pszText, "Delete") ;

ptbn->tbButton.iBitmap = STD_DELETE ;

ptbn->tbButton.idCommand = 12 ;

ptbn->tbButton.fsState = TBSTATE_ENABLED ;

ptbn->tbButton.fsStyle = TBSTYLE_BUTTON ;

ptbn->tbButton.dwData = 0 ;

ptbn->tbButton.iString = 11 ;

return 1;

default :

return 0 ;

}

Если у вас уже есть массив описаний TBBUTTON, то самый быстрый путь ответа на это сообщение состоит в использовании функции memcpy для копирования TBBUTTON для каждого получаемого сообщения. Ниже показано, как программа GADGETS делает это:

lstrcpy (ptbn->pszText, GetString (ptbn->iItem)) ;

memcpy (&ptbn->tbButton, &tbb[iButton], sizeof (TBBUTTON)) ;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]