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

Вниз

рисование мышкой в canvas   Найти похожие ветки 

 
grrr ©   (2006-03-25 23:59) [0]

Подскажите пожалуйста, как создать инструмент наподобие карандаша или кисти из paint, которым можно свободно рисовать в canvas? Просто Canvas.Pixels[X, Y] оставляет пропуски, а нужно чтобы их не было. Зарание спасибо


 
Zeqfreed ©   (2006-03-26 00:37) [1]

Запоминать предыдущие координаты и соединять с новыми линией. Например, вот так:


{. . . }

var
{ . . . }
 downed : Boolean = false;
 oldx, oldy : Integer;

{ . . . }

procedure TForm1.pbMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 downed := true;
 oldx := X;
 oldy := Y;
end;

procedure TForm1.pbMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 downed := false;
end;

procedure TForm1.pbMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if downed then
  with pb.Canvas do begin
   Pen.Color := clNavy;
   Pen.Width := 2;

   MoveTo(oldx, oldy);
   LineTo(X, Y);

   oldx := X;
   oldy := Y;
  end;
end;

{ . . . }


 
sniknik ©   (2006-03-26 01:05) [2]

Zeqfreed ©   (26.03.06 00:37) [1]
попроще

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 with Canvas do begin
   Pen.Color:= clNavy;
   Pen.Width:= 2;
   MoveTo(X, Y);
 end;  
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if ssLeft in Shift then Canvas.LineTo(X, Y);
end;


 
grrr ©   (2006-03-26 04:13) [3]

Спасибо :)


 
grrr ©   (2006-03-26 04:41) [4]

Ещё вопрос, при рисовании с большой Canvas.Pen.Width линия получается неровной, как это можно исправить?


 
sniknik ©   (2006-03-26 11:26) [5]

> как это можно исправить?
меньше пить, чтобы руки не дрожали? ;)

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


 
grrr ©   (2006-03-26 11:56) [6]

не так выразился, не неровной а нечеткой, при толщине линии не равной 1 =)
а в простом граф. редакторе линии нет, только геометрические фигуры


 
ArtemESC ©   (2006-03-26 12:56) [7]

Запомните N последних точек в массиве, и затем
             Canvas.PolyBezierTo(<имя массива>);


 
ArtemESC ©   (2006-03-26 13:20) [8]

Думую вот что тебе нужно...

unit PAint;

interface

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

type
 TForm1 = class(TForm)
   PaintBox1: TPaintBox;
   procedure FormCreate(Sender: TObject);
   procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1  : TForm1;
 Draw   : Boolean;
  arr   : array[1..10] of TPoint;
 Counter: Integer;
 lastX, lastY :Integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Canvas.Pen.Color := clGreen;
Canvas.Pen.Style := psSolid;
Draw    := False;
Counter := 0;
end;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
Draw   := True;
lastX  := X;
lastY  := Y;
Counter:= 0;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
If not Draw then Exit;
If (X <> lastX) or (Y <> lastY) then
Inc(Counter);
If Counter > 10 then
     begin
      Canvas.Polyline(arr);
      Counter  := 1;
      arr[1].X := arr[10].X;
      arr[1].Y := arr[10].Y;
     end else begin
               If (X <> lastX) or (Y <> lastY) then
                 begin
                  arr[Counter].X := X;
                  arr[Counter].Y := Y;
                  lastX := X;
                  lastY := Y;
                 end;
              end;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
Draw := False;
end;

end.


 
ArtemESC ©   (2006-03-26 13:24) [9]

Только везде перед Canvas нужно поставить PaintBox1.


 
sniknik ©   (2006-03-26 13:36) [10]

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

> ArtemESC ©   (26.03.06 13:20) [8]
еще один более сложный способ сделать тоже самое... (а я удивляюсь "и почему программы тормозят?..." ;о))


 
sniknik ©   (2006-03-26 13:39) [11]

кстати еще и с глюком (незаметил сначала), не обрабатывается частичное наполнение массива при выходе (MouseUp), в следствии чего недоотрисовка будет.


 
ArtemESC ©   (2006-03-26 13:40) [12]

sniknik ©   (26.03.06 13:36) [10]
    Ваш код несколько "угловатый", мой - рабочий...


 
sniknik ©   (2006-03-26 13:59) [13]

> Ваш код несколько "угловатый", мой - рабочий...
"угловатость" кода "нерабочестью" не считается (кстати в чем она?) ;о)
а рисует точно то же самое (кроме указаного глюка, и "скачков" с задержкой отрисовки).
а если не видно разницы... зачем платить больше? ;)


 
Рамиль ©   (2006-03-26 14:17) [14]


> ArtemESC ©   (26.03.06 13:40) [12]

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


 
ArtemESC ©   (2006-03-26 22:35) [15]

Рамиль ©   (26.03.06 14:17) [14]
          Сам ты угловатый...



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
10-1116429022
Santrope
2005-05-18 19:10
2006.04.09
Как распечатать Excel документ при помощи PrintDialog ?


2-1143184519
Scavenger
2006-03-24 10:15
2006.04.09
Архив.


2-1143388546
tech
2006-03-26 19:55
2006.04.09
Текстовый файл стал бинарным!


2-1143193076
Eugene5086
2006-03-24 12:37
2006.04.09
как показать модальную MDI-форму?


15-1142588143
LordOfRock
2006-03-17 12:35
2006.04.09
Учебник по Firebird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский