自己见到了和讯首页登入背景和万般的地球人写的博客,开掘了个美观的功用。

本文重要讲三个在绘图中,大家会有多少个基础的控件,Line。控件的中坚使用和她能做出的大家比非常多时候需求的分界面。

10.2  图 形 设 计
       Windows是叁个依据图形客户分界面包车型大巴操作系统。

图片 1

<!–more–>

    若要在窗口上制图,需求调用Windows 提供的应用程序接口(Application
Program Interface,API),还要申请和敬爱句柄等能源。

那么作者来报告我们哪些做这么些意义。

尽管是三个简便控件,不过足以做出很漂亮妙的很为难的UI。

   
Delphi将那总体都封装在TCanvas类中,通过设置TCanvas类中的属性,调用个中的艺术,就足以兑现画图成效。

首先步是在 Canvas 画点,第二步是让点运动,第三步是画线

首先,大家要清楚,Line正是画直线。当然咱们画他日常是在Canvas中。

10.2.1  Canvas画布对象
      
即使在别的组件上都得以绘制图形,但鉴于过多零部件上都有标题之类的文字,所以普通在窗体或面板之类的器皿上制图图形。

在 Canvas 画一个点

咱俩画点可以运用 Ellipse 大家给她宽和高,Fill,就足以画出来。供给加在
Canvas ,能够行使canvas.Children.Add(ellipse)

Canvas 一开首的分寸是 0 ,须求一同来给他三个丰富大的值

<Canvas x:Name="P" Width="1000" Height="1000"/>

于是给他贰个极大的值,超过外面包车型大巴Grid就不显得。

加多 贰个 Ellipse 就能够显得,可以未有一些名在哪彰显,约等于显示的 X 和 Y。

大家先在二个页面新建一下,写下必备的代码。

      
譬如,最常用的美术容器为Form和Paint博克斯。那些器皿的空域区域称为画布(Canvas),使用画布类TCanvas的法子可在画布上绘制直线、弧线、矩形或圆形等种种图片。

点名增加到 Canvas 的 Element 的地方

大家可以通过多少个办法改动控件的地点,在自己此前写的拖动控件博客有谈到。

前几日使用 Canvas,能够应用 Canvas 有的贰个办法。

比方有三个 X 和 Y 要安装在控件,那么能够行使

                Canvas.SetLeft(control, X);
                Canvas.SetTop(control, Y);

注意,Canvas 是类。

本条形式可以运动控件。

自个儿就是用他移动点。

       <Grid Margin="10,10,10,10">

            <Canvas>



            </Canvas>

        </Grid>

         
Canvas是TCanvas类的三个体系定义对象,称为画布对象,平常作为其余控件的四个性质出现,不独立选拔。每一种控件都有Canvas属性。举例,使用Form的Canvas属性就能够在窗体的工作区内绘图。由于Canvas是运作时属性,在程序运营时技巧博得,所以必得写程序来产生安装。

随便移动点

自作者首先写三个类,Staf。包涵呈现的 Point 和她的
X,Y,七个样子移动速度。还恐怕有移动多长期,超越了能够移动的时辰,就即兴给新活动速度。

    public class Staf
    {
        public UIElement Point { set; get; }

        public double X { set; get; }

        public double Y { set; get; }

        public double Vx { set; get; }

        public double Vy { set; get; }

        public void RandomStaf(Random ran)
        {
            var staf = this;
            _ran = ran;
            staf.Vx = (double)ran.Next(-1000, 1000) / 1000;
            staf.Vy = (double)ran.Next(-1000, 1000) / 1000;
            staf.Time = ran.Next(100);
        }
        private Random _ran;
        public int Time
        {
            set
            {
                _time = value;
                if (value == 0)
                {
                    RandomStaf(_ran);
                }
            }
            get
            {
                return _time;
            }
        }

        private int _time;
    }

先是大家要求分明直线坐标,用X1X2,Y1Y2来收获八个点,也便是直线。

 

画线

使用两重 foreach
,获得八个点之间距离,即便离开小于笔者给的二个值,那么正是能够连线

这正是说距离长的就把连线的增长幅度变短。

这几个做法很轻巧,能够使用 StrokeThickness 设置线宽度。

line.StrokeThickness=最大宽度 * (最大距离-距离)/最大距离

线必要多少个点能够规定?那些自个儿就不说啊,明显了多个点是足以连线,于是利用就能够设置线的点。必要领悟,点的X和Y是左上角,须要丰硕画的图样的值才是连在点,否则看起来不是连在点。

 <Line X1="0" X2="200" Y1="10" Y2="200"></Line>

Canvas的要紧质量有Pen、Brush、Pixels、PenPos等,用于定义绘制图形的作风。

自行移动

能够选拔 DispatcherTimer ,过 0.1 s就移动点和画线。

        public MainPage()
        {
            this.InitializeComponent();
            _time = new DispatcherTimer();
            _time.Interval = TimeSpan.FromTicks(500);
            _time.Tick += Time_Tick;            
            _time.Start();
        }

private DispatcherTimer _time

Time_Tick就写移动点和线的代码

有了直线,能够在设计来看一条线,可是运转是不曾观看的,因为大家并未有给线大小。

1.Pen画笔
Pen画笔用于调控线条的颜色、形式、风格及拉长率。

总体代码

<Page
    x:Class="Bsgame.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Bsgame"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Canvas x:Name="P" Width="1000" Height="1000">

        </Canvas>
        <Canvas x:Name="Pw" Width="1000" Height="1000"></Canvas>
    </Grid>
</Page>


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Animation;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Xaml.Shapes;

namespace Bsgame
{
    /// <summary>
    /// 可用于自身或导航至 Frame 内部的空白页。
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            _time = new DispatcherTimer();
            _time.Interval = TimeSpan.FromTicks(500);
            _time.Tick += Time_Tick;
            RandomStaf();
            _time.Start();
            _width = Window.Current.Bounds.Width;
            _height = Window.Current.Bounds.Height;//lindexi
        }

        private void RandomStaf()
        {
            const int count = 20;

            for (int i = 0; i < count; i++)
            {
                Staf staf = new Staf();
                staf.X = ran.Next((int)_width);
                staf.Y = ran.Next((int)_height);
                staf.Point = new Ellipse()
                {
                    Height = 10,
                    Width = 10,
                    Fill = new SolidColorBrush(Colors.Gray),
                };
                staf.RandomStaf(ran);
                // CSDN
                _staf.Add(staf);
            }

            foreach (var temp in _staf)
            {
                P.Children.Add(temp.Point);
                //lindexi
            }
        }

        private List<Staf> _staf = new List<Staf>();

        private double _width;
        private double _height;

        private void Time_Tick(object sender, object e)
        {
            foreach (var temp in _staf)
            {
                if (temp.X > _width || temp.Y > _height
                    || temp.X < 0 || temp.Y < 0)
                {
                    temp.X = ran.Next((int)_width);
                    temp.Y = ran.Next((int)_height);
                }//lindexi.oschina.io

                temp.X -= temp.Vx;
                temp.Y -= temp.Vy;

                Canvas.SetLeft(temp.Point, temp.X);
                Canvas.SetTop(temp.Point, temp.Y);

                temp.Time--;
            }
            const double distan = 200;
            Pw.Children.Clear();
            Line line = new Line();
            foreach (var temp in _staf)
            {
                foreach (var p in _staf)
                {
                    line.X1 = temp.X + 5;
                    line.Y1 = temp.Y + 5;
                    line.X2 = p.X + 5;
                    line.Y2 = p.Y + 5;
                    double sqrt = Math.Sqrt(Math.Pow((line.X1 - line.X2), 2) +
                      Math.Pow((line.Y1 - line.Y2), 2));
                    if (sqrt < distan)
                    {
                        line.Stroke = new SolidColorBrush(Colors.Gray);
                        line.StrokeThickness = 5* (distan- sqrt) /distan;
                        Pw.Children.Add(line);
                        line = new Line();
                    }
                }
            }
        }

        private Random ran = new Random();

        private DispatcherTimer _time;
    }

    public class Staf
    {
        public UIElement Point { set; get; }

        public double X { set; get; }

        public double Y { set; get; }

        public double Vx { set; get; }

        public double Vy { set; get; }

        public void RandomStaf(Random ran)
        {
            var staf = this;
            _ran = ran;
            staf.Vx = (double)ran.Next(-1000, 1000) / 1000;
            staf.Vy = (double)ran.Next(-1000, 1000) / 1000;
            staf.Time = ran.Next(100);
        }
        private Random _ran;
        public int Time
        {
            set
            {
                _time = value;
                if (value == 0)
                {
                    RandomStaf(_ran);
                }
            }
            get
            {
                return _time;
            }
        }

        private int _time;
    }
}

能够看来品质比较糟糕,于是把连线去掉,展现点不展现三番两次

        private void RandomStaf(object sender, object e)
        {
            Storyboard board = new Storyboard();
            board.Duration = new Duration(TimeSpan.FromSeconds(1));
            board.Completed += RandomStaf;
            DoubleAnimationUsingKeyFrames animation;
            foreach (var temp in _staf)
            {
                double f = temp.X;

                temp.X += temp.Vx * 10;
                if (temp.X > _width - 100)
                {
                    temp.X = _width - 100;
                }
                else if (temp.X < 0)
                {
                    temp.X = 0;
                }



                animation = EllPoile(f, temp.X);
                Storyboard.SetTarget(animation, temp.Point);
                Storyboard.SetTargetProperty(animation, "(Canvas.Left)");
                board.Children.Add(animation);

                f = temp.Y;
                temp.Y += temp.Vy * 10;

                if (temp.Y > _height - 100)
                {
                    temp.Y = _height - 100;
                }
                else if (temp.Y < 0)
                {
                    temp.Y = 0;
                }

                animation = EllPoile(f, temp.Y);
                Storyboard.SetTarget(animation, temp.Point);
                Storyboard.SetTargetProperty(animation, "(Canvas.Top)");

                if (temp.X >= _width - 100 || temp.Y >= _height - 100
                      || temp.X <= 0 || temp.Y <= 0)
                {
                    temp.X = ran.Next((int)_width);
                    temp.Y = ran.Next((int)_height);
                }
                board.Children.Add(animation);
                temp.Time -= 10;

                animation = EllPoile(10, 15);
                Storyboard.SetTarget(animation, temp.Point);
                Storyboard.SetTargetProperty(animation, "Height");
                board.Children.Add(animation);

                animation = EllPoile(10, 15);
                Storyboard.SetTarget(animation, temp.Point);
                Storyboard.SetTargetProperty(animation, "Width");
                board.Children.Add(animation);

                animation = new DoubleAnimationUsingKeyFrames();
                EasingDoubleKeyFrame frame = new EasingDoubleKeyFrame();
                frame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
                frame.Value = 0;
                animation.KeyFrames.Add(frame);

                frame = new EasingDoubleKeyFrame();
                frame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5));
                frame.Value = 180;
                animation.KeyFrames.Add(frame);

                frame = new EasingDoubleKeyFrame();
                frame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1));
                frame.Value = 0;
                animation.KeyFrames.Add(frame);
                Storyboard.SetTarget(animation, temp.Point.RenderTransform);
                Storyboard.SetTargetProperty(animation, "(CompositeTransform.Rotation)");
                board.Children.Add(animation);

            }
            board.Begin();

        }

图片 2
本小说使用文化分享具名-非商业性利用-一样方法分享 4.0
国际许可左券
开展许可。迎接转发、使用、重新发表,但必需保留作品签字林德熙(包蕴链接:http://blog.csdn.net/lindexi_gd
),不得用于生意指标,基于本文修改后的文章必得以同样的准予发表。如有任何疑窦,请与小编联系

图片 3

Pen的品类为TPen类,属性有Color、Mode、Style及Width。

Stroke正是线条设置颜色或用别的渐变填充,StrokeThickness正是线段的大小

·   Color属性:调节线条的颜色。

大家写上Stroke="Black" StrokeThickness="5"

·   Mode属性:调整线条的形式,取值见表10-2。

图片 4

表10-2 Canvas.Pen.Mode属性取值

借使大家把大小写为50,那么就能见到很倒霉看


 含   义
 
pmBlack
 总为紫水晶色
 
pmWhite
 总为藕灰
 
pmNop
 不改变
 
pmNot
 画布背景的相反色
 
pmCopy
 用Color属性钦命的画笔颜料
 
pmNotCopy
 画笔颜色的相反色
 
pmMerge
 画笔颜色与画布背景象的合成颜色
 
pmXor
 画笔颜色与画布背景象的异或合成颜色
 
pmNotXor
 pmXor的相反色
 

图片 5

·   Style属性:调控线条的风格,包罗实线、虚线和点划线等,取值见表10-3。

于是乎大家想要裁剪他,裁剪能够用Clip

表10-3 Canvas.Pen.Style属性取值

我们用矩形来裁剪他。


 含   义
 值
 含   义
 
psSolid
 实线
 psDashDotDot
 两点一划线
 
psDash
 短划线
 psClear
 不划线,经常用于破除概况线
 
psDot
 点线
 psInsideFrame
 实线,Width属性大于1时
 
psDashDot
 点划线
 
 
 

矩形必要四个点。

·   Width属性:调控线条的小幅度。

能够看看线段裁剪了

Width属性的值为整型,若是所给的值紧跟于1,则按1甩卖。注意,Width属性值会影响Style属性值,当Width属性值不是1时,Style属性值不可能是PsDash或PsDashDot。     
举个例子:

图片 6

  Form1.Canvas.Pen.Color:=clRed;        //设置线条颜色为墨绿

被贰个轻重缓急为150的矩形裁剪了

  Form1.Canvas.Pen.Style:=psDashDot;     //设置线风格为点划线

图片 7

  Form1.Canvas.Pen.Width:=1;                //设置线宽度为1,即细线

接着便是ms-uap 写的 http://www.cnblogs.com/ms-uap/p/4641419.html

 

大家给她一个StrokeDashArray,那么些值便是很很多,奇数的数就是显示上升的幅度,偶数的正是不显得的宽度,读到最后的数就循环到最前。大家设置二个0.1三个0.2就能够展现0.1的幅度,然后空0.2再展现0.1

2.Brush刷子
Brush刷子用于显著图形填充的颜色及填充情势。

               <Line X1="0" X2="200" Y1="10" Y2="200"

                      Stroke="Black" StrokeThickness="50"

                      StrokeDashArray="0.1 0.2">

                    <Line.Clip>

                        <RectangleGeometry Rect="0 0 150 150"></RectangleGeometry>

                    </Line.Clip>

                </Line>

Brush类型为TBrush类,属性有Color、Style。

图片 8

·   Color属性:鲜明图形的填充颜色。

亟需知道,0.1的幅度是0.1*StrokeThickness的宽度

·   Style属性:分明图形的填写格局,取值见表10-4。

小编们把宽度大片段

例如:

图片 9

Form1.Canvas.Brush.Color:=clRed;         //设置填充色为革命

然后加个线条,就足以做出ms-uap写的图

Form1.Canvas.Brush.Style:=bsSolid;      //设置填充方式为实填充

咱俩还足以设置线段的开首图形,要精晓,大家线段画极大,那么看起来正是矩形,StrokeStartLineCap就能够让线段看起来雅观

日常情状下,Brush为矩形、圆或多边形提供内部的填充色和填充图案,还为文本提供背景观,但它不影响线条的颜色和文书的前景观。

StrokeStartLineCap="Round"

表10-4 Canvas.Brush.Style属性取值

图片 10

取   值
 含    义
 取   值
 含    义
 
bsSolid
 实填充
 bsCross
 十字交叉线填充
 
bsClear
 不填充
 bsDiagCross
 交叉线填充
 
bsBDiagonal
 右斜线填充
 bsHorizontal
 水平线填充
 
bsFDiagonal
 左斜线填充
 bsVertical
 垂直线填充
 

StrokeStartLineCap="Triangle"

3.Pixels像素
Pixels属性用于存款和储蓄Canvas中各样像素点的颜色值。定义如下:

图片 11

property Pixels(x,y;integer):TColor;

线条五头尖的画法正是在装置前边的StrokeEndLineCap

      
Pixels是多个二维数组,下标表示某像素点在显示屏地方的坐标,成分类型是TColor。三个绘制进程实际上就是改换画布上关于像素点颜色的长河,进而在视觉效果上赢得一幅特定的图。比如:

图片 12
本作品使用知识分享签名-非商业性利用-一样格局分享 4.0
国际许可公约
张开许可。应接转发、使用、重新公布,但不可能不保留作品签名林德熙(包罗链接:http://blog.csdn.net/lindexi_gd
),不得用于商业目标,基于本文修改后的著述必得以一样的许可发表。如有任何疑窦,请与自个儿联系

Form1.Canvas.Pixels[100,200]:=clYellow;      //将窗口内的少数涂东京中黄

<script type=”text/javascript”> $(function () { $(‘pre.prettyprint
code’).each(function () { var lines =
$(this).text().split(‘\n’).length; var $numbering =
$(‘<ul/>’).addClass(‘pre-numbering’).hide();
$(this).addClass(‘has-numbering’).parent().append($numbering); for (i =
1; i <= lines; i++) { $numbering.append($(‘<li/>’).text(i)); };
$numbering.fadeIn(1700); }); }); </script>

反过来说,读取Pixels数组的因素值则可收获相应坐标点的颜色值。

4.PenPos画笔地方
PenPos属性表示近些日子画笔的职位,类型为TPoint。举个例子:

i:=Form1.Canvas.PenPos.x;                      //拿到当前画笔地点

j:=Form1.Canvas.PenPos.y;

10.2.2  绘图方法
TCanvas类提供八种用以绘图和文字输出的不二等秘书籍。

1.绘制的坐标种类
    在组件上制图的坐标种类与显示屏、窗口一样。

   
水平方向是X轴,垂直方向是Y轴,左上角初阶点坐标是(0,0),区域内任性一点的坐标用(x,y)
表示,右下角点的坐标值决议于显示器分辨率,比方,显示器分辨率为800×600,则右下角点的坐标为(799,599)。

2.制图直线
      MoveTo(x,y)将画笔当前地方设置到点(x,y)
处。画笔当前岗位在PenPos属性中,退换画笔当前岗位运用MoveTo方法,而毫不设法退换PenPos的值。

     LineTo(x,y)从脚下岗位至(x,y) 点画一条线,并把画笔当前地点移至(x,y)
处。所绘直线具有已定义Pen画笔的各式质量。比方:

Canvas.MoveTo(x1,y1);    //定位(x1,y1)

Canvas.LineTo(x2,y2);    //在(x1,y1)和(x2,y2)之间画线

3.制图矩形
     Rectangle方法用当下的Pen和Brush属性绘制叁个矩形,评释如下:

procedure Rectangle(x1,y1,x2,y2:integer);

中间,(x1,y1) 和(x2,y2) 分别表示矩形左上角和右下角两点坐标。若|x2 –
x1|=|y2 – y1|,则该矩造成为长方形。

4.制图椭圆
      Ellipse方法在钦定的矩形内画贰个椭圆,评释如下:

procedure Ellipse(x1,y1,x2,y2:integer);

内部,(x1,y1) 和(x2,y2)
分别代表矩形左上角和右下角两点坐标。假设钦赐矩形为星型时,椭圆就产生圆。

5.填充多边形
      
Polygon方法用当下Pen和Brush属性绘制并填充放肆边数的大举形,表明如下:

procedure Polygon(Points:array of TPoint);

多边形的四个坐标点存款和储蓄在数组Points中,Points数组的骨子里尺寸调节多方形的边数。一个可填充的多方面形应是查封的,即首尾两点坐标一致。

 

Points数组成分为TPoint,表示多个点的坐标。TPoint注脚如下:

type

    TPoint = packed record

      X: Longint;

      Y: Longint;

    end;

Types单元的Point函数将八个整型值生成贰个TPoint对象。Point函数评释如下:

function Point(AX,AY:Integer):TPoint;

例如说,下列程序段在矩形(x1 , y1 , x2 , y2)范围内画出三个等腰三角形。

var p:array [0..3] of TPoint;

p[0]:=point(x1 +(x2-x1) div 2,y1);

p[1]:=point(x1,y2);

p[2]:=point(x2,y2);

p[3]:=p[0];

Canvas.Polygon(p);

6.显得字符串
Textout方法用当前Font属性在内定地点(x,y)展现钦定字符串Text,申明如下:

procedure TextOut(x,y;integer;const Text:string);

10.2.3  窗口绘图事件
    在Windows中运作应用程序,窗口的基本操作由Windows调控实行。

   
当窗口运转时,Windows须求绘制窗口上全部的图形图像;当八个窗口被其余窗口覆盖后再被激活时,Windows供给再行绘制该窗口上曾被覆盖部分的图形图像。比方,窗口从最大化、最小化状态上升时,或被其余窗口覆盖、当其余窗口关闭或移开时,窗口被激活,Windows都将重画规范控件的图形图像。

     
Delphi的正式控件都具备重画功效,像窗体、按键、编辑框等,它们在窗口被激活时都能够自动地、完整地显示本身。

1.Form的OnPaint事件
   
当窗口运转或被激活时,触发窗体的OnPaint事件。假若急需在窗口上制图,则必需在Form的OnPaint事件上写绘图程序。

当窗口运转时,Windows突显窗口及里面控件,实行窗体的OnPaint事件绘制客商陈设的图纸。

当窗口被激活时,Windows会向窗口发送一个WM_Paint音信。Delphi对该新闻实行拍卖,先解决窗口上的图纸,然后触发OnPaint事件,重新绘制图形。

2.Repaint艺术马上刷新
当程序需求积极刷新图形时,能够调用Repaint方法来刷新窗口。

   
Repaint方法自动发出一个WM_Paint音讯,先祛除窗口上的图纸,再爆发OnPaint事件,重新绘制同样的图形。

10.2.4  响应鼠标事件
在程序运转进程中,利用鼠标能够完结动态地绘制,就好像Windows的图画程序同样。

采取鼠标作图,必要在前后相继中识别鼠标地方和鼠标动作,鼠标有3个动作:鼠标按下、鼠标移动和鼠标放手。在Delphi中,对应3个鼠标动作有3个不等的风云:

(1)当鼠标按下时,发生OnMouseDown事件。

(2)当鼠标放手时,爆发OnMouseUp事件。

(3)当鼠标移动时,爆发OnMouseMove事件。

Form的OnMouseDown事件注脚为:

procedure TForm1.FormMouseDown(Sender: TObject;

            Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

里面包车型地铁5个参数含义如下:

·    Sender:探测鼠标动作的对象。

·    Button:涉及的鼠标按键:mbLeft左键,mbMiddle中键,mbRight右键。

·    Shift:鼠标动作时,Alt、Ctrl、Shift键的景况。

·    X、Y:事件产生时鼠标的坐标。

OnMouseUp和OnMouseMove事件注脚和参数含义类似。

【例10.1】拖动鼠标画直线并展现直线的动态变化情状。

本例通过绘制直线演示3个鼠标响应事件上语句的十一分。程序运维时,随着鼠标的活动,客商可随时观看直线的变型。程序运转窗口如图10-1所示。

 

图片 13

图10-1  拖动鼠标画直线

一旦要在鼠标移动时随时观测直线的变通,则必得首先记住鼠标按商旅的起头点地点。程序如下:

[delphi] view plaincopyprint?var
Origin,MovePt:TPoint;                                 
//直线的最初点与移动点  
 
    mouse_down:Boolean;                                    
//鼠标是不是按下的事态  
 
procedure TForm1.FormMouseDown(Sender:TObject;        //鼠标按下事件  
 
    Button:TMouseButton;Shift:TShiftState;X,Y:Integer); 
 
begin 
 
    mouse_down:=true;                                      
//鼠标已按下  
 
    Canvas.MoveTo(X,Y); 
 
    Origin:=Point(X,Y);                                   
//记载直线的发轫点地点  
 
    MovePt:=Origin;                                        
//记载直线的移动点地点  
 
end; 
 
procedure TForm1.FormMouseMove(Sender:TObject;        //鼠标移动事件  
 
    Shift:TShiftState;X,Y:Integer); 
 
begin 
 
    if mouse_down                                          
//鼠标按下时画直线  
 
    then begin 
 
        Canvas.Pen.Mode:=pmNotXor;                      
//画笔线条为异或情势  
 
        Canvas.MoveTo(origin.X,origin.Y);              
//擦除前有个别的直线  
 
        Canvas.LineTo(MovePt.X,MovePt.Y); 
 
        MovePt := Point(X, Y); 
 
        Canvas.MoveTo(origin.X,origin.Y);             
//重画当前点的直线  
 
        Canvas.LineTo(MovePt.X,MovePt.Y); 
 
    end; 
 
end; 
 
  
 
procedure TForm1.FormMouseUp(Sender:TObject;          
//鼠标松手事件  
 
                  Button: TMouseButton; Shift: TShiftState; X, Y:
Integer); 
 
begin 
 
    Canvas.LineTo(X,Y);                                    //画直线  
 
    mouse_down:= false;                                   
//鼠标已松手  
 
end; 

var Origin,MovePt:TPoint;                                 
//直线的初阶点与移动点

    mouse_down:Boolean;                                    
//鼠标是还是不是按下的图景

procedure TForm1.FormMouseDown(Sender:TObject;        //鼠标按下事件

    Button:TMouseButton;Shift:TShiftState;X,Y:Integer);

begin

    mouse_down:=true;                                      
//鼠标已按下

    Canvas.MoveTo(X,Y);

    Origin:=Point(X,Y);                                   
//记载直线的伊始点地方

    MovePt:=Origin;                                        
//记载直线的移动点地方

end;

procedure TForm1.FormMouseMove(Sender:TObject;        //鼠标移动事件

    Shift:TShiftState;X,Y:Integer);

begin

    if mouse_down                                          
//鼠标按下时画直线

    then begin

        Canvas.Pen.Mode:=pmNotXor;                      
//画笔线条为异或格局

        Canvas.MoveTo(origin.X,origin.Y);              
//擦除前某个的直线

        Canvas.LineTo(MovePt.X,MovePt.Y);

        MovePt := Point(X, Y);

        Canvas.MoveTo(origin.X,origin.Y);             
//重画当前点的直线

        Canvas.LineTo(MovePt.X,MovePt.Y);

    end;

end;

 

procedure TForm1.FormMouseUp(Sender:TObject;           //鼠标放手事件

                  Button: TMouseButton; Shift: TShiftState; X, Y:
Integer);

begin

    Canvas.LineTo(X,Y);                                    //画直线

    mouse_down:= false;                                    //鼠标已松手

end;

 

http://www.bkjia.com/Delphijc/530808.htmlwww.bkjia.comtruehttp://www.bkjia.com/Delphijc/530808.htmlTechArticle10.2 图 形 设 计
Windows是贰个基于图形客商界面包车型地铁操作系统。
若要在窗口上绘制,须要调用Windows 提供的应用程序接口(Application
Program Int…

相关文章