Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Иконка из .exe в ToolButton


Автор: Romero 12.3.2006, 14:53
Есть ToolButton и некий исполняемый файл "app.exe".
Нужно в рантайме задать основную иконку "app.exe" в качестве изображения на кнопку.
smile

Автор: Snowy 13.3.2006, 12:17
Вот. Накидал пример.
На форму бросить TToolBar и сделать в нем несколько кнопок.
Для примера иконки берутся из shell32.dll. Но можно из любого другого dll или exe.
Код
uses ShellApi;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  il: TImageList;
  h: hIcon;
  ico: TIcon;
begin
  il := TImageList.Create(Self);
  ToolBar1.Images := il;
  for i := 0 to ToolBar1.ButtonCount - 1 do
  begin
    h := ExtractIcon(hInstance, 'C:\Windows\System32\shell32.dll', i);
    if h <> 0 then begin
      ico := TIcon.Create;
      ico.Handle := h;
      il.AddIcon(ico);
      ico.Free;
      ToolBar1.Buttons[i].ImageIndex := i;
    end;
  end;
end;

Добавлено @ 12:17
Для одной кнопки не получится - нужно иконку в TImageList добавлять.
Комменты нужны?

Автор: SlaUr 13.3.2006, 16:06
Вот может поможет кусок из моей программы - иконка отображается на картинке и на кнопке
Код

var IconIndex: word;

begin
 IconIndex := 0;
 Form1.Image8.Picture.Icon.Handle:=ExtractAssociatedIcon(hInstance, pchar(St4),  IconIndex  );(*st4- путьк exe-шнику *)
 Form1.Image8.Show;
 try
 Pic := TPicture.Create;
 Pic.Icon:=Form1.Image8.Picture.Icon;
    oBitmap := TBitMap.create;
    oBitmap2 := TBitMap.create;
    oBitmap2.Width := 32;
    oBitmap2.Height := 32;
    oBitmap.Width := 15;
    oBitmap.Height := 15;
    oBitmap2.Canvas.Draw(0, 0, pic.Graphic);
    rBoton.left := 1;
    rBoton.Top := 1;
    rBoton.right := 15;
    rBoton.Bottom := 15;
    oBitmap.Canvas.StretchDraw(rBoton, oBitmap2);
Form1.BitBtn1.Glyph := oBitmap;
  finally
    Pic.Free;
    oBitmap.Free;
    oBitmap2.Free;
  end;
end;



Автор: Snowy 13.3.2006, 16:20
smile ну с кнопкой это делается проще:
Код
var
  ico: TIcon;
begin
  ico := TIcon.Create;
  ico.Handle := ExtractIcon(hInstance, PChar(ParamStr(0)), 0);
  with SpeedButton1.Glyph do begin
    Width := SpeedButton1.ClientWidth;
    Height := SpeedButton1.ClientHeight;
    Canvas.StretchDraw(Rect(0,0,Width,Height), ico);
  end;
  ico.Free;
end;
А вот для ToolBar нужен ImageList.

Автор: Romero 15.3.2006, 06:52
Snowy, этот вариант я уже испробовал. Не могу только понять, почему цветность иконки меняется... Например, если взять иконку IEXPLORE.EXE или значок открытой/закрытой папки из того же shell32.dll и поместить на кнопке светлого цвета, то изображение получится с неровными черными краями.
Пример SlaUr еще не пробовал. Как то можно пример Snowy исправить? Или это только у меня беда такая?

Автор: Romero 15.3.2006, 07:39
Скорее всего, проблема возникает из-за цветовой схемы ХР в иконках, так как если извлечь из IEXPLORE.EXE одну иконку и оставить в ней только 256-цветную, то отображается такая картинка на кнопке (при добавлении в ImageList) нормально.
Можно ли как-то указать, чтобы подгружалось именно 256-цветное изображение?

Автор: Snowy 15.3.2006, 10:34
И правда бага какая-то с иконками.
Скорректировал на bmp. Так нормально:
Код
const IcoSz = 32; // размер иконок
var
  i: integer;
  il: TImageList;
  h: hIcon;
  bmp: TBitMap;
begin
  il := TImageList.Create(Self);
  il.Width := IcoSz; // задаем размер иконок
  il.Height := IcoSz;
  ToolBar1.Images := il; // назначаем ImageList ToolBar'у
  ToolBar1.ButtonWidth := IcoSz + 2; // задаем размеры кнопок под иконки
  ToolBar1.ButtonHeight := IcoSz + 2;
  ToolBar1.AutoSize := true; // меняем размер тулбара под размер кнопок
  for i := 0 to ToolBar1.ButtonCount - 1 do // берем кнопки и лепим им иконки
  begin
    h := ExtractIcon(hInstance, 'C:\Windows\System32\shell32.dll', i);
    if h <> 0 then begin
      bmp := TBitMap.Create; // создаем битмап и задаем ему размер под иконку
      bmp.Width := IcoSz;
      bmp.Height := IcoSz;
      bmp.Canvas.Brush.Color := ToolBar1.Color; // цвет фона
      DrawIconEx(bmp.Canvas.Handle, 0, 0, h, IcoSz, IcoSz, 0,
                 bmp.Canvas.Brush.Handle, DI_NORMAL); // рисуем на него икону
      il.Add(bmp, nil); // собавляем икону в лист
      bmp.Free;
      ToolBar1.Buttons[i].ImageIndex := i;
    end;
  end;
end;


Размеры сделал 32х32. Исправь на нужные тебе.

Автор: Romero 15.3.2006, 13:58
Супер! Работает на ура, спасибо огромное!

Автор: Quadr0 15.3.2006, 15:29
...

Автор: Snowy 15.3.2006, 16:53
Quadr0, это не помогает.
Поэтому и законвертил в битмап.

Автор: Quadr0 16.3.2006, 22:38
...

Автор: Eva_Adamova 14.5.2007, 23:47
Сделала Тулбар, положила на него 5 кнопок, код Snowy не работает!
Ошибка на строке
Код

ToolBar1.Buttons[i].ImageIndex := i;

Что я делаю не так???

Автор: Snowy 15.5.2007, 13:05
Какая ошибка? Что написано?
Если код не менялся, то эта строка просто не способна вызвать ошибку.

Добавлено через 5 минут и 40 секунд
Ух ты! Сам не верю, но я понял, в чём глюка!
Если угадал, считайте меня телепатом smile


Eva_Adamova, а как вы клали кнопки на тулбар?
Случайно не с палитры набросали? Напимер TSpeedButton...
Код написан для кнопок тулбара (TToolButton), а не каких-либо других.
А кнопки на тулбаре не набрасываются, а создаются путём нажатия правой кнопки на тулбаре и выбора "New Button".
Любые другие кнопки будут вызывать ошибку, т.к. это кнопки совсем другого класса.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)