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

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

Мерцание 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.


Наверх

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