Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.09.2012, 19:13
serenberg serenberg вне форума
Прохожий
 
Регистрация: 17.09.2012
Сообщения: 7
Репутация: 10
По умолчанию аналог прямоугольного выделения фрагмента изображения (как в paint)

Помогите пожалуйста!
в компонент timage загружена картинка
необходимо сделать аналог прямоугольного выделения фрагмента изображения (как в paint) линией и с запоминанием начальной и конечной точек координат данного выделения.
Ответить с цитированием
  #2  
Старый 17.09.2012, 19:30
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Что уже сделано, и что не понятно??
Ответить с цитированием
  #3  
Старый 25.09.2012, 21:31
serenberg serenberg вне форума
Прохожий
 
Регистрация: 17.09.2012
Сообщения: 7
Репутация: 10
По умолчанию

считал координаты, но не знаю как нарисовать прозрачный прямоугольник, по зажатию клавиши мышки, т.к. с графикой не работал, но думаю разберусь на выходных, т.к. это не основная сейчас задача для работы.
Ответить с цитированием
  #4  
Старый 25.09.2012, 21:54
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

если хошь нарисовать прозрачный прямоугольник, то присвой свойству
canvas.brush.style:=bsclear;
Ответить с цитированием
  #5  
Старый 26.09.2012, 04:40
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от serenberg
Помогите пожалуйста!
в компонент timage загружена картинка
необходимо сделать аналог прямоугольного выделения фрагмента изображения (как в paint) линией и с запоминанием начальной и конечной точек координат данного выделения.
Пробуй так:
Код:
var
  SelRect: TRect; // В эту переменную запоминаются координаты выделенного прямоугольника

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    SelRect := Rect(X, Y, X, Y);
    Image1.Canvas.Pen.Style := psDashDot;
    Image1.Canvas.Pen.Mode := pmNot;
    Image1.Canvas.Brush.Style := bsClear;
  end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
  begin
    Image1.Canvas.Rectangle(SelRect);
    SelRect.BottomRight := Point(X, Y);
    Image1.Canvas.Rectangle(SelRect);
  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    Image1.Canvas.Rectangle(SelRect);
    SelRect.BottomRight := Point(X, Y);

    Image1.Canvas.Pen.Style := psSolid;
    Image1.Canvas.Pen.Mode := pmCopy;
    Image1.Canvas.Rectangle(SelRect);
    Image1.Canvas.Brush.Style := bsSolid;
  end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
serenberg (26.09.2012)
  #6  
Старый 26.09.2012, 05:11
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

можно через DrawFocusRect
Код:
var
  prevlasso, lasso: TRect;
  lassoStarted: boolean = false;

procedure Tmain.drawLasso(r: TRect);   // рисует/стирает рамку выделения
var rr: TRect;
begin
  rr.Left := min(r.Left, r.Right);
  rr.Top := min(r.Top, r.Bottom);
  rr.Right := max(r.Left, r.Right);
  rr.Bottom := max(r.Top, r.Bottom);
  main.Canvas.DrawFocusRect(rr);
end;

procedure Tmain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if not (ssleft in shift) then exit;

  lassoStarted := true;

  lasso.TopLeft := point(x, y);
  lasso.BottomRight := point(x, y);
  prevlasso := lasso;

  drawLasso(lasso);
end;

procedure Tmain.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if not lassoStarted then exit;

  prevlasso := lasso;
  lasso.BottomRight := point(x, y);

  drawLasso(prevlasso);
  drawLasso(lasso);
end;

procedure Tmain.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if not lassoStarted then exit;

  lassoStarted := false;

  prevlasso := lasso;
  drawLasso(prevlasso);

  if ssShift in Shift then
    ToggleSelectionOnThem
  else
    SelectThem;
end;
__________________
>woweook<
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
serenberg (26.09.2012)
  #7  
Старый 26.09.2012, 05:47
serenberg serenberg вне форума
Прохожий
 
Регистрация: 17.09.2012
Сообщения: 7
Репутация: 10
По умолчанию

Всем спасибо за помощь!
Ответить с цитированием
  #8  
Старый 26.09.2012, 06:00
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
Смех

Цитата:
Сообщение от Pyro
можно через DrawFocusRect
Я тоже первоначально сделал через DrawFocusRect. Но из-за глюка этой функции, при которой она ничего не рисует если первая координата больше второй я решил не усложнять пример приведением координат к рабочему виду, которые у тебя выполняет метод drawLasso.
p.s. Мой первый пример сохранился, но приводить его не буду так как нет смысла - мой второй вариант мне нравится больше
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter