delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
有关画线的问题(我感觉超难,各位大侠帮帮忙) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiMultimedia/html/delphi_20061022153520214.html
我的程序是这样的:选择了矩形框菜单命令按钮,然后鼠标左键按下并拖动鼠标,则实时显出矩形框的样子(在mousemove能够实时看到当前的矩形框),然后在松开鼠标左键时才最终画好确定大小的矩形。然后可以点击选中刚才所画的控件,可以进行拖拉、缩放大小等操作,该怎么做?大家能提供思路吗?急

呵呵,我正做这方面东东,明天加我:276605216

我也在做,我的QQ:66455150,但至今没有好办法。只能找现成控件。

我有一份功能类似的源代码,可选中,移动所画的图形,等一些操作。  
  下载地址http://disk.zzlygo.com/?YYhlm  
  下载“类cad绘图源码.rar”即可

我已经差不多可以搞定了,现在遇到一个问题就是,画线段时不知道怎么控制可以画的直,不知道该怎么办

应该不复杂。  
  既然你自己已经搞定,我就不多说什么了。  
   
   
  画线段时不知道怎么控制可以画的直?啥意思?  
 

思路:  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs;  
   
  type  
      TForm1   =   class(TForm)  
          procedure   FormMouseDown(Sender:   TObject;   Button:   TMouseButton;  
              Shift:   TShiftState;   X,   Y:   Integer);  
          procedure   FormMouseMove(Sender:   TObject;   Shift:   TShiftState;   X,  
              Y:   Integer);  
          procedure   FormMouseUp(Sender:   TObject;   Button:   TMouseButton;  
              Shift:   TShiftState;   X,   Y:   Integer);  
      private  
          {   Private   declarations   }  
          Drawing:   Boolean;  
          MouseOrg:   TPoint;  
          NextPoint:   TPoint;  
          LastDot:   TPoint;  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.FormMouseDown(Sender:   TObject;   Button:   TMouseButton;  
      Shift:   TShiftState;   X,   Y:   Integer);  
  begin  
      Drawing   :=   True;  
      MouseOrg   :=   Point(X,   Y);  
      NextPoint   :=   MouseOrg;  
      LastDot   :=   NextPoint;  
      Canvas.MoveTo(X,   Y);  
  end;  
   
  procedure   TForm1.FormMouseMove(Sender:   TObject;   Shift:   TShiftState;   X,  
      Y:   Integer);  
  begin  
      if   Drawing   then  
      begin  
          Canvas.Brush.Style   :=   bsClear;  
          Canvas.Pen.Mode   :=   pmNotXor;  
          Canvas.Pen.Style   :=   psDash;  
          Canvas.Rectangle(MouseOrg.X,   MouseOrg.Y,   NextPoint.X,   NextPoint.Y);  
          NextPoint   :=   Point(X,   Y);  
          Canvas.Rectangle(MouseOrg.X,   MouseOrg.Y,   NextPoint.X,   NextPoint.Y);  
      end;  
  end;  
   
  procedure   TForm1.FormMouseUp(Sender:   TObject;   Button:   TMouseButton;  
      Shift:   TShiftState;   X,   Y:   Integer);  
  begin  
      if   Drawing   then  
      begin  
          Canvas.Pen.Mode   :=   pmCopy;  
          Canvas.Pen.Style   :=   psSolid;  
          Canvas.Rectangle(MouseOrg.X,   MouseOrg.Y,   X,   Y);  
          Drawing   :=   False;  
      end;  
  end;  
   
  end.  
 

上面没有实现重新选择后拖拉和缩放,应该也不难,只要判断鼠标点在已经存在的矩形的地方重新拖拉就行了,如在四角附近,整体进行缩放,在四边中心附近,单边缩放等.  
 

to   litangel(还是朋友)    
  使用lineto进行画线段时,画的线段不直,有稍微歪曲扭曲的情况,不知道怎么解决,另外线段的选取也很麻烦

UP

////画的线段不直,有稍微歪曲扭曲的情况。  
   
  不会吧?画直线与线段,都是用这个,没有问题的。  
   
  线段的选取,你判断当前鼠标的点到线段的距离,如果小于一个你设定的数值,就选中。

楼主可能指的是斜线的锯齿.  
 

这个问题在Borland提供Delphi第一个版本(Version1)开始,就有完整的例子了!!!  
  请查一下DelphiX的demo\doc目录下的graphex工程。  
   
 

如果要点击来选中所画的矩形进行移动或擦去,其他都不动,那么你  
  需要为每个新画矩形动态地开辟一个独立的Image组件才行!!!  
 

"用lineto进行画线段时,画的线段不直,有稍微歪曲扭曲的情况,不知道怎么解决"  
   
  这是在显示器上,利用一个一个象素连成的直线的通病,不可能有彻底的解决方法.  
   
  利用"去锯齿"法可以使线条梢好看点.但用"去锯齿"法作出的直线必须有较大线宽.  
   
  另外,提高显示分辨率,也可以使线条的"锯齿"状看起来不那么明显.  
   
 

to   zzwu(未名):  
  但是我看到在用windows的画笔时,他有一个功能,就是按住shift键,就可以保证你每次拖拉的线条都是直线,没有锯齿,这个是怎么做的?大家有什么思路没有?

shift是不能画任意角度直线的,只能是按照45度角的倍数来画

建议直接   学习gdi+的   函数.

这个也简单:查一下的shift是否按下状态,  
   
  如果shift按下,则  
  查deltaY=abs(y2-y1)与   deltaX=   abs(x2-x1)的比值,  
  如果>1,则实际画的线是垂线,否则画水平线。  
   
  如果shift未按下,则  
  直接连接(x1,y1)、(x2,y2)两点。  
 

推荐Graphic32库。很棒的东西

posted on 2008-12-19 10:01 delphi2007 阅读(242) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。