Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прозрачная иконка в Glyph, в "стиле XP" 
:(
    Опции темы
HackMan
  Дата 27.1.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

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



Есть кнопка. У неё есть свойство Glyph (TBitmap). Нужно извлечь из какого-то файла его иконку, и нарисовать её на кнопке. 
С извлечением иконки никаких проблем нет. Проблема в том, что когда извлекаю иконку в "стиле ХР" (с альфаканалом), то они криво прорисовываются. Вместо теней какие-то чёрные пятна, вместо прозрачности - белые, и так далее...

Вопрос: как мне корректно отрисовать 32-битную иконку на Glyph?

хочу пример smile


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
Snowy
Дата 28.1.2007, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



PM MAIL   Вверх
HackMan
  Дата 28.1.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

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



всё бы было бы хорошо, но...

я использую сторонние компоненты (XiButton), и у них нету свойства Image (то есть нельзя привязать к ImageList), и фон у них не сплошного цвета, а градиентная заливка

передалал код

Код

procedure TForm1.DrawIcon;
const IcoSz = 32; // размер иконок
var
  i: integer;
  il: TImageList;
  h: hIcon;
  bmp: TBitMap;
begin
  il := TImageList.Create(Self);
  il.Width := IcoSz; // задаем размер иконок
  il.Height := IcoSz;

  for i := 1 to 30 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;
      DrawIconEx(bmp.Canvas.Handle, 0, 0, h, IcoSz, IcoSz, 0,
                 bmp.Canvas.Brush.Handle, DI_NORMAL); // рисуем на него икону
      il.Add(bmp, nil); // собавляем икону в лист
      (FindComponent('XiButton' + IntToStr(i)) as TXiButton).Glyph.PixelFormat := pf32bit;
      (FindComponent('XiButton' + IntToStr(i)) as TXiButton).Glyph.Width := 32;
      (FindComponent('XiButton' + IntToStr(i)) as TXiButton).Glyph.Height := 32;
      il.Draw((FindComponent('XiButton' + IntToStr(i)) as TXiButton).Glyph.Canvas, 0, 0, i-1);
      bmp.Free;
    end;
  end;
end;


то что получается - смотрите на картинке

user posted image

Добавлено
Если у кнопки убираю свойство TransparentGlyph (ставлю значение в False), то всё прекрасно отрисовывается, с тенями, но на белом фоне... smile
А мне нужно чтобы в качестве фона оставалась цветовая схема кнопки (градиентная заливка)

Это сообщение отредактировал(а) HackMan - 28.1.2007, 19:05


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
CatATonik
Дата 29.1.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

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



Вот, медленно конечно, но за-то работает хоть в Win95:

Код

// Src.PixelFormat = pf32Bit
procedure Blend(Canvas: TCanvas; Src: TBitmap; DstX, DstY: Integer);

type
  TRGB32 = packed record
    R: Byte;
    G: Byte;
    B: Byte;
    A: Byte;
  end;

  PRGB32Array = ^TRGB32Array;
  TRGB32Array = array[0..MaxInt div 4 - 1] of TRGB32;

  TRGB24 = packed record
    R: Byte;
    G: Byte;
    B: Byte;
  end;

  PRGB24Array = ^TRGB24Array;
  TRGB24Array = array[0..MaxInt div 3 - 1] of TRGB24;

var
  X, Y: Integer;
  S: PRGB32Array;
  D: TRGB;
begin
  for Y := 0 to Src.Height - 1 do
  begin
    S := Src.ScanLine[Y];

    for X := 0 to Src.Width - 1 do
    begin
      D := TRGB(Canvas.Pixels[DstX + X, DstY + Y]);
      if S[X].A = 255 then
      begin
        D.R := S[X].R;
        D.G := S[X].G;
        D.B := S[X].B;
      end
      else if S[X].A > 0 then
      begin
        D.R := Trunc(S[X].R * S[X].A / 255 + D.R * (255 - S[X].A) / 255);
        D.G := Trunc(S[X].G * S[X].A / 255 + D.G * (255 - S[X].A) / 255);
        D.B := Trunc(S[X].B * S[X].A / 255 + D.B * (255 - S[X].A) / 255);
      end;
      D.Reserved := 0;
      Canvas.Pixels[DstX + X, DstY + Y] := TColor(D);
    end;
  end;
end;

PM MAIL   Вверх
HackMan
Дата 29.1.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

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



А где описан тип TRGB?

Добавлено
Насколько я понял его структура такая:

Код

  TRGB = packed record
    R: Byte;
    G: Byte;
    B: Byte;
    Reserved: Byte;
  end;


но, вот что получается на этот раз smile

user posted image

Это сообщение отредактировал(а) HackMan - 29.1.2007, 12:45


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
CatATonik
Дата 29.1.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

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



Сорри, ошибочка была (из контекста выдирал):
Код

procedure Blend(Canvas: TCanvas; Src: TBitmap; DstX, DstY: Integer);
type
  TRGB32 = packed record
    R: Byte;
    G: Byte;
    B: Byte;
    A: Byte;
  end;
  PRGB32Array = ^TRGB32Array;
  TRGB32Array = array[0..MaxInt div 4 - 1] of TRGB32;

  TRGB = packed record
    B: Byte;
    G: Byte;
    R: Byte;
    Reserved: Byte;
  end;
var
  X, Y: Integer;
  S: PRGB32Array;
  D: TRGB;

  ...

PM MAIL   Вверх
HackMan
Дата 29.1.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

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



получается тоже, что и на первом скрине, но только теперь иконки, которые менее 32 бит, не отображаются smile


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

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


 




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


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

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