![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
UpdateLayerWindow [XP]
Nightmare © (2007-11-16 20:05:00)Здравствуйте, я использую в своей программе для вывода интерфейса ULW и возникла такая проблема, как только в таймере начинает работать ULW и курсор не находится в области формы, то загрузка процессора составляет 0%, а как только я навожу курсор на форму то загрузка процессора увеличивается до 50%, хотя ничего по сути не меняется и обновление происходит точно также.
Может кто нибудь знает как это убрать?
P.S. для работы потребуется GDI+, и img я брал размером 1024Х768
var
pt1, pt2: TPoint;
sz: TSize;
bf: TBlendFunction;
DC: HDC;
Bmp: TBitmap;
procedure TFrm.FormCreate(Sender: TObject);
begin
Timer1.enabled:=False;
end;
procedure TFrm.Button1Click(Sender: TObject);
var
H: HBitmap;
Bitmap: TGPBitmap;
begin
Bitmap:=TGPBitmap.Create('Img.png');
Bmp:=TBitmap.Create;
Bitmap.GetHBITMAP(0,H);
Bmp.Handle:=H;
Timer1.Enabled:=true;
end;
procedure TFrm.Timer1Timer(Sender: TObject);
begin
if SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
WS_EX_LAYERED) = 0 then ShowMessage(SysErrorMessage(GetLastError));
Width:=bmp.Width;
Height:=bmp.Height;
DC := GetDC(0);
sz.cx := Width;
sz.cy := Height;
pt1 := Point(Left, Top);
pt2 := Point(0,0);
with bf do begin
BlendOp := AC_SRC_OVER;
BlendFlags := 0;
SourceConstantAlpha := 255;
AlphaFormat := AC_SRC_ALPHA;
end;
UpdateLayeredWindow(Handle, DC, @pt1, @sz, bmp.Canvas.Handle, @pt2, 0, @bf, ULW_ALPHA);
ReleaseDC(0,DC);
end;
Nightmare (2007-11-17 13:13:00) [41]
> if SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle,
> GWL_EXSTYLE) or
> WS_EX_LAYERED) = 0 then ShowMessage(SysErrorMessage(GetLastError));
>
> это можно делать один раз.
Не помогло
> об улучшениях в сторону увеличения производдительности и
> безключности даже не мечтай.
Веть в винампе как-то сделали.
homm (2007-11-17 13:09:00) [42]> [0] Nightmare (16.11.07 20:05)
> Может кто нибудь знает как это убрать?
не использовать UpdateLayerWindow?
Отключи тень у указателя курсора.
Карточка какая, встроенная?
Ты хочешь нормальной работы функций, требующих аппаратное ускорение в оконной архитектуре виндовс, которая не менялась по сути 17 лет. В части полупрозрачных окон все держится на честном слове, об улучшениях в сторону увеличения производдительности и безключности даже не мечтай.
antonn (2007-11-17 13:06:00) [43]
if SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
WS_EX_LAYERED) = 0 then ShowMessage(SysErrorMessage(GetLastError));
это можно делать один раз.
Nightmare (2007-11-17 12:59:00) [44]В системе не стоит никаких левых программ.
Ненадо забывать что ULW происходит в таймере(мне это надо для анимации)
в твоём примере нет таймера и форма слишком маленькая, но добавив на твою форму таймер в котором выполняется процедура RenderForm, эффект получился аналогный(когда мышка на форме процессор загружен на 2-3% больше);
antonn (2007-11-17 12:44:00) [45]и на моем примере тоже такое? значит дело в твоей дельфи (возможно компоненты левые) либо в системе стоят какие нибудь программы для "деланья прозрачных окон"
Nightmare (2007-11-17 12:40:00) [46]antonn я видел твой пример уже давно, но проблема состоит в том что
если навести мышку на форму то она начинает есть 50% от процессора,
а если убрать мышку с формы то 0%, но обновление происходит точно также. И дело тут не в GDI, даже если убрать GDI и использовать обыкновенный битмар будет тоже самое.
antonn (2007-11-17 12:22:00) [47]код то разбирал? тот, что ты дал, использует GDI+ только для одного - вытаскивания png в tbitmap
http://desksoft.ru/index.php?forum=13&th=47
Nightmare (2007-11-17 12:06:00) [48]На форме 1 кнопка и больше ничего.
сохрани битмап 32бита от png на диск, удали все эти GDI+, загрузи битмап с диска и сразу выводи
Это вы о чём?
antonn (2007-11-17 11:59:00) [49]сохрани битмап 32бита от png на диск, удали все эти GDI+, загрузи битмап с диска и сразу выводи. Если будет виснуть - значит сам где то напортачил, понаставил каких нибудь компонент.
sniknik (2007-11-17 11:57:00) [50]ты ее правильно разместил, хоть и по ошибке, оформление темы как раз соответствует начинающим. читайте правила.
Nightmare (2007-11-17 11:18:00) [51]Сообщение модератору:
Вы не могли могли бы переместить эту мету в раздел Media(или просто удалить), я случайно создал её не в том разделе.
Pleazeeeeeeeeeeee.