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


Автор: HighTemplar 3.6.2005, 15:22
Необходим графический редактор, который рисует примитивы и сохраняет в файл.
На форме втыкнут на всю форму Image1, на котором и соверщается всё это действие. При построении эллипса он не стирается, а как бы заливается второстепенными эллипсами. Я пробовал помудрить со свойствами Pen, вставляя строчку
image1.Canvas.Pen.Mode := pmNotcopy;
но безрезультатно....
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Label1: TLabel;
    Edit1: TEdit;
    ColorDialog1: TColorDialog;
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    SavePictureDialog1: TSavePictureDialog;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
   AnchorX, AnchorY,
   CurX, CurY: Integer;
   B: Boolean;
   
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   AnchorX := X;
   CurX := X;
   AnchorY  := Y;
   CurY := Y;
   B := True;
   case combobox1.ItemIndex of
   2: image1.Canvas.Pixels[CurX,CurY]:=colordialog1.color;
   3: image1.canvas.moveTo(AnchorX,AnchorY);
   end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   if B then
    begin
     image1.canvas.Pen.Color:=colordialog1.Color;
     image1.canvas.Brush.Color:=colordialog1.Color;
     image1.Canvas.Pen.Mode := pmNotxor;
     image1.Canvas.Pen.Width := strtoint(edit1.Text);
     image1.Canvas.Brush.Style := bsClear;
      case combobox1.ItemIndex of
      0: Canvas.Rectangle(AnchorX, AnchorY, CurX, CurY);
      1: Canvas.Ellipse(AnchorX, AnchorY, CurX, CurY);
      end;
     CurX := X;
     CurY := Y;
     case combobox1.ItemIndex of
     0: image1.Canvas.Rectangle(AnchorX, AnchorY, CurX, CurY);
     1: image1.Canvas.Ellipse(AnchorX, AnchorY, CurX, CurY);
     end;
     end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if B then
   begin
    B := False;
    case combobox1.ItemIndex of
    3: image1.canvas.LineTo(CurX,CurY);
    end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  colordialog1.Execute;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 begin
if SavePictureDialog1.Execute then
begin
Image1.Picture.SaveToFile(SavePictureDialog1.FileName+'.bmp');
end;
end;
end;

end.


smile

Автор: poor_yorik 3.6.2005, 17:28
Попробуй
image1.Canvas.Pen.Mode := pmXor;
либо же
image1.Canvas.Pen.Mode := pmNotXor;
Могут выходить неожиданные результаты со цветами, но зато будет элипс стираться.


Автор: s-mike 4.6.2005, 11:15
{$DELPHI}/Demos/Doc/Graphex

Сохранение - TPicture/TGraphic/TBitmap SaveToFile. Одно замечание - TGraphic должен быть конкретным графическим классом (TJpegImage, TMetafile...).

Автор: andrej22 6.6.2005, 20:46
Вообще то это и моя проблема тоже. Попробуй очистить канвас. Это просто необходимо - залипаться уж точно не будет. А насчет остального - не совсем понял.

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