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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2009, 08:06   #1
mopmuk
Пользователь
 
Регистрация: 06.06.2009
Сообщений: 19
Печаль Графический редактор

Подскажите пл3, как решить такую проблему:
Имеем простенькую рисовалку растровых изображений. При прорисовке изображения из памяти в PaintBox за фигурой (эллипс или прямоугольник, не важно какая) остается след, если использовать в памяти 2 изображения, то всё норм, но мне так нельзя делать.
Препод сказал, что надо в процедуре MouseMove брать только координаты будущей фигуры, а процедуре OnPaint уже рисовать, я что-то запутался, помогите плиз всё это реализовать.

Исходники естессно вот.
Вложения
Тип файла: rar Курсовик - черновой.rar (245.1 Кб, 33 просмотров)
mopmuk вне форума Ответить с цитированием
Старый 10.06.2009, 09:03   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Я бы на твоем месте делал бы по другому...
Создал бы массив в который вписывал элементы которые рисую, а потом бы по данным из этогомассива отрисовывал сами элементы, без всякого второго изображения.
Но раз уж хозяин - барин то могу предложить что-то типа:
Создай переменки:
Код:
  public           oldxy,oldxy0:TPoint;
которые будут хранить координаты старого эллипса пока мышка нажата
Далее перед отрисовкой эллипса рисуй элиипс цветом фона в этих координатах:
Код:
...
        sEllipse:begin
         if dwn then begin
                img.Canvas.Pen.Color:=clWhite;
                Img.Canvas.Ellipse(oldxy0.X,oldxy0.y,oldxy.X,oldxy.y);
                img.Canvas.Pen.Color:=clBlack;
                Img.Canvas.Ellipse(x0,y0,x,y);
         end;
                 end;
    end;
     if dwn then begin
       oldxy.X:=x;            oldxy.Y:=y;
       oldxy0.X:=x0;            oldxy0.Y:=y0;
     end else begin
       oldxy.X:=0;            oldxy.Y:=0;
       oldxy0.X:=0;            oldxy0.Y:=0;
     end;
Естесственно это нуждается в доработке.

В догонку на засыпку прикладываю свой вариант рисовалки:
Код:
unit Unit1;

interface

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

type
 Tfigure=record
  name:string;
  a,b:TPoint;
 end;
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    PaintBox1: TPaintBox;
    procedure PaintBox1Paint(Sender: TObject);
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public   fig:array of Tfigure;  figa:Tfigure;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PaintBox1Paint(Sender: TObject);
var i:integer;
begin
 PaintBox1.Canvas.Brush.Style:=bsClear;
 for i:=low(fig) to high(fig) do begin
  if fig[i].name='e' then   PaintBox1.Canvas.Ellipse(fig[i].a.X,fig[i].a.y,fig[i].b.X,fig[i].b.y);
  if fig[i].name='r' then   PaintBox1.Canvas.Rectangle(fig[i].a.X,fig[i].a.y,fig[i].b.X,fig[i].b.y);
  if fig[i].name='l' then begin
    PaintBox1.Canvas.MoveTo(fig[i].a.X,fig[i].a.y);
    PaintBox1.Canvas.LineTo(fig[i].b.X,fig[i].b.y);
  end
 end;
  if figa.name='e' then   PaintBox1.Canvas.Ellipse(figa.a.X,figa.a.y,figa.b.X,figa.b.y);
  if figa.name='r' then   PaintBox1.Canvas.Rectangle(figa.a.X,figa.a.y,figa.b.X,figa.b.y);
  if figa.name='l' then begin
    PaintBox1.Canvas.MoveTo(figa.a.X,figa.a.y);
    PaintBox1.Canvas.LineTo(figa.b.X,figa.b.y);
  end

end;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Form1.Tag:=1;
 case RadioGroup1.ItemIndex of
   0:figa.name:='e' ;   1:figa.name:='r'; 2:figa.name:='l';
 end;
 figa.a.X:=x;figa.a.Y:=y;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Form1.Tag:=0;
  Setlength(fig,length(fig)+1);
  fig[high(fig)]:=figa;
  PaintBox1.Repaint;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Form1.Tag=1 then begin
  // figa.name:='e';
   figa.b.X:=x;figa.b.Y:=y;
   PaintBox1.Repaint;
  end;
end;

end.
Можешь его за основу взять
I'm learning to live...

Последний раз редактировалось Stilet; 10.06.2009 в 09:20.
Stilet вне форума Ответить с цитированием
Старый 10.06.2009, 09:47   #3
mopmuk
Пользователь
 
Регистрация: 06.06.2009
Сообщений: 19
По умолчанию

может я чего то недопонял, но получилось тоже самое что и у меня, попробуйте рисовать белым цветом...

мне весь код уже изменять нельзя, так что Ваш код я использовать не могу.

Последний раз редактировалось Stilet; 10.06.2009 в 10:27.
mopmuk вне форума Ответить с цитированием
Старый 10.06.2009, 10:31   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но получилось тоже самое что и у меня, попробуйте рисовать белым цветом...
Ты избрал тернии. Механизм твоей стратегии не то что не оптимален но и весьмя сложен. Именно поэтому я предложил более простой путь, который специально Дядьки из Борланда упростили.

Я не вижу другого выходя для тебя кроме как при изменении габаритов эллипса (когда ты мышкой двинул) зарисовывать предидущий эллипс цветом фона, а для этого нужно хранить предидущие координаты отрисовки.
Но можешь мне поверить - такая разработка будущего не имеет, если это прихоть твоего преподавателя то учти что в дальнейшем он тебя ничему хорошему не научит, особенно учитывая то что ты рисуя фмгуру затираешь часть уже имеющихся рисункой на канве. Так ни один графический редактор не работает.

Цитата:
Препод сказал, что надо в процедуре MouseMove брать только координаты будущей фигуры
Покажи мой пример преподу, думаю он именно так имел ввиду, а ты просто его недопонял.
I'm learning to live...

Последний раз редактировалось Stilet; 10.06.2009 в 10:34.
Stilet вне форума Ответить с цитированием
Старый 10.06.2009, 16:44   #5
mopmuk
Пользователь
 
Регистрация: 06.06.2009
Сообщений: 19
Хорошо

скорей всего я что-то недопонял, всеравно, большое спасибо за совет
просто я стал писать прогу, мало что зная о делфи...я писал так, как понимал весь алгоритм рисования) извините уж, я только учусь)))
mopmuk вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графический редактор... Alex2009 Мультимедиа в Delphi 12 18.04.2009 23:55
Графический редактор kommunist Общие вопросы .NET 1 13.01.2008 21:57
Графический редактор UnD)eaD)Snake Софт 10 23.07.2007 07:34