질문이 맞는지 모르겠습니다.
Canvas에 그림을 그리는데 일반적인 Pixel로 그림을 그리면
선을 그리는데 정확한 위치를 마우스로 찍지 않으면 선이
직선으로 나오지 않는데 이 같은 현상을 어느 범위안에서
클릭을 하면 직선으로 그리게 하고 싶습니다.
위와 같이 하려면 Canvas의 Pixel 를 조정한다던지 아니면
다른 방법을 찾아야 하는데 알고 계신분의 답변 부탁드립니다.
예) 처음 마우스로 클릭한 위치 : 150,145
두번째 마우스로 클릭한 위지 : 152,247
선이 직선으로 나오지 않는데 두번째 값을 범위가 5일 경우
5안에 포함되므로(y축도 동일) 자동적으로 150,245로 자동적으로
수정되어 직선이 되게함..
> 질문이 맞는지 모르겠습니다.
> Canvas에 그림을 그리는데 일반적인 Pixel로 그림을 그리면
> 선을 그리는데 정확한 위치를 마우스로 찍지 않으면 선이
> 직선으로 나오지 않는데 이 같은 현상을 어느 범위안에서
> 클릭을 하면 직선으로 그리게 하고 싶습니다.
>
> 위와 같이 하려면 Canvas의 Pixel 를 조정한다던지 아니면
> 다른 방법을 찾아야 하는데 알고 계신분의 답변 부탁드립니다.
>
> 예) 처음 마우스로 클릭한 위치 : 150,145
> 두번째 마우스로 클릭한 위지 : 152,247
>
> 선이 직선으로 나오지 않는데 두번째 값을 범위가 5일 경우
> 5안에 포함되므로(y축도 동일) 자동적으로 150,245로 자동적으로
> 수정되어 직선이 되게함..
/////////////////////////////////////////////////////////////////////////////
아래소스를 수정해서 사용하시면 마우스 제어나 완전 직각그리기모드등을
하실수있을겁니다.
1.전역변수
StratDot, MoveDot:TPoint;
Drawing:Boolean;
2.마우스이벤트소스
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing := True;
StratDot := Point(X,Y);
MoveDot := Point(x,y);
//초기값 그리기.
canvas.pen.mode := pmNotXor;
canvas.MoveTo(StratDot.x, StratDot.y);
canvas.LineTo(MoveDot.x, MoveDot.y);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
{mouse_event(
MOUSEEVENTF_MOVE or MOUSEEVENTF_ABSOLUTE,
x * 65535 div CliRect.Right,
y * 65535 div CliRect.Left,
0, 0 );}
if drawing then begin
if ABS(StratDot.x - x) <= 5 then begin
//mouse_event(MOUSEEVENTF_MOVE, StratDot.x - x, 0, 0, 0 );
x := StratDot.x;
end;
if ABS(StratDot.y - y) <= 5 then begin
//mouse_event(MOUSEEVENTF_MOVE, 0, StratDot.y - y, 0, 0 );
y := StratDot.y;
end;
canvas.pen.mode := pmNotXor;
canvas.MoveTo(StratDot.x, StratDot.y);
canvas.LineTo(MoveDot.x, MoveDot.y);
canvas.MoveTo(StratDot.x, StratDot.y);
canvas.LineTo(x, y);
end;
MoveDot := Point(x,y);
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
canvas.pen.mode := pmnotXor ;
canvas.MoveTo(StratDot.x, StratDot.y);
canvas.LineTo(MoveDot.x, MoveDot.y);
if ABS(StratDot.x - x) <= 5 then begin
//mouse_event(MOUSEEVENTF_MOVE, StratDot.x - x, 0, 0, 0 );
x := StratDot.x;
end;
if ABS(StratDot.y - y) <= 5 then begin
//mouse_event(MOUSEEVENTF_MOVE, 0, StratDot.y - y, 0, 0 );
y := StratDot.y;
end;
canvas.MoveTo(StratDot.x, StratDot.y);
canvas.LineTo(x, y);
drawing := False;
end;