![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Skin [D4, D5, D7, WinME, WinXP]
alvin © (2002-12-24 07:28:00)Уважаемые Мастера, подскажите как разработать программу, использующую скины (желательно пример).
ScableR (2002-12-26 08:46:00) [1]to Drin
Ты имел в виду torry.net???
Если да, то не можешь ли точнее??? Я не смог найти :-(
drin (2002-12-26 02:36:00) [2]Поищи компонент Skins Zip на Торри (www.torry.com)
alvin (2002-12-25 23:45:00) [3]Спасибо, Всем, с РОЖДЕСТВОМ И НОВЫМ ГОДОМ ВАС МУЖИКИ
ScableR (2002-12-25 04:33:00) [4]Ну а пример знаешь какой-нибудь дла работы с архивами???
Желательно поточнее....
drin (2002-12-25 04:09:00) [5]Используя алгоритмы или компоненты для архивирования.
ScableR (2002-12-25 04:02:00) [6]А загрузку из архива как организовать????
drin (2002-12-25 03:49:00) [7]Нужно пробовать и експкркментировать, я писал скин-движок и только раза с 3-4 получилось без багов.
Могу дать несколько советов:
1. Если обьект должен перерисовываться то блокоровать WM_EraseBkgnd;
2. Если нужно менять форму по маске то используй такую ф-ию:
function BitmapToRgn(Image: TBitmap; Mask: TColor): HRGN;
var
TmpRgn: HRGN;
x, y: integer;
ConsecutivePixels: integer;
CurrentPixel: TColor;
CreatedRgns: integer;
CurrentColor: TColor;
begin
CreatedRgns := 0;
Result := CreateRectRgn(0, 0, Image.Width, Image.Height);
inc(CreatedRgns);
if (Image.Width = 0) or (Image.Height = 0) then exit;
for y := 0 to Image.Height - 1 do
begin
CurrentColor := Image.Canvas.Pixels[0,y];
ConsecutivePixels := 1;
for x := 0 to Image.Width - 1 do
begin
CurrentPixel := Image.Canvas.Pixels[x,y];
if CurrentColor = CurrentPixel then
inc(ConsecutivePixels)
else
begin
if CurrentColor = Mask then
begin
TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1);
CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
inc(CreatedRgns);
DeleteObject(TmpRgn);
end;
CurrentColor := CurrentPixel;
ConsecutivePixels := 1;
end;
end;
if (CurrentColor = Mask) and (ConsecutivePixels > 0) then
begin
TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1);
CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
inc(CreatedRgns);
DeleteObject(TmpRgn);
end;
end;
end;
TCrash (2002-12-24 19:38:00) [8]Кстати, забыл сказать. Я пользовался маленькой хитростью для изменения не только внешнего вида контролов, но и для изменения их наличия.
Button2.Visible:=False;
Check1.Visible:=True;
Вотт собсно и все.
TCrash (2002-12-24 19:27:00) [9]Ручками весьма трудоемко. На кларионе я че-то подобное писал.
Все уперлось в то, что при любом используемом скине в окне должны быть те же контролы с теми же названиями.
для делфи нечто подобное может выглядеть след. образом : (подразумеваем, что данные, необходимые для формирования скина уже прочитанны из файла в Record)
procedure TForm1.ApplySkin;
begin
Button1.Cption:=SkinRec.btn1.capt;
Button1.Font:=SkinRer.btn1.fnt;
Form1.Captioin:=SkinRec.Form.Capt;
Form1.Width:=SkinRec.Form.Width;
end;
при этом
Type
TFormRec=record
capt:string;
fnt:TFont;
end;
[кусь]
TSkinRec=record
Form : FormRec;
Btn1 : Btn1Rec;
end;
как видишь процесс трудоемкий.
А вообще ничего сложного.
alvin (2002-12-24 19:08:00) [10]Но хотелось бы ручками
Separator (2002-12-24 07:31:00) [11]Для этого уже есть готовые компаненты, поищи внимательно