有关画线的问题(我感觉超难,各位大侠帮帮忙)

Delphi绘图与交互技术
有关画线的问题(我感觉超难,各位大侠帮帮忙) 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库。很棒的东西

转载于:https://www.cnblogs.com/delphi2007/archive/2008/12/19/1358019.html

### 格式化输入输出 在Python中,格式化输入输出是处理用户输入和展示结果的重要手段。 #### 格式化输入 使用`input()`函数可以从用户那里获取输入。该函数会暂停程序的执行,等待用户输入内容,并将输入的内容作为字符串返回。例如: ```python name = input("请输入人名:") ``` 此代码会提示用户输入人名,并将用户输入的内容存储在变量`name`中。 #### 格式化输出 有多种方式可以实现格式化输出,下面介绍几种常见的方法: ##### `format()`方法 `format()`方法是Python中用于格式化字符串的一种常用方法。它允许在字符串中插入变量的值。例如: ```python print("{}同学,学好Python,前途无量!".format(name)) ``` 在这个例子中,`{}`是占位符,`format()`方法会将`name`变量的值填充到占位符的位置。 ##### f-string(Python 3.6及以上版本支持) f-string是一种更简洁的字符串格式化方式,在字符串前加上`f`或`F`,然后在字符串中使用`{}`包含变量名。例如: ```python print(f"{name}同学,学好Python,前途无量!") ``` 这种方式更加直观,代码也更易读。 ### 截取字符串 在Python中,可以使用切片(slicing)操作来截取字符串的一部分。切片操作通过指定起始索引和结束索引来获取字符串的子串。 #### 基本语法 ```python string[start:stop:step] ``` - `start`:起始索引,截取的子串从该索引开始(包含该索引对应的字符)。如果省略,则默认为0。 - `stop`:结束索引,截取的子串到该索引结束(不包含该索引对应的字符)。如果省略,则默认为字符串的长度。 - `step`:步长,即每隔多少个字符取一个字符。如果省略,则默认为1。 #### 示例 ```python # 截取人名的第一个字符 first_char = name[0] print(f"{first_char}大侠,学好Python,大展拳脚!") # 截取人名的第2到第4个字符(若存在) sub_name = name[1:4] print(f"{sub_name}哥哥,学好Python,人见人爱!") ``` 在上述代码中,`name[0]`获取了字符串`name`的第一个字符,`name[1:4]`获取了从索引1到索引3的子串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值