begin Path 和 EndPath 必须要用在一个过程里吗?(50分)

  • 主题发起人 主题发起人 xifengge
  • 开始时间 开始时间
X

xifengge

Unregistered / Unconfirmed
GUEST, unregistred user!
我想利用BeginPath 和 EndPath 记录鼠标轨迹,在MouseUp事件时将画的线封闭并填充,这两个API用在一个过程里倒是可以的,但是下面这样写为什么就不能填充啊?<br><br>procedure TForm6.FormMouseDown(Sender: TObject; Button: TMouseButton;<br>&nbsp; Shift: TShiftState; X, Y: Integer);<br>begin<br>&nbsp; Canvas.Pen.Color := clGreen;<br>&nbsp; Canvas.Brush.Color := clRed;<br>&nbsp; BeginPath(Canvas.Handle);<br>&nbsp; Canvas.MoveTo(X ,Y);<br>end;<br><br>procedure TForm6.FormMouseMove(Sender: TObject; Shift: TShiftState; X,<br>&nbsp; Y: Integer);<br>begin<br>&nbsp; Canvas.LineTo(X, Y);<br>end;<br><br>procedure TForm6.FormMouseUp(Sender: TObject; Button: TMouseButton;<br>&nbsp; Shift: TShiftState; X, Y: Integer);<br>begin<br>&nbsp; CloseFigure(Canvas.Handle);<br>&nbsp; EndPath(Canvas.Handle);<br>&nbsp; StrokeAndFillPath(Canvas.Handle);<br>end;
 
你说呢?<br><br>[:(]
 
楼上的,我无语了...[:(]
 
这么说吧,Windows最先的程序是需要完全使用sdk 也就是说的api来做;<br>里面有一个概念叫做DC (Device Content) ---设备上下文,简单说就一个资源,比如你要画一个路径,就要用到显示器的 dc ,这个资源是系统里面很紧张的,有个要求是必须用了立即释放,否则导致占用资源,别的过程无法使用;而Delphi的canvas (画布)其实是对这个dc的封装(换了种代码编写形式) 但是规矩仍然没有变。所以你必须将这二者放一个过程里面。按你的要求,可能需要一个timer 定时,取得鼠标的位置,放数组里面,然后在mouseup里面画,而且支持redraw.
 
多谢bsense啦[:D]
 
后退
顶部