Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Иконка из .exe в ToolButton, Брать изображения для кнопки из файла 
V
    Опции темы
Romero
Дата 12.3.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: 1
Всего: 1



Есть ToolButton и некий исполняемый файл "app.exe".
Нужно в рантайме задать основную иконку "app.exe" в качестве изображения на кнопку.
smile
PM   Вверх
Snowy
Дата 13.3.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Вот. Накидал пример.
На форму бросить 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 добавлять.
Комменты нужны?
PM MAIL   Вверх
SlaUr
Дата 13.3.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: нет
Всего: 5



Вот может поможет кусок из моей программы - иконка отображается на картинке и на кнопке
Код

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;



PM MAIL   Вверх
Snowy
Дата 13.3.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



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.
PM MAIL   Вверх
Romero
Дата 15.3.2006, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: 1
Всего: 1



Snowy, этот вариант я уже испробовал. Не могу только понять, почему цветность иконки меняется... Например, если взять иконку IEXPLORE.EXE или значок открытой/закрытой папки из того же shell32.dll и поместить на кнопке светлого цвета, то изображение получится с неровными черными краями.
Пример SlaUr еще не пробовал. Как то можно пример Snowy исправить? Или это только у меня беда такая?
PM   Вверх
Romero
Дата 15.3.2006, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: 1
Всего: 1



Скорее всего, проблема возникает из-за цветовой схемы ХР в иконках, так как если извлечь из IEXPLORE.EXE одну иконку и оставить в ней только 256-цветную, то отображается такая картинка на кнопке (при добавлении в ImageList) нормально.
Можно ли как-то указать, чтобы подгружалось именно 256-цветное изображение?
PM   Вверх
Snowy
Дата 15.3.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



И правда бага какая-то с иконками.
Скорректировал на 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. Исправь на нужные тебе.
PM MAIL   Вверх
Romero
Дата 15.3.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.6.2005

Репутация: 1
Всего: 1



Супер! Работает на ура, спасибо огромное!
PM   Вверх
Quadr0
Дата 15.3.2006, 15:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 10:49
  Вверх
Snowy
Дата 15.3.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Quadr0, это не помогает.
Поэтому и законвертил в битмап.
PM MAIL   Вверх
Quadr0
Дата 16.3.2006, 22:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 10:50
  Вверх
Eva_Adamova
Дата 14.5.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 26.3.2007
Где: Петропавловск-Кам чатский

Репутация: нет
Всего: нет



Сделала Тулбар, положила на него 5 кнопок, код Snowy не работает!
Ошибка на строке
Код

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

Что я делаю не так???
PM MAIL ICQ   Вверх
Snowy
Дата 15.5.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



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

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


Eva_Adamova, а как вы клали кнопки на тулбар?
Случайно не с палитры набросали? Напимер TSpeedButton...
Код написан для кнопок тулбара (TToolButton), а не каких-либо других.
А кнопки на тулбаре не набрасываются, а создаются путём нажатия правой кнопки на тулбаре и выбора "New Button".
Любые другие кнопки будут вызывать ошибку, т.к. это кнопки совсем другого класса.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1179 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.