Показать сообщение отдельно
  #4  
Старый 13.01.2012, 02:05
Vladimir Vladimir вне форума
Прохожий
 
Регистрация: 10.03.2009
Сообщения: 4
Репутация: 10
По умолчанию Решение

Раз уж я сам разобрался, то напишу здесь: может, кому-то пригодится.

Делается это примерно так (в 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;
Ответить с цитированием