Q&A

  • Canvas의 Pixel 조정가능한가요 ?
질문이 맞는지 모르겠습니다.

Canvas에 그림을 그리는데 일반적인 Pixel로 그림을 그리면

선을 그리는데 정확한 위치를 마우스로 찍지 않으면 선이

직선으로 나오지 않는데 이 같은 현상을 어느 범위안에서

클릭을 하면 직선으로 그리게 하고 싶습니다.



위와 같이 하려면 Canvas의 Pixel 를 조정한다던지 아니면

다른 방법을 찾아야 하는데 알고 계신분의 답변 부탁드립니다.



예) 처음 마우스로 클릭한 위치 : 150,145

두번째 마우스로 클릭한 위지 : 152,247



선이 직선으로 나오지 않는데 두번째 값을 범위가 5일 경우

5안에 포함되므로(y축도 동일) 자동적으로 150,245로 자동적으로

수정되어 직선이 되게함..



1  COMMENTS
  • Profile
    홍성락 2001.09.25 23:23
    초보 wrote:

    > 질문이 맞는지 모르겠습니다.

    > 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;