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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2012, 00:45   #1
Kyran29
Пользователь
 
Аватар для Kyran29
 
Регистрация: 17.08.2009
Сообщений: 14
Вопрос Прямая линия

Уважаемые форумчани,
может, кто подскажет, как реализовать рисование ПРЯМОЙ ЛИНИИ с помощь мыши так как, например, делает это «Paint».


Смысл заключается не в том, что бы нарисовать прямую линию программно, например, так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
 begin
    Form1.Image1.Canvas.MoveTo(10,15); // Начало линии
    Form1.Image1.Canvas.LineTo(350,250); // Конец линии
 end;

а в том, что пока клавиша мыши нажата, то линия тянется за «мышкой», как только клавишу отпустили, линия прямая нарисована.


Способ, описанный ниже, называется в программе «Paint» рисование линии произвольной формы:

Код:
var
 MouseButton: Boolean;


procedure TForm1.FormCreate(Sender: TObject);
 begin
   Form1.Image1.Canvas.Brush.Color := clWhite;
   Form1.Image1.Canvas.Pen.Color:=clRed;
   Form1.Image1.Canvas.Pen.Width:=3;
 end;


procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
   MouseButton:= True;
   Form1.Image1.Canvas.MoveTo(X,Y); // Начало линии
 end;


procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
 begin
    if MouseButton = True // Кнопка мыши удерживается - рисуем
      then
         Form1.Image1.Canvas.LineTo(X,Y); // Конец линии
 end;


procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  begin
    MouseButton:= False; // Отпустили кнопку мыши
  end;

Вот программа в действии, линии произвольной формы получаются!
Изображения
Тип файла: png screenshot.png (16.5 Кб, 182 просмотров)

Последний раз редактировалось Kyran29; 30.05.2012 в 00:49.
Kyran29 вне форума Ответить с цитированием
Старый 30.05.2012, 02:17   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Если тебе надо именно прямую линию, а не "линию произвольной формы", то просто добавить несколько глобальных переменных и подкорректировать пару процедур:
Код:
var Form1:TForm1;
  c:TColor;
  old_x,old_y,move_x,move_y:integer;
.............
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   MouseButton := True;
   Form1.Image1.Canvas.MoveTo(X,Y); // Начало линии
   c:=Image1.canvas.brush.Color;
   old_x:=x;
   old_y:=y;
   move_x:=x;
   move_y:=y;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
      if MouseButton = True // Кнопка мыши удерживается - рисуем
      then
      begin
         Form1.Image1.Canvas.Pen.Color:=c;
         Form1.Image1.Canvas.MoveTo(old_X,old_Y); // Начало линии
         Form1.Image1.Canvas.LineTo(move_X,move_Y); // Конец линии
         Form1.Image1.Canvas.Pen.Color:=clRed;
         move_x:=x;
         move_y:=y;
         Form1.Image1.Canvas.MoveTo(old_X,old_Y); // Начало линии
         Form1.Image1.Canvas.LineTo(move_X,move_Y); // Конец линии
      end;
end;
Но думаю, что будет косяк с затиранием старых линий.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 30.05.2012, 14:05   #3
Kyran29
Пользователь
 
Аватар для Kyran29
 
Регистрация: 17.08.2009
Сообщений: 14
По умолчанию

Rin - спасибо, вроде ближе к делу, да косяк есть с затиранием старых линей, может, посоветуешь, как этот косяк исправить?
Kyran29 вне форума Ответить с цитированием
Старый 30.05.2012, 14:07   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,300
По умолчанию

Можно попробовать сделать так:
Создать невидимый битмап
При моусдауне туда копировать исходное изображение и запоминать координаты мыши
При моусмуве рисовать старое изображение в имайдж и линию по запомненным и новым координатам мыши
Чисто имхо
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.05.2012, 14:13   #5
Kyran29
Пользователь
 
Аватар для Kyran29
 
Регистрация: 17.08.2009
Сообщений: 14
По умолчанию

BDA - можно подробней? И хотя бы немного кода.
Kyran29 вне форума Ответить с цитированием
Старый 30.05.2012, 15:29   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,300
По умолчанию

Вот примерчик.
Вложения
Тип файла: zip Project1.zip (216.6 Кб, 82 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.05.2012, 17:06   #7
Kyran29
Пользователь
 
Аватар для Kyran29
 
Регистрация: 17.08.2009
Сообщений: 14
По умолчанию

BDA - Большое СПАСИБО!
Все отлично работает!
Kyran29 вне форума Ответить с цитированием
Старый 30.05.2012, 17:11   #8
Kyran29
Пользователь
 
Аватар для Kyran29
 
Регистрация: 17.08.2009
Сообщений: 14
По умолчанию

На свой вопрос я получил исчерпывающий ответ! Всем большое спасибо.
А в частности - BDA и Rin
Kyran29 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Квадрат и прямая xXSilentXx Общие вопросы C/C++ 14 26.07.2011 19:24
Прямая и Окружность Ukeeler Помощь студентам 5 02.11.2010 17:50
Прямая VirusOfLove Помощь студентам 8 05.12.2009 09:37
Прямая линия serres Общие вопросы Delphi 1 04.11.2007 18:33
Прямая в пространстве Neuros1s Общие вопросы Delphi 12 29.06.2007 00:06