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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2014, 15:23   #1
Andrej_F
Новичок
Джуниор
 
Регистрация: 17.09.2014
Сообщений: 3
По умолчанию Canvas. Прямоугольник рисуется не там где надо.

Здравствуйте!

В меню первой формы есть кнопка "Открыть" с помощью которой мы выбираем файл изображения, после этого открывается вторая форма, в которой находится Image, отображающий выбранное изображение. Я хочу на этом изображении выделить мышкой прямоугольник, после чего этот прямоугольник нарисовался бы на изображении.

Текст первой формы:
Код:
unit images;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, pngimage, JPEG, Vcl.StdCtrls, images2;

type
  TForm3 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    OpenDialog1: TOpenDialog;
    N11: TMenuItem;
    procedure N4Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;
  height_image, width_image : word;

implementation

{$R *.dfm}

procedure TForm3.N4Click(Sender: TObject);
var
filename : Tfilename;
begin
OpenDialog1.Execute();
filename := OpenDialog1.FileName;
if (filename='') then else begin
  Form4.Show;
  Form4.Image1.Picture.LoadFromFile(filename);
  height_image := Form4.Image1.Picture.Height;
  width_image := Form4.Image1.Picture.Width;
  Form4.Image1.AutoSize := False;
  Form4.Image1.Height := 768;
  Form4.Image1.Width := Round((width_image*Form4.Image1.Height)/height_image);
  Form4.Image1.Stretch := True;
  height_koeff := Round(height_image/Form4.Image1.Height);
  width_koeff := Round(width_image/Form4.Image1.Width);
end;
end;

procedure TForm3.N7Click(Sender: TObject);
begin
Halt;
end;

end.
Вторая форма:
Код:
unit images2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Menus;

type
  TForm4 = class(TForm)
    Image1: TImage;
    MainMenu1: TMainMenu;
    Ht1: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    procedure N2Click(Sender: TObject);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;
  x1, y1, x2, y2 : integer;
  Mouse : TMouse;
  Flag_mouseup, Flag_mousedown : Boolean;
  height_koeff, width_koeff : word;

implementation


{$R *.dfm}

procedure TForm4.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Flag_mousedown = True) then begin
    x1 := Mouse.CursorPos.X;
    y1 := Mouse.CursorPos.Y;
    Flag_mouseup := True;
    Flag_mousedown := False;
  end;
end;

procedure TForm4.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if (Flag_mouseup = True) then begin
  x2 := Mouse.CursorPos.X;
  y2 := Mouse.CursorPos.Y;
  Flag_mouseup := False;
  Screen.Cursor := crDefault;
  //Canvas.Pen.Color := clGreen;
  //Canvas.Pen.Style := psSolid;
  //Canvas.Pen.Width := 2;
  Image1.Canvas.Rectangle(x1,y1,x2,y2);
end;
end;

procedure TForm4.N2Click(Sender: TObject);
begin
Screen.Cursor := crCross;
Flag_mousedown := True;
end;

end.
Т.е. идея такая: по нажатию кнопки мыши выбирать x1 и y1, а по отжатию кнопки выбирать x2 и y2.

Почему-то прямоугольник рисуется не там где нужно((( Подскажите пожалуйста что делаю не так?
Andrej_F вне форума Ответить с цитированием
Старый 17.09.2014, 17:00   #2
indexx
Заблокирован
 
Регистрация: 12.09.2014
Сообщений: 544
По умолчанию

Проект скинь. Нет желания копировать всё это.
indexx вне форума Ответить с цитированием
Старый 17.09.2014, 18:05   #3
Foreseen
Техножрец
Форумчанин
 
Аватар для Foreseen
 
Регистрация: 04.07.2014
Сообщений: 289
По умолчанию

Цитата:
Подскажите пожалуйста что делаю не так?
Ошибка у вас здесь
Код:
procedure TForm4.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Flag_mousedown = True) then begin
    x1 := Mouse.CursorPos.X;
    y1 := Mouse.CursorPos.Y;
    Flag_mouseup := True;
    Flag_mousedown := False;
  end;
end;
Вы получаете координаты указателя относительно экрана, а не относительно Image1. Для проверки посмотрите, какие значения у вас хранятся в x1, y1 после нажатия мыши. Аналогично и с процедурой Image1MouseUp.
— Двери есть везде. Просто нужно знать, как в них войти.
Foreseen вне форума Ответить с цитированием
Старый 17.09.2014, 18:12   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Выводи координаты курсора куда-нить в обработчике OnMouseMove.

З.Ы. Как вы все заколебали рисовать на TImage! Сколько лет борюсь с этим триппером в интернете - всё бестолку!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 19:14   #5
Yelenka
Пользователь
 
Аватар для Yelenka
 
Регистрация: 18.04.2014
Сообщений: 27
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Выводи координаты курсора куда-нить в обработчике OnMouseMove.

З.Ы. Как вы все заколебали рисовать на TImage! Сколько лет борюсь с этим триппером в интернете - всё бестолку!
А с помощью какого элемента вы посоветуете рисовать?
Yelenka вне форума Ответить с цитированием
Старый 17.09.2014, 19:15   #6
Andrej_F
Новичок
Джуниор
 
Регистрация: 17.09.2014
Сообщений: 3
По умолчанию

Foreseen, Спасибо!

Также, так как я сжал размер изображения под высоту 768 пикселей, пришлось считать коэффициент пропорциональности реального размера изображения к отображаемому размеру
Код:
height_image := Form4.Image1.Picture.Height;
width_image := Form4.Image1.Picture.Width;
Form4.Image1.Height := 768;
koeff := height_image/Form4.Image1.Height;
Form4.Image1.Width := Round(width_image/koeff);
и пересчитывать координаты:
Код:
x1 := Round(X*koeff);
y1 := Round(Y*koeff);
Andrej_F вне форума Ответить с цитированием
Старый 17.09.2014, 19:24   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
А с помощью какого элемента вы посоветуете рисовать?
TPaintBox, например.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 19:31   #8
Foreseen
Техножрец
Форумчанин
 
Аватар для Foreseen
 
Регистрация: 04.07.2014
Сообщений: 289
По умолчанию

На здоровье
— Двери есть везде. Просто нужно знать, как в них войти.
Foreseen вне форума Ответить с цитированием
Старый 17.09.2014, 19:40   #9
Andrej_F
Новичок
Джуниор
 
Регистрация: 17.09.2014
Сообщений: 3
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
TPaintBox, например.
дело в том, что мне нужно на выбираемом изображении указывать определенную область, поэтому я рисую на TImage.
Andrej_F вне форума Ответить с цитированием
Старый 17.09.2014, 19:50   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
дело в том, что мне нужно на выбираемом изображении указывать определенную область, поэтому я рисую на TImage.
Не вижу связи.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"With Form1.Canvas do" не отрисовывает прямоугольник *starfish* Помощь студентам 3 12.03.2011 22:09
Россия, люди... и где-то там Москва...Лужков... Кремль grenles Свободное общение 15 04.10.2010 00:16
немного не Excel, но... Vb+outlook+cdo.message что надо писать там? justS Microsoft Office Excel 6 14.04.2010 11:17
Там, где кончается триал Tihon Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 20.08.2009 16:48
Иконка в системном трее (там, где часики) Македонский Win Api 6 22.12.2008 18:03