Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Как сделать "растяжение" фигур (как в paint е)?   Найти похожие ветки 

 
Arsen ©   (2004-04-16 20:36) [0]

Рисую, например, прямоугольник. Нажал мышкой и потащил - прямоугольник прорисовывается за мышкой. На canvas"е. Надо чтоб этот прямоугольник не портил другие фигуры - не оставлял на них точки инверсного цвета. Подскажите пожалуйста!


 
Думкин ©   (2004-04-17 05:06) [1]

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


 
Arsen ©   (2004-04-17 10:48) [2]

Спасибо, нашел.


 
Arsen ©   (2004-04-17 12:07) [3]

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


 
Sanek_metaller ©   (2004-04-17 13:01) [4]

Если Вы имеете ввиду "Растянуть/Наклонить" то попробуйте:поставить свойство Streach (примерно так пишется) :=true и изменяйте Width & Height


 
Думкин ©   (2004-04-17 13:24) [5]

> [3] Arsen ©   (17.04.04 12:07)

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


 
Думкин ©   (2004-04-17 13:30) [6]

И в вопросе медленно -я готов с вами поспорить. Это не может быть "просто медленно" - вопрос в ином. Все в Винде быстро - даже в 95, просто иногда это используют "криво". Удачи.


 
Думкин ©   (2004-04-18 08:16) [7]

Вообще, что касается быстро-медленно. Я как-то на работе писал программу на П-3 и она "графически притормаживала", я взял ее домой на П-166, и повозившись на выходных убрал тормоза на П-166, и соответственно на П-3. И иногда изменив работу с графикой на П-3, я замечал что тормоза уходили и на П-166. Проблема в алгоритмах, зачастую.
Ровно также у меня было и с одной игрой. Там вне графики. Обработку хода я снизил с 50 секунд на П-3 до 1 секунды на П-166.
Это очень интересно, и не надо сразу ругаться на "чьи-то" тормоза - вполне вероятно, что они у вас.


 
Отто фон Бисмарк   (2004-04-18 13:26) [8]

Я сейчас как раз желаю ту же задачу...
только я установил значение PaintBox1.Canvas.Pen.Mode:=pmnotxor;
но тогда пришлось ещё создать процедуру, которая обращает цвета при прорисовки фигуры...
это конечно тоже не выход
есть ещё вариант...
сохранять инфу о каждой нарисованной фигуры в динамичских списках, и на событии MouseMove просто очищать экран, рисовать текущую линию и прорисовывать все остальные фигуры, хранящиеся в списках...


 
Думкин ©   (2004-04-18 14:13) [9]


> [8] Отто фон Бисмарк   (18.04.04 13:26)
> сохранять инфу о каждой нарисованной фигуры в динамичских
> списках, и на событии MouseMove просто очищать экран, рисовать
> текущую линию и прорисовывать все остальные фигуры, хранящиеся
> в списках...

Для TPaintBox - это в корне не верно.


 
Отто фон Бисмарк   (2004-04-18 14:21) [10]

Удалено модератором
Примечание: Задай свой вопрос с своей ветки, никто не ограничевает, а исполдьзовать чужую ветку не стоит


 
Arsen ©   (2004-04-18 16:34) [11]

Как сделать, чтобы при растягивании стиралась последняя нарисованая фигура, т.к. происходит порча картинки под рисуемой фигурой?


 
Думкин ©   (2004-04-18 20:34) [12]

> [11] Arsen ©   (18.04.04 16:34)

Стиралась или нет? Какая порча?
Видимо речь идет о стилях кисти. Почитайте: TBrush.Style+F1.


 
Отто фон Бисмарк   (2004-04-18 21:54) [13]

Arsen..скажи плиз, где лежат зарисовки г-на Думкина...
а то у меня карточка по метрам... мне по архивам шарится слишком разорительно...


 
Думкин ©   (2004-04-19 06:18) [14]

http://delphimaster.net/view/8-1081418501/

Там для рисуемого объекта будет мерцание, на что и указал автор сабжа, но как и писал выше - его вполне можно избежать, принцип довольно прост. Удачи.


 
Отто фон Бисмарк   (2004-04-19 13:23) [15]

Думкин...спасибо за сслыку...
только вот у меня есть несколько иное видине вопроса...

Form1: TForm1;
 xt,yt,xtime,ytime:integer;
 implementation

{$R *.dfm}

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
If ((xt<0) or (yt<0)) then exit;
//--------------------------------
if SB2.Down=true then          //если нажат SpeedButton
begin
If ((xtime<>x) or (ytime<>y)) then
begin
PaintBox1.Canvas.Pen.Mode:=pmnotxor;
PaintBox1.Canvas.Pen.Color:=clred;
PaintBox1.canvas.MoveTo(xt,yt);
PaintBox1.Canvas.LineTo(Xtime,Ytime);
PaintBox1.canvas.MoveTo(xt,yt);
PaintBox1.Canvas.LineTo(X,Y);
xtime:=X;ytime:=Y;
end;
end;
end;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
xt:=x;yt:=y;xtime:=x;ytime:=y;
d:=true;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
xt:=-1;
yt:=-1;
d:=false;
end;

//---------------------------------------

Но здесь есть один большой минус - цвета буду инверсными, по отношению к фону...
Можно добавить к событию
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if SB2.Down=true then begin
PaintBox1.Canvas.Pen.Mode:=pmcopy;
PaintBox1.canvas.Pen.Color:=clred;
PaintBox1.canvas.MoveTo(xt,yt);
PaintBox1.Canvas.LineTo(X,Y);
end;
xt:=-1;
yt:=-1;
d:=false;
end;
//-------------------------------
Тогда при отпускании кнопки, линия окажется нарисованной правильным цветом, однако в процессе прорисовки, пока линия тянется за курсором, цвет её будет инверсным по отношению к фону...
Я долго думал, как от этого избавиться, но не нашёл ничего лучше, чем создать процедуру, которая бы делала цвет в момент прорисовки инверсным заданному..т.е. отображался бы нормальный цвет. Но это можно сделать лишь для 10 цветов..и то - геморой ещё тот. Если кто знает как проще - скажите!


 
Думкин ©   (2004-04-19 13:32) [16]

Можно так:

unit uMain;

interface

type
 TfMain = class(TForm)
   pbMain : TPaintBox;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure pbMainMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure pbMainMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
   x1,x2 : TPoint;
   inDraw : boolean;
   bmS, bmD : TBitMap;
   procedure WMPaint (var Message: TWMPaint); message WM_Paint;
 public
   { Public declarations }
 end;

var
 fMain: TfMain;

implementation

{$R *.dfm}

procedure TfMain.FormCreate(Sender: TObject);
begin
    bmS         := TBitMap.Create;
    bmS.Width   := pbMain.Width;
    bmS.Height  := pbMain.Height;
    bmS.Canvas.Pen.Color   := clRed;
    bmS.Canvas.Brush.Color := clYellow;
    bmS.Canvas.FloodFill( 1, 1, clWhite, fsSurface);
    bmS.Canvas.Brush.Style := bsClear;

    bmD         := TBitMap.Create;
    bmD.Width   := pbMain.Width;
    bmD.Height  := pbMain.Height;
    bmD.Canvas.Pen.Mode := pmNotXor;
    bmD.Canvas.Pen.Color := clBlue;
    bmD.Canvas.Pen.Style := psDot;
    bmD.Canvas.Brush.Style := bsClear;

    inDraw := false
end;

procedure TfMain.FormDestroy(Sender: TObject);
begin
    bmS.Free;
    bmD.Free
end;

procedure TfMain.WMPaint;
begin
    BitBlt(bmD.Canvas.Handle,
           0, 0, bmD.Width, bmD.Height,
           bmS.Canvas.Handle,
           0, 0, SRCCOPY);
    if inDraw then
    begin
      x2 := pbMain.ScreenToClient(Mouse.CursorPos);
      bmD.Canvas.Rectangle(Rect(x1.X,x1.Y,x2.X,x2.Y))
    end;
    BitBlt(pbMain.Canvas.Handle,
           0, 0, pbMain.Width, pbMain.Height,
           bmD.Canvas.Handle,
           0, 0, SRCCOPY);
end;

procedure TfMain.pbMainMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
    inDraw := true;
    x1 := pbMain.ScreenToClient(Mouse.CursorPos)
end;

procedure TfMain.pbMainMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
    inDraw := false;
    x2 := pbMain.ScreenToClient(Mouse.CursorPos);
    bmS.Canvas.Rectangle(Rect(x1.X,x1.Y,x2.X,x2.Y))
end;



А вообще в Демках идущих с дельфи - есть пример.


 
Arsen ©   (2004-04-19 18:05) [17]

Думкин, Отто фон Бисмарк - спасибо! На основе Вашего текста и текста Отто фон Бисмарка сделал свою рисовалку. Работает.


 
Lenor   (2004-05-17 15:34) [18]

Есть вариант -- на mouse up чего-то, на чем ты рисуешь, пиши Image.Canvas.Pen.mode:=pmcopy;

на mouse down
image.canvas.Pen.mode:=pmnotxor;

И все прекрасно работает.


 
SNV-Soft   (2004-07-23 18:14) [19]

а мне посоветовали ExtLib...если прямоугольники
двигать надо!!!



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.022 c
4-1095284915
Wind
2004-09-16 01:48
2004.10.17
Буфер обмена


1-1096808711
M-Alex
2004-10-03 17:05
2004.10.17
Почему это не работает?


9-1087222996
Uncle Archi
2004-06-14 18:23
2004.10.17
OpenGL


3-1094742606
senya
2004-09-09 19:10
2004.10.17
Как подсчитать количество соединений к БД?


3-1095404198
gonzales
2004-09-17 10:56
2004.10.17
Too many open tables