画直线时用户只有在松开鼠标才能看见直线对直线的变化不能进行实时观测这是因为鼠标移动时程序没有进行某种应Delphi定义了OnMouseMove事件来响应鼠标移动以下代码可使用户随时观测直线的变化
procedure TFormFormMouseMove(Sender:Tobject)
begin
Drowto(XY)
Moveto(origin)
end
origin是起始点
绘图功能的实现
绘图软件常根据用户的要求改变绘图工具Graphexdpr例程中当用户按下某个按钮时可选择绘图工具中的画笔或画刷在程序类型说明部分定义了五种绘图工具
type
TDrawingTool = (dtLinedtRectangledtEllipsdtRoundRectdtPolygon)
当选中某种按钮则选中了相应的绘图工具如
procedure TFormLineButtonClick(Sender: TObject)
begin
DrawingTool := dtLine;
end;
procedure TFormRectangleButtonClick(Sender: TObject)
begin
DrawingTool := dtRectangle;
end;
procedure TFormEllipseButtonClick(Sender: TObject)
begin
DrawingTool := dtEllipse;
end;
procedure TFormRoundRectButtonClick(Sender: TObject)
begin
DrawingTool := dtRoundRect;
end;
procedure TFormPolygonButtonClick(Sender: TObject)
begin
DrawingTool :=dtPolygon;
end;
DrawShape过程定义了每种绘图工具的动作
procedure TFormDrawShape(TopLeft BottomRight: TPoint; AMode: TPenMode)
begin
with ImageCanvas do
begin
PenMode := AMode;
case DrawingTool of
dtLine: begin
MoveTo(TopLeftX TopLeftY)
LineTo(BottomRightX BottomRightY)
end;
dtRectangle: Rectangle(TopLeftX TopLeftY BottomRightX BottomRightY)
dtEllipse: Ellipse(TopLeftX TopLeftY BottomRightX BottomRightY)
dtRoundRect: RoundRect(TopLeftX TopLeftY BottomRightX BottomRightY
(TopLeftX BottomRightX) div (TopLeftY BottomRightY) div )
dtPolygon:Polygon([Point()TopLeftBottomRight]) end;
end;
end;
程序刚运行时只有一个工具栏当用户单击画笔和画刷时则出现相应的工具栏其代码如下
procedure TFormPenButtonClick(Sender: TObject)
begin
PenBarVisible := PenButtonDown;
end;
procedure TFormBrushButtonClick(Sender: TObject)
begin
BrushBarVisible := BrushButtonDown;
end;
在设计绘图程序时还要解决一些问题如为了在鼠标移动时能观测图形的变化我们定义了OnMouseMove事件但会出现这样的现象当鼠标进入绘图区时用户未按下鼠标键画布上却出现绘制的图形这是我们不希望看到的其原因是没有对鼠标按钮是否按下进行判断因此在窗体对象中定义了drawing的域当鼠标按钮按下时drawing 设置成真值只有drawing为真鼠标移动才执行绘图功能当鼠标键松开时drawing设置成假鼠标移动将不执行绘图动作
[] [] []