您的位置:首页 > 其它

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

2008-12-19 09:58 495 查看
有关画线的问题(我感觉超难,各位大侠帮帮忙) 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库。很棒的东西
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: