Раз уж я сам разобрался, то напишу здесь: может, кому-то пригодится.
Делается это примерно так (в 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;