![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Механизм прорисовки скинов? [D6, Win95/98, WinME, NT4, Win2k, WinXP]
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 и интерфейсы.
Так же в Королевстве есть статьи на эту тему.