Эх... давненько что-то тема простаивает... Вот ещё несколько крохотных советов по дизайну.
0. Если Вы хотите придать каждой форме собственный значок, но при этом желаете, чтобы всё было сделано "по правилам", то есть через Windows-ресурсы, необходимо выполнить следующее:
а. Создать res-файл (это можно сделать через программы Restorator, ResHacker или через встроенный редактор ресурсов Delphi) и залинковать его в тело приложения директивой
{$R Имя_файла.res} (обычно это делается в модуле главной формы).
b. Для того, чтобы вызвать этот значок, вставьте в процедуру OnCreate следующий код:
try
Имя_Формы.Icon.Handle := LoadIcon(MainInstance,'Имя_ресурса_значка');
except
// Молчим насчёт отсутствующего значка
end;
А на вопрос "зачем так извращаться", есть простой ответ - оптимизация. Windows-ресурсы весят меньше, чем те же данные, встроенные в форму Delphi. +упрощает перерисовку графических элементов программы - достаточно лишь отредактировать ресурс, а затем запустить Delphi для компиляции.
1. Мною были испробованы несколько компонентов, заменяющих SpeedButton, но обнаружилась одна маленькая проблема - в моём случае вся графика загружается из Windows-ресурсов в формате PNG. Это сделало невозможным использование полупрозрачности (
TPNGSpeedButton работает с ошибками -- если на кнопке ЕСТЬ подпись, то глиф при загрузке из Windows-ресурса рендерится ПОВЕРХ неё
, что в моём случае было просто неприемлимо).
Но, оказалось что нет ничего невозможного, и мя удалось придумать вполне неплохо работающий способ загрузки и рендеринга полупрозрачного глифа на обычный SpeedButton!
Собственно, код (Лицензия - GPL v3):
Примечание: в качестве первого входного параметра подставляем КОМПОНЕНТ, а точнее нечто вида TSpeedButton.Glyph или TImage.Bitmap. В качестве второго -- любой TGraphic, будь то BMP, JPG, PNG, GIF или другой вид ресурсов, совместимый с TGraphic. Далее ширину и высоту в пикселях. Ну, и последнее - цвет для рендеринга, как в виде константы Delphi, так и в виде цвета $AAGGBBRR.{ Draws translucent graphics (hack for TSpeedButton & other native Delphi 7 components). ^___^ }
procedure Skin_DrawButtonIcon(Glyph : TBitmap; Source : TGraphic; GlyphWidth : integer = 48; GlyphHeight : integer = 48; DrawColor : TColor = clBtnFace);
begin
Glyph.Create; // Инициализируем контейнер картинки
Glyph.Width := GlyphWidth; // Присваиваем ширину...
Glyph.Height := GlyphHeight; // ...и высоту
{ Fixing color "bug" }
Glyph.Canvas.Pen.Color := DrawColor; // Назначаем фоновый цвет для рендеринга
if GlyphWidth > GlyphHeight then Glyph.Canvas.Pen.Width := GlyphWidth else Glyph.Canvas.Pen.Width := GlyphHeight; // Присваиваем инструменту "ручка" толщину линии по ширине или высоте картинки
Glyph.Canvas.Rectangle(0,0,GlyphWidth,GlyphHeight); // рендерим фон
Glyph.Canvas.Draw(0,0,Source); // накладываем картинку
end;
А вот и пример использования (укороченный):
procedure LoadSkin;
var Icon_Archive_Open : TPNGObject;
begin
// Создаём контейнер
Icon_Archive_Open := TPNGObject.Create;
// Загружаем ресурс в контейнер
Icon_Archive_Open.LoadFromResourceName(HInstance,'Icon_Archive_Open');
// Вызываем вышеописанную процедуру
Skin_DrawButtonIcon(SB_OpenArchive.Glyph,Icon_Archive_Open);
// Высвобождаем память от контейнера
FreeAndNil(Icon_Archive_Open);
end;
Теперь несколько слов о том, почему строка
Icon_Archive_Open.LoadFromResourceName(HInstance,'Icon_Archive_Open'); не вызвала ошибки. Дело в том, что перед её использованием необходимо внести небольшое исправление в библиотеку pngimage.pas (пакет TPNGImage 1.4):
Найдите этот участок кода...
try ResStream := TResourceStream.Create(Instance, Name, RT_RCDATA);
except
RaiseError(EPNGCouldNotLoadResource, EPNGCouldNotLoadResourceText);
exit;
end;
...замените его на...
// WinKi: this version will try to load from PNG resdata type first
try ResStream := TResourceStream.Create(Instance, Name, 'PNG');
except
try ResStream := TResourceStream.Create(Instance, Name, RT_RCDATA);
except
RaiseError(EPNGCouldNotLoadResource, EPNGCouldNotLoadResourceText);
exit; end;
end;
На этом всё, до новых встреч. ^___~
Сообщение отредактировал WinKi-тян: 29 Март 2008 - 08:41