Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Графический редактор в Delphi


Автор: Inonia 13.11.2012, 17:04
Здравствуйте. Как организовать в графическом редакторе возможность выбора толщины линии, типа закраски (с соответствующими изображениями), работу инструмента ластик?

Автор: MetalFan 13.11.2012, 21:39
Наработки/соображения есть?
Если нет, то тема или в работу или в центр помощи поедет.

Автор: Alexeis 13.11.2012, 21:51
  У класса TCanvas есть свойство Pen у него толщина линии. Заливку можно сделать при помощи FloodFill , ну а ластик в простейшем случае рисовать как прямоугольник белого цвета.

Автор: MetalFan 13.11.2012, 21:56
Alexeis, думаешь это поможет?)))

Автор: Alexeis 13.11.2012, 22:10
  Не, ну так-то если линии уже рисуются, то значит все не так плохо. Правда вполне вероятно, что программка была скачана из инета, а предусмотрительный профессор попросил усовершенствовать сие творение. В этом случае не поможет.

Автор: Inonia 14.11.2012, 07:28
Цитата(Alexeis @ 13.11.2012,  21:51)
У класса TCanvas есть свойство Pen у него толщина линии. Заливку можно сделать при помощи FloodFill , ну а ластик в простейшем случае рисовать как прямоугольник белого цвета.

Это я знаю. А как прописать?
Я уже весь код написала, а вот с этим загвоздка. Преподаватель ничего не объясняет(
Вот код моей программы:

unit Unit2;

Код

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtDlgs, jpeg, ExtCtrls, StdCtrls, Buttons;

type
  TForm2 = class(TForm)
    BitBtn1: TBitBtn;
    Panel1: TPanel;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    procedure BitBtn1Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure Image5MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image5MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image5MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image4Click(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure Image3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Drag:boolean;
    Pen:boolean;
    Line:boolean;
    el:boolean;
    rect:boolean;
    x1,y1: integer;
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.BitBtn1Click(Sender: TObject);
begin
form2.Hide;
form1.Show;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Image5.Picture.LoadFromFile('new.bmp');
end;

procedure TForm2.Image1Click(Sender: TObject);
begin
line:=false;
el:=true;
rect:=false;
pen:=false;
end;

procedure TForm2.Image2Click(Sender: TObject);
begin
line:=true;
el:=false;
rect:=false;
pen:=false;
end;

procedure TForm2.Image3Click(Sender: TObject);
begin
line:=false;
el:=false;
rect:=false;
pen:=true;
end;

procedure TForm2.Image4Click(Sender: TObject);
begin
line:=false;
el:=false;
rect:=true;
pen:=false;
end;

procedure TForm2.Image5MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Drag:=True;
Canvas.MoveTo(X, Y);
x1:=x;
y1:=y;
end;

procedure TForm2.Image5MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if (Drag and Pen) then Canvas.LineTo(X, Y);

end;

procedure TForm2.Image5MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Line then Canvas.LineTo(x,y);
if rect then Canvas.Rectangle(x1,y1,x,y);
if el then Canvas.Ellipse(x1,y1,x,y);
Drag:=false;
end;

procedure TForm2.N2Click(Sender: TObject);
begin
if MessageDLG('Сохранить изменения в документе?',mtConfirmation,[mbOk,mbNo],1)=mrOk
then begin
if savepicturedialog1.Execute then
Image5.Picture.SaveToFile(savepicturedialog1.FileName);
end
else
Image5.Picture.LoadFromFile('new.bmp');
end;

procedure TForm2.N3Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image5.picture.LoadFromFile(OpenPictureDialog1.Filename);
end;

procedure TForm2.N4Click(Sender: TObject);
begin
if SavePictureDialog1.Execute then
Image5.picture.LoadFromFile(SavePictureDialog1.Filename);
end;

procedure TForm2.N6Click(Sender: TObject);
begin
if MessageDLG('Сохранить изменения в документе?',mtConfirmation,[mbOk,mbNo],1)=mrOk
then begin
if savepicturedialog1.Execute then
Image5.Picture.SaveToFile(savepicturedialog1.FileName);end
else
begin
form1.Close;
form2.Close;
end;end;

end.


Модератор: используйте подсветку кода


Добавлено @ 07:29
Цитата(MetalFan @ 13.11.2012,  21:39)
Наработки/соображения есть?
Если нет, то тема или в работу или в центр помощи поедет.

Конечно, есть. Я уже все прописала. Осталось вот с этими вопросами разобраться)

Автор: Alexeis 14.11.2012, 07:33
Цитата(Inonia @  14.11.2012,  08:28 Найти цитируемый пост)
Это я знаю. А как прописать?

Код

Form1.Canvas.Pen.Width := 3; //толщина линии 3

Автор: Inonia 14.11.2012, 07:38
Цитата(Alexeis @ 14.11.2012,  07:33)
Цитата(Inonia @  14.11.2012,  08:28 Найти цитируемый пост)
Это я знаю. А как прописать?

Код

Form1.Canvas.Pen.Width := 3; //толщина линии 3

Толщина линии таким образом будет уже заданной.
А нужно сделать так, чтоб можно было выбирать толщину. Может, сделать дополнительные кнопки, которые будут появляться при нажатии на инструмент Линия? И на каждую толщину (дополнительную кнопку) написать значение.
Кстати, ластик-прямоугольник белого цвета точно пойдет, Image1 белого цвета.

Автор: Alexeis 14.11.2012, 23:10
Цитата(Inonia @  14.11.2012,  08:38 Найти цитируемый пост)
А нужно сделать так, чтоб можно было выбирать толщину. Может, сделать дополнительные кнопки, которые будут появляться при нажатии на инструмент Линия? И на каждую толщину (дополнительную кнопку) написать значение.

  В паинте каждый инструмент имеет свою панельку настроек (с различными контролами), которая показывается при его выборе. Панельки для всех инструментов можно сделать сразу, но при показе формы делать невидимыми. Когда выбирают инструмент, то показывают его панель, а панель предыдущего прячут.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)