Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2013, 01:01   #1
kaktusad
Пользователь
 
Регистрация: 16.11.2012
Сообщений: 17
По умолчанию Движение прямоугольника вместе с мышкой

Вопрос, думаю, очень легкий, но прошу мне помочь, не могу ни как разобраться.
Есть компонент PaintBox, на котором размещена картинка. Нужно сделать, чтобы при передвижении указателя мышки по пэнинтбоксу вместе с ним и двигался прямоугольник, например, зеленый 40х40.
У меня проблема возникает в том, что при передвижении указателя нужно рисовать новый прямоугольник и стирать старый, но чтобы весь рисунок не перерисовывать, так как приложение подвисает. Рисовать прямоугольник пытался с помощью канвы...
kaktusad вне форума Ответить с цитированием
Старый 24.05.2013, 08:08   #2
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

http://delphiworld.narod.ru/base/draw_mouse_box.html
немного переделать код, точнее взять идею
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 24.05.2013, 08:25   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ссылку Тохи не смотрел, но на всякий случай:
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure PaintBox1Paint(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var  ax,ay:integer;
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 PaintBox1.Canvas.Brush.Color:=clGreen;
 PaintBox1.Canvas.Rectangle(ax-10,ay-10,ax+10,ay+10);
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 ax:=x; ay:=y;  PaintBox1.Repaint;
end;

end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.05.2013, 10:10   #4
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

вариант от Stilet не катит, ибо он перерисовывает весь PaintBox1
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 24.05.2013, 10:24   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не катит, ибо он перерисовывает весь PaintBox1
Он ниче не перерисовыввает )
Присмотрись и найди в нем команды перерисовки всего компонента.
Другое дело что автору стоит указать точнее как он размещал картинку. Я бы на его месте перерисовывал вместе с картинкой.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.05.2013, 10:42   #6
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

Код:
PaintBox1.Repaint;
с PaintBox я плохо знаком, могу что то не так понимать

я для примера протестил твой код, только перед этим нарисовал на PaintBox1 свой рисунок, и как только навел мышку на PaintBox1, все мое творение пропало, т.е. надо снова рисовать, это разве не перерисовка?
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 24.05.2013, 12:22   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Для справки: PaintBox в любом случае весь перерисовывается сам. Надо же обновить содержимое.
Человек_Борща вне форума Ответить с цитированием
Старый 24.05.2013, 12:37   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от Toxa Посмотреть сообщение
http://delphiworld.narod.ru/base/draw_mouse_box.html
немного переделать код, точнее взять идею
Вообще далеко, имхо.

У Stilet действительно перерисовка.

Предлагаю подход с обычной двойной буфферизацией:
Создать 2 битмапа, в один загрузить картинку (он вообще никогда не будет меняться), во второй тоже загрузить (он будет буфферным изображением, первичная загрузка нужна для уставноки размеров). При смещении мышки передать координаты в функцию рисовки, в которой на второй битмап нарисовать первый, потом нарисовать на второй битмап прямоугольник по нужным координатам, потом второй битмап одним Draw нарисовать на пейнтбокс. Мерцать не будет.
phomm вне форума Ответить с цитированием
Старый 24.05.2013, 13:35   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от kaktusad Посмотреть сообщение
Вопрос, думаю, очень легкий, но прошу мне помочь, не могу ни как разобраться.
Есть компонент PaintBox, на котором размещена картинка. Нужно сделать, чтобы при передвижении указателя мышки по пэнинтбоксу вместе с ним и двигался прямоугольник, например, зеленый 40х40.
У меня проблема возникает в том, что при передвижении указателя нужно рисовать новый прямоугольник и стирать старый, но чтобы весь рисунок не перерисовывать, так как приложение подвисает. Рисовать прямоугольник пытался с помощью канвы...
В принципе, эту задачу можно решать двумя совершенно различными способами. Собственно, способы настолько различные, что обладают существенно различающимися свойствами, а потому выбирать следует именно, исходя из свойств.

1. Перерисовка в самом PaintBox'е. По сути нужно перерисовывать весь PaintBox, но тут существует масса вариантов оптимизации, которые имеет смысл использовать.
Преимущества: рисуем и перемещаем то, что нужно, и так, как нужно.
Недостатки: рисунок не может выйти за пределы PaintBox'а.

2. Создаем отдельное окно нужного цвета и с нужным рисунком и именно его таскаем за мышкой.
Преимущества: может выходить за пределы PaintBox'а.
Недостатки: перемещается посредством WinAPI, поэтому не всегда можно сделать именно то, что хочется.
s-andriano вне форума Ответить с цитированием
Старый 24.05.2013, 17:46   #10
kaktusad
Пользователь
 
Регистрация: 16.11.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
В принципе, эту задачу можно решать двумя совершенно различными способами. Собственно, способы настолько различные, что обладают существенно различающимися свойствами, а потому выбирать следует именно, исходя из свойств.

1. Перерисовка в самом PaintBox'е. По сути нужно перерисовывать весь PaintBox, но тут существует масса вариантов оптимизации, которые имеет смысл использовать.
Преимущества: рисуем и перемещаем то, что нужно, и так, как нужно.
Недостатки: рисунок не может выйти за пределы PaintBox'а.

2. Создаем отдельное окно нужного цвета и с нужным рисунком и именно его таскаем за мышкой.
Преимущества: может выходить за пределы PaintBox'а.
Недостатки: перемещается посредством WinAPI, поэтому не всегда можно сделать именно то, что хочется.
Изображение создаю в БитМап, рисую на Пэинт боксе с помощью StretchDraw и если его перерисовывать при каждом движении мышки, то будут почти одни полосы.
1. Как перерисовывать только кусок? У меня получается перерисовывать только весь ПэинтБокс и так как перерисовка очень частая, изображения почти не видно.
2. Если создать отдельное окно, то событие по движению мышки уже происходит на этом окне, а не пэинт боксе. То есть нужно чтобы окно было всегда вокруг мышки.
kaktusad вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение камеры мышкой pufystyj Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 19.01.2012 23:19
планое движение картинки за мышкой Верика JavaScript, Ajax 1 29.06.2010 19:52
Загрузить библиотеку вместе сразу вместе с программой Anekdot Общие вопросы Delphi 4 26.01.2010 23:14
Задача в Delphi(движение за мышкой) Angelly Помощь студентам 5 22.09.2009 13:12
Движение текста вместе с автофигурой Sleepwalker Microsoft Office Excel 2 13.12.2006 12:35