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

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

UpdateLayerWindow [XP]


Страницы:   1 2 3

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.


Страницы:   1 2 3

Наверх

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