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 17:00:00) [21]

Напрашивается только один вывод - хреновый делфи. Это если учитывать что
винамп работает у меня нормально.


antonn   (2007-11-17 16:54:00) [22]

работает, и даже 1152*864


Nightmare   (2007-11-17 16:36:00) [23]

Или если у тебя нет GDI+ то сделай в своём коде Bitmap размером 1024Х768


Nightmare   (2007-11-17 16:34:00) [24]

а мой код как работает, ну естественно если один раз делать
if SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
WS_EX_LAYERED) = 0 then ShowMessage(SysErrorMessage(GetLastError));

и убрать DC := GetDC(0);в таймере
и брать Img размером 1024Х768


antonn   (2007-11-17 16:03:00) [25]

мой - нормально. и даже в таймере


Nightmare   (2007-11-17 15:49:00) [26]

Я уже давно вынес, но это всё равно не помогает.

antonn, а у тебя этот код разве нормально работает?


antonn   (2007-11-17 15:34:00) [27]

DC := GetDC(0); вынеси из таймера


Nightmare   (2007-11-17 15:08:00) [28]

Я тут обнаружил ещё одну интересную вещь. Если запустить винамп(скин должен быть с альфа каналом) вместе с моим приложением и навести курсор на винамп, то моё приложение начинает ести 50% от процессора.  

Странно, да.


Nightmare   (2007-11-17 14:07:00) [29]

Ладно начнём с другого конца: ULW насколько я знаю недаёт компонентам перерисовываться перехватыя сообщение WM_Paint.Так Да?


antonn   (2007-11-17 14:02:00) [30]

она много раз делает setcursor() :))
и еще маусмув посылает :)


Nightmare   (2007-11-17 14:00:00) [31]

Ладно другой вопрос: Что происходит с формой если на нее навести мышку?


Nightmare   (2007-11-17 13:33:00) [32]

Alienware Invader и анимация и альфа канал(правда весит ~30мб).


homm   (2007-11-17 13:30:00) [33]

> [18] Nightmare   (17.11.07 13:28)
> В винампе есть скины с тенью,

И анимацией, ага?
Как часто твоя анимация обновляется.


> Карточка (не смейтесь) Radeon 9600

Здесь нет ничего смешного. Вполне достаточно для тебуемых тебе вещей, только не в виндовс.


Nightmare   (2007-11-17 13:28:00) [34]


> Да ну? О_0 и как это чудо увидеть?

В винампе есть скины с тенью, кроме как ULW тень на рабочий стол не сделать.

Тени у мыши нету, стандартный курсор Xp.

Карточка (не смейтесь) Radeon 9600


homm   (2007-11-17 13:24:00) [35]

Ты тень у мыши отключил? Какая карточка ответил?


homm   (2007-11-17 13:22:00) [36]

> [14] Nightmare   (17.11.07 13:21)
> В винампе тоже ULW, с той же анимацией,

Да ну? О_0 и как это чудо увидеть?


Nightmare   (2007-11-17 13:22:00) [37]

BDS 2006


Nightmare   (2007-11-17 13:21:00) [38]

В винампе тоже ULW, с той же анимацией, и ест он столько же, как и моя форма если на неё не наводить мышку.


antonn   (2007-11-17 13:18:00) [39]


> Веть в винампе как-то сделали.

странно, но насколько я понимаю, в винампе обычными регионами вырезается форма, на которой блитятся картинки...

какая версия дельфи?


homm   (2007-11-17 13:16:00) [40]

> [11] Nightmare   (17.11.07 13:13)
> Веть в винампе как-то сделали.

что там сделали?


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

Наверх

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