Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Механизм прорисовки скинов? [D6, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2

Hecker ©   (2002-05-15 08:42:00) 

Кто-нить знает как делают скины, типа как в ВинАмпе?
Как рисовать на кэпшене формы?
Если не трудно, киньте примерчик...


Hecker   (2002-05-16 02:39:00) [21]

Огромное спасибо! А не знает ли кто, как делают рисунок на форме, а в некоторых местах (где рисунка нет) видно рабочий стол?


SPeller   (2002-05-16 00:53:00) [22]

2Hecker ©

Вот пример из реальной жизни:

procedure TfrmOpen.FormCreate(Sender: TObject);
var imgdc,x,y:longint;i:integer;p:tutsettings;
begin
height:=460;
width:=510;
imgskin.top:=500;

hwnd:=frmopen.Handle;
fhdc:=getdc(hwnd);

hbmp:=createcompatiblebitmap(fhdc,510,460);
hdc:=createcompatibledc(fhdc);
oldobj:=selectobject(hdc,hbmp);

imgdc:=imgskin.Canvas.Handle;

bitblt(hdc,0,0,41,35,imgdc,0,0,srccopy);
for i:=1 to 8 do begin
x:=i*41;
y:=0;
bitblt(hdc,x,y,41,35,imgdc,42,0,srccopy);
end;
bitblt(hdc,369,0,141,35,imgdc,84,0,srccopy);
for i:=1 to 13 do begin
x:=0;
y:=i*30+5;
bitblt(hdc,x,y,41,30,imgdc,0,36,srccopy);
end;
bitblt(hdc,0,425,41,35,imgdc,0,67,srccopy);
for i:=1 to 8 do begin
x:=i*41;
y:=425;
bitblt(hdc,x,y,41,35,imgdc,42,67,srccopy);
end;
for i:=1 to 13 do begin
x:=369;
y:=i*30+5;
bitblt(hdc,x,y,141,30,imgdc,84,36,srccopy);
end;
bitblt(hdc,369,425,141,35,imgdc,84,67,srccopy);

timerlst.Enabled:=true;
srcdc:=imgdc;
selectobject(srcdc,imgskin.Picture.Bitmap.Handle);
end;


Hecker   (2002-05-15 21:57:00) [23]

Спасибо за советы! Вроде всё понятно, но с кодом было бы лучше, может кто поделиться?


valery_f   (2002-05-15 17:24:00) [24]

2 SPeller> Это, скорее всего, был глюк. Ты ж наверное знаешь - перекрутить одной командой оконные флаги у TButton - и у кнопки появляется и бордюр, и капшин с кнопками minimize/maximize/close. Я не думаю, что они решили ТАК СИЛЬНО усложнить себе жизнь...

Во всяком случае, когда я делал скиновое окошко без бордюра и капшина - проблем вообще не испытывал, т.к. все делал сам и с виндой не торговался (это делаю я, это ты, тут я тебя перебью, а как мне тут через тебя пробиться и т.п.), тем более, что забот при этом не так уж много.


SPeller   (2002-05-15 16:47:00) [25]

valery_f (15.05.02 16:40)

А мне кажется, у ВинАМПа есть заголовок. Я наблюдал такую картину, когда система была на грани умирания. Главное окно прорисовывалось как обычная виндовая форточка. С заголовком, кэпшином, границей. Там всё запутаннее чем кажется на первый взгляд.


valery_f   (2002-05-15 16:40:00) [26]

2 Игорь Шевченко> Кажись, винампу WM_NCPAINT незачем - у него нет ни фрейма, ни капшна (ближайший аналог - BorderStyle формы = bsNone).


Игорь Шевченко   (2002-05-15 16:32:00) [27]

День добрый, valery_f,

И еще на уровень WM_NCPAINT, как у WinAmp"а.

С уважением,


valery_f   (2002-05-15 16:26:00) [28]

2 SPeller> Согласен. А еще лучше внедриться на уровень WM_PAINT / WM_ERASEBACKGROUND формы. Но начинающие могут пойти и от канваса (тоже ведь работает, а возни меньше), а кто поопытнее - сам догадается... ;)


SPeller   (2002-05-15 15:17:00) [29]

2 valery_f (15.05.02 13:34)

На канве лучше не рисовать, а брать GetDC(Handle). При движении формы, могут быть косяки с рисованием. Канва и контекст формы это ж две разные вещи, никак не взаимосвязанные.


valery_f   (2002-05-15 13:34:00) [30]

2Fellomena - а не сложновато ли?

Все это делается обычной отрисовкой, к тому же - не очень-то сложной: битмапы в памяти, и по OnPaint "отплевывать" на Canvas формы через BitBlt - получается очень быстро. А если у формы отбить WM_ERASEBACKGROUND, то еще и мелькать не будет.

Вариант 2: на форме лежит TImage с фоном :)

Единственное "но" - скорее всего понадобятся кастомовые контролы, которые бы "вписывались" в скин, точнее - брали бы свое изображение из "заготовок".

А на кэпшене формы рисовать ничего не надо - его нужно вообще отключить, а на форме (и, соответственно, - в скине) предусмотреть область, которая будет использоваться как кэпшен.


Fellomena   (2002-05-15 12:49:00) [31]

Скины легко реализуются с помощью механизма "Серверов автоматизации".
См. COM и интерфейсы.
Так же в Королевстве есть статьи на эту тему.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо