![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#4
|
|||
|
|||
![]() Раз уж я сам разобрался, то напишу здесь: может, кому-то пригодится.
Делается это примерно так (в Delphi 7). Пусть у нас есть Toolbar1 с битмапами из ImageList1. Первые Toolbar1.Count кнопок уже на нём, остальные ImageList1.Count - Toolbar1.Count мы хотим увидеть после двойного щелчка по тулбару в левой панели окна настройки тулбара. 1) Пишем обработчик события WM_NOTIFY основной формы Form1, который создаёт кнопки левой панели (не забудьте добавить CommCtrl в uses): Код:
procedure TForm1.WMNotify(var Message: TWMNotify); var pnmTB: PNMToolBar; Button: TToolButton; ButtonName: string; i: integer; begin Inherited; case Message.NMHdr^.code of TBN_GETBUTTONINFO: // запрос на описание кнопок в левой панели begin pnmTB := PNMToolBar(Message.NMHdr); // структура для описания кнопки i := pnmTB^.iItem; // индекс кнопки в ImageList1 if i >= ImageList1.Count then begin Message.Result := 0; Exit; end; // если кнопка уже есть на тулбаре, то она появится в правом списке окна Customize Toolbar // иначе if i >= Toolbar1.ButtonCount then // её нет на тулбаре begin ButtonName := Format( 'NewToolButton%d', [i-Toolbar1.ButtonCount+1] ); // подпись кнопки with pnmTB^ do begin cchText := Length(ButtonName); // количество символов в подписи кнопки StrLCopy(pszText, PChar(ButtonName), Length(ButtonName)); // копирование подписи end; with pnmTB^.tbButton do //заполняем структуру для кнопки begin iBitmap := i; idCommand := i; //? fsState := TBSTATE_ENABLED; fsStyle := TBSTYLE_BUTTON; // не нужно // bReserved[1] := 0; // bReserved[2] := 0; iString := 0; end; // создаём экземпляр кнопки Button := TToolButton.Create(Self); with Button do begin Style := tbsButton; Caption := ButtonName; ImageIndex := i; OnClick := ToolButtonClick; end; pnmTB^.tbButton.dwData := Integer(Button) end; Message.Result:= 1; end; TBN_ENDADJUST: // при закрытии формы настройки begin AdjustToolBar; // доработать тулбар Message.Result:= 1; end; end; end; 2) Для того, чтобы сепараторы на тулбаре были правильной длины, нужно после его настройки выполнять: Код:
procedure TForm1.AdjustToolBar; Var i: integer; B: TToolButton; begin with ToolBar1 do for i := 0 to ButtonCount-1 do with Buttons[i] do begin B := Buttons[i]; if Caption='' then // признак вставленного сепаратора - пустая подпись Width := 8; // установить правильную ширину Parent := ToolBar1; //без этого почему-то не работает OnClick end; end; |