![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мерцание TImage при перемещении [D6, Win95/98]
MK © (2002-01-06 16:26:00)Народ! Нужно избавиться от мерцания при перемещении TImage мышью. TImage находится на Panel, содержание из файла (LoadFromFile). TImage двигается через MouseMove - двигается замечательно, но мерцает постоянно. Что сделать, что перемещение было без мерцания? Спасибо.
Yaro (2002-04-22 23:05:00) [1]поньятно, спасыбо! :)
VEG (2002-04-17 15:49:00) [2]Короче, кладем на ПАНЕЛЬ (Panel1) все комнпоненты, которые нужно двигать БЕЗ мерцания. Для события OnMouseDown тех компонентов, при клике по которому должно происходить перемещение пишешь:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Panel1.perform(WM_SysCommand, $F009, 0);//Двигаем ПАНЕЛЬ!!!
end;
Причем свойство FullRepaint у ПАНЕЛИ (Panel1) ДОЛЖНО стоять в FALSE!!!
VEG (2002-04-17 15:43:00) [3]>ZEE
В данной задаче OnMouseUp СОВСЕМ не нужно!!!!
>Yaro
Panel1.perform(WM_SysCommand, $F009, 0);
А рисунок на панели!!! Разуй глаза и прочти код нормально!
ZEE (2002-04-17 03:32:00) [4]2 VEG: предложеный тобой код работает только с контролами (TPanel, TButton...), с TImage такой фокус не пройдет.
Yaro (2002-04-17 01:46:00) [5]VEG -> все пашет, но с недостатками..... не знаю, что эти строчки делают, но событие OnMouseUp не вызывается, вернее вызывается, но при втором клике...
VEG (2002-04-16 18:09:00) [6]> Yaro В Panel есть свойство FullRepaint. Присваиваешь ему False.
Воот сааамый ЛУЧШИЙ код (А то предложенные кривоваты):
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
begin
ReleaseCapture;
Panel1.perform(WM_SysCommand, $F009, 0);
end;
Причем свойство FullRepaint ДОЛЖНО стоять в FALSE!!!
ZEE (2002-04-16 03:52:00) [7]2 Yaro попробуй так (но с поправкой - Image на ScrollBox):
var drag:boolean;
xOfs,yOfs:integer;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
drag:=true;
xOfs:=X;
yOfs:=Y;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if not drag then exit;
ScrollBox1.ScrollBy(X-xOfs,Y-yOfs);
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Drag := false;
end;
Кажись так...
Yaro (2002-04-16 02:55:00) [8]Нифига на Panel"e не не мерцает, то есть мерцание = TRUE! нас нагло обманули (или я что-то сделал не так). Вот код:
var drag: boolean = false;
_x, _y: integer;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin if not Drag then exit;
Panel1.Left := Mouse.CursorPos.x - _x;
Panel1.Top := Mouse.CursorPos.y - _y;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin if drag then exit;
Drag := true;
Panel1.FullRepaint := false;
_x := Mouse.CursorPos.x - Panel1.Left;
_y := Mouse.CursorPos.y - Panel1.Top;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drag := false;
end;
VEG (2002-04-16 00:24:00) [9]На панели вообще не мерцает!!!
Ни Labels, ни Images!!!
ZEE (2002-04-15 22:19:00) [10]Еще проще TImage вместо TPanel кладешь на TScrollBox и при MouseMove у TImage юзаешь ScrollBox1.ScrollBy(...) - мерцания практически нет ...
Да еще, кажется у TPanel тоже есть ScrollBy, так что может перекладывать на TScrollBox и не придется.
VEG (2002-04-15 16:23:00) [11]Кладешь рисунок на Panel. В Panel есть свойство FullRepaint. Присваиваешь ему False. Все! Тлько двигай вместо рисунка Panel.
SPeller (2002-04-15 04:46:00) [12]Во время перемещения можно удалить во временное хранилище содержимое имага, и использовать BitBlt(<приёмник>.Canvas.Handle, Image.Left,Image.Top,Image.Width,Image.Height,SrcDC,0,0);
Сергей Чурсин (2002-04-14 14:37:00) [13]DoubleBuffered у Parent попробуй true
drol (2002-03-06 12:21:00) [14]Доброго дня.
Сначала для XeN: нервные клетки не востанавливаются.
Теперь для МК: сделать можно. Ключевое слово BitBtl.
В TBitMap грузишь картинку, а потом на TImage показываешь её часть в зависимости от сдвига мыши. Только одна проблемма, в Delphi6 всё равно мерцает, а в D5 работает отменно, можно ворочать фотообои:)
ad_tolya (2002-01-09 00:42:00) [15]Перехватывай WM_ERASEBACKGROUND (или что в этом роде...) от винды
(в имидже конечно) ну и ни чего там не делай... Просто оставь пустую процедурку без всяких inherited....
Удачи... :)))
Olfi (2002-01-08 14:59:00) [16]Да! В натуре! Direct x учи! На нём такие базарные игры можно слепить! Типа... ты понял?
XeN (2002-01-06 22:48:00) [17]Блин, надоело отвечать!
От мерцания не избавишься.
Юзай DelphiXor PowerDraw or OpenGL.