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

Вниз

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

 
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 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.074 c
3-1109081399
DelphiN!
2005-02-22 17:09
2005.03.27
Базы ФБ. Ошибка Updait Failed


3-1109324020
malefik
2005-02-25 12:33
2005.03.27
Параметры в fibdataset...


6-1106907685
ТехникПТО
2005-01-28 13:21
2005.03.27
OnNewWindow2 в динамически созданном браузере


3-1109232078
Топпер
2005-02-24 11:01
2005.03.27
Log FireBird1.5 SS под Linux


14-1109939062
syte_ser78
2005-03-04 15:24
2005.03.27
Раз уж нельзя о взломе..





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