Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

Пунктирная линия   Найти похожие ветки 

 
I m A ©   (2004-12-12 04:48) [0]

как сделать так, чтобы штрихи были одной длины не зависимо от скорости и угла движения мыши... если у кого есть другие идеи... делитесь... :) буду признательна за любую помощь.
var
   Flag: Boolean;
 Pt: TPoint;

{$R *.dfm}

procedure TForm1.imMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
 var i,j:integer;
begin
if Flag then
 begin
  with Im do //im - image
   begin
  canvas.Pen.Width:=1;
  j:=(x+y)mod 8;
if (j>=2) and (j<=4) then begin
Canvas.Brush.Style := bsClear;
canvas.MoveTo(x,y);
   end
else begin
canvas.Brush.Style:=bssolid;
 Canvas.Pen.Style := pssolid;
    Canvas.LineTo(X, Y);
   end;
end;
 end;
end;

procedure TForm1.imMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
 begin
  Flag := True;
  Pt := Point(X, Y);
  with Im do
   begin
//    Canvas.Pen.Color:=clwhite;
     Canvas.MoveTo(X, Y);
   end;
 end;
 end;

procedure TForm1.imMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if Flag then
 begin
  Flag := False;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
form1.DoubleBuffered:=true;
end;

end.


 
Mihey_temporary ©   (2004-12-12 20:09) [1]

Нужно использовать LineDDA и немного математики.


unit mainUnit;

interface

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

type
 TmainForm = class(TForm)
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure FormCreate(Sender: TObject);
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

const
 Dash: Integer = 10;

var
 mainForm: TmainForm;
 lastKey: TPoint;
 DoDash: Boolean;
 DashCasche: TPoint;

procedure DrawPointOfLine(x, y: Integer; lpData: LParam); stdcall;

implementation

{$R *.DFM}

procedure DrawPointOfLine(x, y: Integer; lpData: LParam);
begin
 with TObject(lpData) as TmainForm do begin
   If Round(Sqrt(Sqr(X - lastKey.X) + Sqr(Y - lastKey.Y))) < Dash
     then Exit else
  begin
   if DoDash then
   begin
     Canvas.MoveTo(lastKey.X, lastKey.Y);
     Canvas.LineTo(x, y);
     lastKey := Point(x, y);
     DoDash := False;
   end
    else
     begin
      lastKey := Point(x, y);
      DoDash := True;
     end;
 end;
 end;
end;

procedure TmainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if ssLeft in Shift then
 begin
 // Если в радиусе Dash, то не рисуем
   if Round(Sqrt(Sqr(X - lastKey.X) + Sqr(Y - lastKey.Y))) < Dash then
     Exit else
   begin
     LineDDA(lastKey.X, lastKey.Y, X, Y, @DrawPointOfLine, Integer(Self));
   end;
 end;
end;

procedure TmainForm.FormCreate(Sender: TObject);
begin
 lastKey := Point(-1, -1);
end;

procedure TmainForm.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 lastKey := Point(X, Y);
end;

procedure TmainForm.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 lastKey := Point(-1, -1);
end;

end.


Исходник с откомпилированным проектом:
http://www.hot.ee/mvps15/LineDraw.rar
Скриншот программы в действии:
http://www.hot.ee/mvps15/screen1.png


 
I m A ©   (2004-12-15 01:03) [2]

Большое спасибо, Михаил ;)


 
I m A ©   (2004-12-15 04:17) [3]

Вот только возникла маленькая загвостка :(
я немного модернизировала Ваш код так, чтобы он рисовал на имаджине...
поменяла процедуры и  with TObject(lpData) as TmainForm do begin
на TImage...
но в строке  
if Round(Sqrt(Sqr(X - lastKey.X) + Sqr(Y - lastKey.Y))) < Dash then
     Exit else begin linedda(lastKey.X, lastKey.Y, X, Y, @DrawPointOfLine, Integer(Self));

выдается ошибка
statment expected, but expression of type "TSpeedButton" found

а если не менять Tmainform, то он вообще не рисует...
подскажите, может я что-то где-то упустила :(


 
I m A ©   (2004-12-15 06:20) [4]

разобралась


 
I m A ©   (2004-12-15 06:31) [5]

блин... :(((((
опять та же феня


 
MBo ©   (2004-12-15 07:16) [6]

Ну вот как для TImage можно изменить:

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Image1: TImage;
   procedure FormCreate(Sender: TObject);
   procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

const
 Dash2: Integer = Sqr(10);

var
 Form1: TForm1;
 lastKey: TPoint;
 DoDash: Boolean;
 DashCasche: TPoint;

implementation

{$R *.dfm}

procedure DrawPointOfLine(x, y: Integer; lpData: LParam); stdcall;
begin
 with TImage(lpData) do begin
   if Sqr(X - lastKey.X) + Sqr(Y - lastKey.Y) < Dash2
     then Exit else
   begin
     if DoDash then
     begin
       Canvas.MoveTo(lastKey.X, lastKey.Y);
       Canvas.LineTo(x, y);
       lastKey := Point(x, y);
       DoDash := False;
     end
     else
     begin
       lastKey := Point(x, y);
       DoDash := True;
     end;
   end;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 lastKey := Point(-1, -1);
 DoubleBuffered := True;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if ssLeft in Shift then
 begin
   if (Sqr(X - lastKey.X) + Sqr(Y - lastKey.Y)) < Dash2 then
     Exit else
   begin
     LineDDA(lastKey.X, lastKey.Y, X, Y, @DrawPointOfLine, Integer(Sender));
   end;
 end;

end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 lastKey := Point(X, Y);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 lastKey := Point(-1, -1);
end;

end.




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

Форум: "Media";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.057 c
3-1109679299
я1
2005-03-01 15:14
2005.03.27
IB


1-1110389726
John
2005-03-09 20:35
2005.03.27
Поиск файлов


1-1111029415
Sash
2005-03-17 06:16
2005.03.27
messagedlg


1-1111053708
Ega23
2005-03-17 13:01
2005.03.27
Максимальное кол-во записей в TMemo


9-1104704810
Trip
2005-01-03 01:26
2005.03.27
Потестируйте мой скринсэйвер на GLScene ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский