![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перемещение+изменение размера=1 обновление [D2, D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
BFG9k © (2005-08-08 14:39:00)На форме расположена картинка (FastImg) с Align=alClient. Делаю перемещение формы вместе с изменением ее размера:
procedure TForm2.ZoomAndMove(ALeft,ATop:integer;AScale:Real);
begin
SetBounds(ALeft,ATop,Round(Width*AScale),Round(Height*AScale));
end;
Видно, что картинка дергается: сначала происходит изменение размера, а потом перемещение. То есть происходит 2 обновления, хотя по логике процедура SetBounds нужна для того, чтобы этого избежать.
Как добиться одной перерисовки ?
BFG9k (2005-08-09 14:32:00) [1]Ладно, сам спросил - сам отвечаю :
Убираем FastImg.Align:=alClient;
Далее...
procedure TForm2.DoAlign(ALeft,ATop,AWidth,AHeight:integer);
begin
Parent.Perform(WM_SETREDRAW,0,0);
FastImg.SetBounds(0,0,AWidth,AHeight);
SetBounds(ALeft,ATop,AWidth,AHeight);
Parent.Perform(WM_SETREDRAW,1,0);
InvalidateRect(FastIMg.Handle,nil,True);
InvalidateRect(Parent.Handle,nil,True);
UpdateWindow(Parent.Handle);
end;
procedure TForm2.ZoomAndMove(ALeft,ATop:integer;AScale:Real);
begin
DoAlign(ALeft,ATop,Round(Width*AScale),Round(Height*AScale));
end;
BFG9k (2005-08-09 12:55:00) [2]2 Anatoly Podgoretsky:
Если такой умный, почему бы не ответить ?;-)
BFG9k (2005-08-08 15:41:00) [3]procedure TForm2.ZoomAndMove(ALeft,ATop:integer;AScale:Real);
begin
LockWindowUpdate(Handle);
SetBounds(ALeft,ATop,Round(Width*AScale),Round(Height*AScale));
LockWindowUpdate(0);
end;
Работает. Но видно, что каждый раз перерисовывается ВЕСЬ экран, а не только окно. Почему это происходит и как этого избежать ?
Slym (2005-08-08 15:05:00) [4]Anatoly Podgoretsky © (08.08.05 14:58) [1]
Смяшно и в тему...
LockWindowUpdate
Anatoly Podgoretsky (2005-08-08 14:58:00) [5]Не для этого нужно, а для того что бы не было восьми перерисовок.