您现在的位置:中国传动网  >  技术频道首页  >  技术百科  >  C#2017编程基础及雷赛运动控制产品应用(上)

C#2017编程基础及雷赛运动控制产品应用(上)

2019年07月09日 11:04:04 中国传动网

计算机编程是一个程序猿的看家本领,特别是在工控领域,想要通过运动控制产品实现机械设备的运动,不可缺少的是优秀的编程方式。在现今大量的编程语言种类中,工程师应该如何去选择合适的语言环境呢? 今天小编带大家了解其中C#的基本操作方法。

 C#2017编程基础

为什么要用C#

先看一下20189Tiobe编程语言排行榜。

 C#2017编程基础

●Java,1995年由SUN公司正式推出,免费!具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网。(2010Oracle公司收购了SUN)

●Python/ˈpaɪθən/是一种解释型、面向对象、动态数据类型的高级程序设计语言。自从1991Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程。免费、开源。

●PHPHypertext Preprocessor的缩写,中文名:超文本预处理器)是一种通用开源脚本语言。语法吸收了C语言、JavaPerl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。

数据表明:JavaC语言是主流。

C#的起源

C#读作C Sharp。符号#2种解释:

#在五线谱中读作Sharp,是升半个音的意思。这里用#有对C提升之意。

C→C ++ → C ++++,为了方便写成了C #。

1996年原Broland公司的首席研发设计师安德斯·海尔斯伯格(Anders Hejlsberg)加入微软,开始开发Visual J++Visual J++很快由1.1版本升级到6.0版。VJ++编译出来的虚拟机械码的执行效率不但比任何Java开发工具快,在某些方面甚至比原生的Windows开发工具,如:DelphiVB、甚至是VC++效率还高。

SUN公司认为Visual J++ 违反了Java开发平台的中立性,对微软提出了诉讼。2000626日微软在奥兰多举行的职业开发人员技术大会(PDC 2000上,推出新的语言C#,它是在Visual J++基础上开发的软件,同时停止Visual J++的销售。所以,C#语言深受JavaCC++的影响。

20006月微软公司发布一种新的编程语言C# 1.0

20035月,微软推出了Visual Studio .NET 2003,同时也发布了C#的改进版本C# 1.1

微软在2004年的6月份发布了Visual Studio2005的第一个Beta版,同时展示了C#2.0。

20059月份的PDC大会上微软推出C#3.0的技术预览版。

20104月推出的Visual Studio2010C#4.0,支持开发面向Windows7的应用程序。

20129月微软发布了Visual Studio 2012C#5。0,可支持Windows8

201738日微软正式推出Visual Studio2017,其中包括C# 7.0 Visual Basic 15,可支持Windows10Visual Studio 2017 包括可免费试用的专业版和企业版,以及面向学生、开源和个人开发者的免费社区版。

C#有哪些优点?

就职于微软的 C# 部门的Mads TorgersenGOTO Copenhagen 2016 大会讲演上说:C#是您的首选编程语言!因为C#能够很好地在WindowsMacLinuxAndroidiOS上运行。C#是编程语言创新方面的领导者,是原生跨平台移动应用程序的最佳选择,并且还有很多的优点超乎您的想象。

 

C#是一种强大的、面向对象的程序开发语言,是专门用于。Net的编程语言,用C#编程的代码总是在.Net Framework中运行。

C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为。NET平台的首选语言。

C#在继承CC++强大功能的同时去掉了一些它们的复杂特性(例如没有指针、宏以及不允许多重继承等)。

C#语言和Java很相似。学会C#后,学习Java很容易。

笔者使用经验:

◆ C#的功能强:类库庞大、多线程、速度快;

◆ 界面设计简单、美观,和VB类似;

◆ 稳定性比VB6.0强(调试运动控制卡时没有自动退出现象);

◆ 智能化水平高(写代码时格式自动对齐,有智能提示;调试程序时方便,能给出有用的信息等);

◆ C#比学VC容易(难点是要适应一些新概念,如:类)。

◆ C#7C#4有明显提高。

1)纠错能力进一步加强;语法有错时,也能自动对齐代码。

2)定时器Timer精度提高到10ms

3)免费的社区版也可以生成应用程序。

C#安装方法

下载离线安装软件包。安装过程如下:

1. 运行vs_setup.exe

2. 如果提示需要安装 .NetFramework4.6,则运行文件夹NetFramework4.6”中的

NDP462-KB3151800-x86-x64-AllOS-ENU.exe即可。

3. .Net桌面开发。即安装C#VB

4.安装完成后,要连接网络,用微软的账号登录一下,就OK啦!

如果没有微软的账号,用一个邮箱号注册一个也很容易。

5. 运行C#后,如果有报错:当前页面的脚本发生错误

根据图片上提示的文件路径,找到这些文件(有可能图片中会弹出多个文件),直接删除文件,并不影响使用,也不会再报错。

第一个C#程序

输入3个数字(字母也行),点击开始键,3个数按从小到大顺序重新排列,并输出结果。界面和运行结果如图1。2所示。

 C#2017编程基础

C#的编辑界面如图1.3、图1.4所示。除了窗体及代码外,C#还有一个主程序Program.cs、一个系统自动生成的窗体设计程序Form1。Designer。cs。

 C#2017编程基础

C#2017编程基础

C#的程序结构如例程1代码所示。

例程1

using System;   // 引入System等命名空间

using System.Collections.Generic;  // 相当于VC的头文件

using System.ComponentModel;

using System.Data;

using System。Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace FirstOne  //  创建名为FirstOne的命名空间

{    //  命名空间中有多个文件

// Program.cs 为主程序文件

staticclassProgram   //  创建名为Program的静态类

{

///<summary>

///应用程序的主入口点。

///</summary>

[STAThread]    //  指示应用程序的COM线程模式是单线程单元(STA)。

staticvoid Main()     //  创建名为Main()的静态方法

{

Application.EnableVisualStyles();  //  启用可视化样式

Application.SetCompatibleTextRenderingDefault(false);   //  设置呈现格式

Application.Run(newForm1());  //  运行Form1窗体

}

}

// Form1.cs 为窗体事件的代码

publicpartialclassForm1 : Form   //  创建名为Form1的公共类

{

public Form1()

{

InitializeComponent();

}

privatevoid button1_Click(object sender, EventArgs e)   //  开始按键被点击

{

string[] MyData = new string [3]; // 红色所示代码为编程者写的,其他均为自动生成

MyData[0] = textBox1.Text;  // 输入数据

MyData[1] = textBox2。Text;

MyData[2] = textBox3.Text;

Array.Sort(MyData);// 排序

textBox1.Text = MyData[0];  // 输出结果

textBox2。Text = MyData[1];

textBox3.Text = MyData[2];

}

Form1.Designer.cs 为窗体设计代码,由Visual Studio自动生成,不用多管它。

C#代码的语法、格式

1. 使用using关键字把。Net Framework类库相对应的命名空间引入应用程序项目中。

2. 必须定义类

C#程序的源代码必须放在类中,一个程序至少包括一个自定义类,用关键字class声明。

3. 类的代码主要由方法组成

C#程序中必须包含Main方法。程序从Main方法的第1条语句开始运行,直到执行到其最后一条语句为止。类中可以包含多个方法。方法名后一定有一对园括号。

4. C#语句以分号结束

一行代码可以写几条语句;一条语句也可以长达多行。

5. C#代码中区分大小写

6. C#的程序注释

// 单行注释

/*

多行注释

*/

7. 命名规则:

定义空间、类、方法、控件、变量等都需要命名。

名字可以由英文、数字或下划线组成,要使其意义、目的明确。不可用拼音。(下划线已不建议用)

微软在C#中主要使用的是帕斯卡命名法和骆驼命名法。

帕斯卡命名法(Pascal):每个单词的首字母大写,例如ProductType

骆驼命名法(Camel):首个单词的首字母小写,其余单词的首字母大写,例如productType

命名空间、类、窗体、方法、事件、属性的命名:

一般用大写字母开头,后面的单词的第一个字母也要大写。(帕斯卡命名法)

例:FirstOneScreenClassMainFormSetCopyNumberColorChangedBackColor

控件的命名:第一个字母小写,其余单词首字母大写。(骆驼命名法)

例:textBox2exitButtonstreetNumberLabel

变量、方法的参数命名:

用有意义的单词命名即可。第一个字母小写,其余单词首字母大写。(骆驼命名法)

例:balanceindex,nextMonthExpenditurecustomerName

不要使用简称和无意义的名称,如:ab1等。但ijxy等约定俗成的变量可用。

常数的命名:

所有单词大写,多个单词之间用 "_" 隔开。如:const double TAX_RATE = 0.23;

C#代码的其他规范

代码的缩进。要用Tab,而不要用space。

◆ 所有的成员变量声明在类的顶端,用一个换行把它和方法分开。

◆ 生成和构建一个长的字符串时,一定要使用StringBuilder,而不用string.

◆ 始终使用"{ }"包含if下的语句,即使只有一条语句。

◆ 把相似的内容放在一起,比如数据成员、属性、方法、事件等。

C#的常数、变量及定义方法

1.常用的数据类型及取值范围(如表1.1所示)

因为现在的计算机速度极快。建议:整数用long类型、浮点数用double类型。

bool类型是条件语句必须使用的类型。字符用char类型,字符串用string类型。还有时间类型、日期类型、枚举类型、结构类型、对象类型等数据类型。不常用,不介绍。

 C#2017编程基础

2. 常数

1)布尔常量:truefalse

2)整数常量:既可以是10进制也可以是16进制。

16进制数前加符号:0x。如:0x20,0x1F

常整数后加符号L表示long型,常整数后加符号U表示无符号型。

例:32       // 默认为int

32L            // long

32U           // uint

32UL         // ulong

3)浮点常量

浮点数后加符号F表示float型,如:3.14F

浮点数后加符号D表示double型,如:3.14D

浮点数后加符号M表示decimal型。如:3.14M

4)字符串常量

A.常规字符串:由双引号括起的一串字符,可以包括转义字符。

 C#2017编程基础

:“Hello,World!\n”     // 字符Hello,World!后接换行符

“C:\\windows\\Microsoft” // 字符串为:C:\windows\Microsoft

B.逐字字符串:常规字符串前加符号@,字符串中的字符均表示本意。

:@“He said “Hello” to me.”  // 字符串为:He said “Hello” to me.

5)符号常量

定义格式:[常数修饰符]  const  类型常量名 = 初值

常用修饰符有:publicprivate

:private  const  double  PI = 3.1415926

3.  变量的定义(和VB差别大)

声明变量的格式:[变量修饰符] 类型变量名[ = 初值 ] [ , … ];

常用修饰符有:publicprivatestatic

(静态变量在函数调用结束后仍保留变量值,只能在类中定义,不能在方法中定义)

:  long  distance

double  speed = 21.5acc = 90。0

string  productName

4. 数组

1)一维数组的定义(和VB差别很大)

方法1:类型   [ ] 变量名;             // 数组声明

变量名 = new 类型 [ 数组长度 ] { val1,val2, … }  // 创建数组实例

方法2:数组声明和创建数组实例同时进行

方法3:数组声明和创建数组实例同时进行,并完成初始化,可省略new和类型

: int [ ] number;

number = new int [10];    // 数组number10个元素

float [ ] score = new float[ 100 ];   // 数组score100个元素

long [ ] queue = {0,1,2,3,4,5};   // 数组queue6个元素

2)处理数组的常用方法:

aEnumerable类的方法:

数组名.Count()// 给出数组含元素的个数

数组名.Max()   // 给出数组中最大的元素

数组名.Min();      // 给出数组中最小的元素

数组名.Sum();    // 计算数组所以元素的和

数组名.Average(); // 计算数组所以元素的平均数

bArray Array Array类的方法:

Array.Clear(数组名, 开始位, 长度);   // 清零

Array.Sort(数组名);  // 排序

Array.Reverse(数组名);  // 反转数组中元素的顺序

常用的运算符和表达式

1.算术运算符:

加:+ ,减:- ,乘:* ,除:/ ,取模:% ,递增:++ ,递减:--

2.关系运算符:

大于:>,大于等于:>=,小于:<,小于等于<=:,等于==:,不等于:!=

3.逻辑运算符:与:&,或:| ,非:! ,异或:^

4.位运算符:

与:&,或:| ,非:~ ,异或:^,右移:>>,左移:<<

VB的不同:%Mod),无乘方符号(^),++--(无)

===), !=<>),&And),|Or),!(Not

5.运算符及操作符从高到低的优先级顺序,见表1。3

 C#2017编程基础

6.常用数学函数的调用:(System命名空间中的Math类)

Math.Abs(x);     // x 的绝对值

Math.Pow(x,y);   // x y 次幂

Math.Sqrt(x);     // x 的平方根

Log10(x);   // x 10为底的对数

Math.Sin(x);       // x 的正弦

Math. Cos(x);    // x 的余弦

Math.Tan(x);     // x 的正切

Math.Asin(x);    // x 的反正弦

Math. Acos(x);  // x 的反余弦

Math.Atan(x);   // x 的反正切

Math.Floor(x);   // 返回小于或等于x的最大整数

Math.Round(x);   // 四舍五入取整

Math.Sign(x);     // x<0,返回-1x=0,返回0x>0,返回1

Math.Max(x,y);   // 返回x,y中的最大值

Math.Min(x,y);   // 返回x,y中的最小值

7.数据类型的转换的方法:

a.隐式转换:

C#可以自己进行一些数据类型的转换。字节占用小的类型可以自动转为字节占用多的类型。如:

int 可自动转为 longfloatdouble

float可自动转为double

b.显式转换:

格式:(类型说明符)(待转换的数据)

例:b = (float) a;

z = (int) (x+y);

c.使用Convert类提供的方法(System命名空间中的Convert类)

常用的有:Convert.ToString(x);    // x 可以是intlong,float,double

Convert.ToDouble(x);   // x 可以是stringintlongfloat

Convert.ToInt32(x);    // 即转换为 int

Convert.ToInt64(x);    //即转换为 long

a2个简单的转换函数:

变量.ToString();   //将任意一种类型的变量转为字符串

int.Parse(字符串);   //将字符串数字转为int类数值

float.Parse(字符串);   //将字符串数字转为float类数值

double.Parse(字符串);   //将字符串数字转为double类数值

8.常用字符串处理函数:(String )

字符串1.IndexOf(字符串2 )    // 在字符串1中查找第一个字符串2的位置

字符串.Substring( a, b )       //  获取从字符串的第a个字符开始,共b个字符

字符串.Substring( a )         //  获取从字符串第a个字符开始的全部字符

字符串.Remove(a, b )        //  从字符串的第a个字符开始,删除b个字符

字符串1=字符串2+字符串3   //  字符串的加法

C#编程语言与控件的应用

1.if  else 语句(流程见图2.1

语法格式:     if (条件表达式)

{

语句块1;

}

else

{

语句块2;

}

 C#2017编程基础

2.for 语句(流程见图2.2

语法格式:     for(初始化表达式;条件表达式;迭代表达式)

{

循环体;

}

 C#2017编程基础

3.while 语句(流程见图2.3

语法格式:     while(条件表达式)

{

循环体;

}

4.跳转语句

break语句:用于退出forwhileswitch等循环语句

continue语句:在forwhile等循环语句中,开始新的一次循环

return语句:return出现在方法中。执行return后,程序回到方法的调用处。

return可带参数。

例程2:百钱百鸡问题

鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

即:假定公鸡每只5元,母鸡每只3元,小鸡31元。现有100元,要买100只鸡,问公鸡、母鸡和小鸡各买几只?

分析:设买公鸡的数量为cock,买母鸡的数量为hen,买小鸡的数量为chick

显然,1≤cock≤191≤hen≤31chick100cockhen;

三种鸡的总价格为

sumcock´5+hen´3+ chick/3

用搜索法可很快找到答案。即用两重循环语句控制买公鸡和母鸡的数量在119131中依次变化;

再用条件语句判断哪种组合使买鸡的总价格正好等于100元。

计算流程见图2.4

 C#2017编程基础

打开VisualStudio2017

选择文件”→“新建”→“项目菜单命令,并在弹出的新建项目对话框的左边一栏中选择“VisualC#”→“Windows桌面,并在中间栏中选“Windows窗体应用,然后在下面填写项目名称、选择项目保存位置,最后点击确定按钮。如图2.5所示。

 C#2017编程基础

设计界面如图2.6所示。界面中有一个按钮button1,一个增强文本框richTextBox1。将Form1的属性Text改为百钱百鸡问题button1的属性Text改为求解。

C#2017编程基础

双击按钮button1,自动进入代码编辑窗体,如图2。7所示。

C#2017编程基础 

button1_Click函数里编写代码。点击菜单中的快捷键启动,运行程序。点击求解按钮,得出百钱百鸡的结果。如图2.8所示。点击右上角的叉,可退出程序。

 C#2017编程基础

C#的类、方法

1.类:

类构成了面向对象编程的核心。

类实际上就是数据和处理数据代码的封装体,即:类封装了数据成员和函数成员。

其中数据成员有:常数、字段(即:变量)、域等;函数成员有:方法、属性、事件等。

类的实例则称为对象。

类的声明:

[类修饰符]  class  类名 [ :类基 ]

{

类成员

}

主要的类修饰符有:

public      该类为公开的,访问不受限制

protected:该类只能是本身或其派生的类访问

internal    该类只能是在当前应用程序中访问

private     该类只能是本身访问

类基:该类的直接基类和由该类实现的接口。

2.类通过实例化才能得到具体的对象。

实例化类的格式:

类名对象名 = new 类名( [参数] );

3.方法:

方法:就是按照一定格式组织的一段代码。即:VB中的过程、函数。

a. 方法的声明:

[方法修饰符返回类型方法名([ 形参表 ]

{

方法体

}

主要的方法修饰符有:

public:该方法为公开的,可以在任何地方访问

protected:该方法可以在类中或其派生的类中被访问

internal:该方法可以被同处一处的工程中的文件访问

private:该方法只能在类中被访问

static:静态方法从类一创建就开始存在

b.方法中的参数传递

传值参数无需额外的修饰符。

传址参数需要修饰符ref(参数定义和参数调用时都要加上)

传值参数(值参数)在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。

传址参数(引用参数)恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。

例程3:对3个数排序、计算3次方。

(类、方法、参数的传递)

在窗体中添加控件:2个按钮、

3个文本框、3个标签,如图2.9所示

C#2017编程基础

button1的名称改为start,将button2

的名称改为power

程序代码如下:

using System;

using System.Collections.Generic;2。9  类、方法、参数的传递

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System。Text;

using System.Windows.Forms;

namespace ExampleClass

{

publicpartialclassForm1 : Form

{

public Form1()

{

InitializeComponent();

}

privatevoid start_Click(object sender, EventArgs e)

{

double a, b, c;                 

a = Convert.ToDouble(textBox1.Text);

b = Convert。ToDouble(textBox2。Text);

c = Convert。ToDouble(textBox3。Text);

MyClass m = newMyClass();  // 实例化类MyClassm

m.Sort(ref a, ref b, ref c);         // 调用类m中的Sort方法,代入参数a,b,c  

 

textBox1.Text = Convert.ToString(a);

textBox2.Text = Convert.ToString(b);

textBox3。Text = Convert。ToString(c);

}

privatevoidpower_Click(objectsender,EventArgs e)

{

double a, c;

a = Convert.ToDouble(textBox1.Text);

c = power3(a);       // 调用方法,代入参数a

textBox3。Text = Convert。ToString(c);

}

privatedouble power3(double x)  // 计算x3次方

{

double z;

z = x * x * x;    // x是传入的参数

return z;         // z被回传

}

}

publicclassMyClass

{

publicvoid Sort(refdouble x, refdouble y, refdouble z)

{      // 该方法其他类中可以调用

if (x > y) Swap(ref x, ref y);    // a,b,c 三参数从小到大排序

if (x > z) Swap(ref x, ref z);

if (y > z) Swap(ref y, ref z);

}

privatevoid Swap(refdouble m, refdouble n)

{            // 该方法其他类中不可调用

double temp;    // m,n两参数对换

temp = m;

m = n;

n = temp;

}

控件及属性

前面已经使用过的控件有:文本框、增强文本框、按钮、标签。

1.  定时器、复选框控件

例程4

设计一个窗体如图2.10所示。

从工具箱中的组件中选“Timer”添加在窗体中。再添加2个按钮、2个复选框,其中checkBox2的外观改为“button”

 C#2017编程基础

定时器的属性“Interval”(时间间隔)设为500,其单位为毫秒。双击定时器图标,进入timer1_Tick函数,编写代码,使复选框的选中状态每500毫秒变化一次。

button1button2分别控制定时器的开关。程序代码如下:

privatevoid button1_Click(object sender, EventArgs e)

{

timer1.Start(); // 打开定时器

button1.Visible = false; // 按钮不可见

}

privatevoid button2_Click(object sender, EventArgs e)

{

timer1.Stop(); // 关闭定时器

button1.Visible = true; // 按钮可见

}

privatevoid timer1_Tick(object sender, EventArgs e)

{

if (checkBox1.Checked == true)

checkBox1.Checked = false;

else

checkBox1.Checked = true;

if (checkBox1.Checked == true)

checkBox2.Checked = false;

else

checkBox2。Checked = true;

}

2. 延时与界面刷新

例程5

用线程休眠指令Thread.Sleep(…)可实现程序延时;注意,要在程序最前面添加“using System.Threading;”。

在一个子程序中修改控件的Text属性后,必须使用Refresh()指令刷新界面,否则,界面直到退出子程序后才会改变。

界面如图2.11所示,代码如下:

 C#2017编程基础

using System;

using System.Threading; // 调用多线程类库

using System.Windows.Forms;

namespace sleep

{

publicpartialclassForm1 : Form

{

public Form1()

{

InitializeComponent();

}

privatevoid button1_Click(object sender, EventArgs e)

int i;

for (i = 10; i > 0; i--)

{

button1.Text = "请等待..." + i.ToString()+"";

this.Refresh();  // 刷新界面

Thread.Sleep(1000);        // 线程休眠1

}

button1.Text = "完成!";

this.Refresh();

Thread.Sleep(1000);

button1.Text = "延时10";

}

常见问题

1. 仅删除一个过程的代码,会出错。如果删除了以下代码:

privatevoid Form1_Load(object sender, EventArgs e)

{

……

}

窗体设计器中的一条对应的代码,也要删除才行。

privatevoid InitializeComponent()

{……

this.Load+=newSystem.EventHandler (this.Form1_Load);  // 这条代码也要删除

……

2. 将事件触发的代码直接拷贝在Form。cs中不行。

如:只是拷贝以下这段代码,并不会在textBox1中显示Hello!也不报错。

privatevoidForm1_Load(objectsender,EventArgs e)

{

textBox1.Text = "Hello!";

}

只有在Form1上双击Load事件,自动生成Form1_Load过程,再将textBox1.Text = "Hello!";拷入,才可以!

3. 局部变量没有赋初值,会报错。

例如:

{

int m, n ;

if (m == 0)←报错

或者:

m = n + 1;←报错

报错提示:使用了未赋值的局部变量。

int m, n=0 ;

m = n + 1;←这样ok!

技巧:

1.多用快捷键:

Ctrl+K+D:调整全部代码的格式(编辑®高级®设置文档的格式)

F1:查看帮助:将光标移至相关代码处,按键F1,可得相应的帮助内容。

F7:进入代码编辑窗口;

Shift+F7:进入窗体设计窗口;

F12:光标在方法名上,按F12跳方法定义代码处。

Ctrl+Home:光标跳至文件头;

Ctrl+End:光标跳至文件尾;

Ctrl+L:删除当前行;

Ctrl+CCtrl+VCtrl+XCtrl+Z:和Office一样。大家都会用的!

2. 充分利用网络上的例程和帮助文件

C#类库资源丰富,要充分利用。先有自己的想法,再到网上搜索例程;最后仔细阅读C#的帮助文件。

不断学习、实践,就能成为C#高手!

C#绘图方法与鼠标事件

.NET Framework 提供了图形设备接口GDIGraphic Device Interface)。

C#提供的Graphics类,提供了将对象绘制到显示设备的方法。

绘图通常在pictureBox中进行。主要步骤如下:

1.在窗体上新建一个pictureBox控件,背景色设为白色;

2.创建Graphics对象

Graphics g = pictureBox1.CreateGraphics(); // 相当于C++中获取句柄

3.定义坐标及单位:

默认坐标原点是绘图区的左上角。Y轴坐标方向朝下。如图3.1所示。

一般以屏幕的像素为坐标的单位。

g.PageUnit = GraphicsUnit.Pixel;  // 以像素为单位

g.PageScale = 0.5f;            // 像素与坐标单位的比例,即1个坐标单位为0.5个像素。

坐标可以平移,函数如下:

g.TranslateTransform(200,200);   // X轴下移200Y轴右移200,方向仍朝下

画图时,y坐标的数据乘-1,则得到正常图形。

 C#2017编程基础

4.定义画笔

方法1

Pen myPen = newPen( Color.Red );  // 实例化PenmyPen,红色,宽度为1

方法2

Pen myPen = newPen( Color.Red, 2.0f );   // 宽度为2

5.画直线:

方法1:绘制一条由坐标对指定的两端点的直线,即点(x1,y1)(x2,y2)的直线。

DrawLine(Pen, intx1, int y1, int x2, int y2);

DrawLine(Pen, floatx1, float y1, floatx2, float y2);

方法2:绘制一条由两个PointF结构定义的直线。

PointF point1= new PointF(100.0F,100.0F);

PointF point2= new PointF(500.0F,300.0F);

DrawLine(Pen, point1, Point2 );

结构:由一系列相关参数组织成的一个单一实体。使用方法和相似。也可以自己定义。

常用的结构成员有:类型、常数、变量等。

6.画椭园:

DrawEllipse(Pen,x,y,h,w);

// 椭圆的大小由一矩形定义,该矩形的左上角坐标(x,y)、高度h、宽度w

//当高度为1、宽度为1时,即画1个点。

7.画曲线:使用DrawLinesDrawCurve函数

例程6:画曲线(结果见图3.2

 C#2017编程基础

int[] x = { 30, 60, 90, 120, 150, 180, 210, 240, 270, 300 };

int[] y = { 60, 120, 30, 240, 300, 240, 30, 120, 60, 30 };

Graphics g = pictureBox1.CreateGraphics();   //创建Graphics对象

g。TranslateTransform(0, 400); 

Pen RedPen = newPen(Color.Red);   //创建红色的画笔

Pen GreenPen = newPen(Color.Green); //创建绿色的画笔

Point[] points = newPoint[10];  //创建坐标点的结构

for (int i = 0; i < points.Length; i++)

{

points[i] = newPoint(x[i], -1 * y[i]);    //设置各个点的坐标值

}

g.DrawCurve(RedPen, points);       //绘制经过一组指定的坐标点的样条曲线。

g.DrawLines(GreenPen, points);     //绘制折线

for (int i = 0; i < 10; i++)

{

g.DrawEllipse(newPen(Color.Blue,3),x[i],-1*y[i],1,1);    //画各个点

}

DrawLinesDrawCurve画曲线比用DrawLine画曲线快!

8.画矩形:

Rectangle rect = newRectangle(x1, y1, width, height);  //定义矩形:左上角坐标、宽、高

g.DrawRectangle(Pen, rect);   // 画矩形

9.画面清零:

g。Clear(Color。White);

鼠标事件

例程7:用鼠标在pictureBox中画框

在窗体设计界面选中pictureBox1,点击属性框上的事件图标(如图3.3a所示),双击MouseDown,自动生成鼠标键按下事件的方法名:

privatevoid pictureBox1_MouseDown(object sender, MouseEventArgs e)

然后编写相关代码即可。

建立鼠标键抬起、鼠标移动事件的方法过程也一样。

用鼠标在pictureBox中画框的结果见图3。3b,代码如下所示。

 C#2017编程基础

int x1, y1, x2, y2, mouseDown = 0;

int x0 = 0, y0 = 0, height = 0, width = 0;

privatevoid pictureBox1_MouseDown(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left) // 鼠标左键按下

{

x1 = e.X;  // 获取鼠标左键按下时的坐标

y1 = e.Y;

textBox1.Text = Convert.ToString(x1); // 显示坐标

textBox2.Text = Convert.ToString(y1);

mouseDown = 1;      // 鼠标左键按下标识为1

}

privatevoid pictureBox1_MouseMove(object sender, MouseEventArgs e)

{

if (mouseDown == 1)    // 鼠标左键按下后的移动

{

Graphics g = pictureBox1.CreateGraphics();

Pen WhitePen = newPen(Color.White);

Pen RedPen = newPen(Color.Red);

Rectangle rect0 = newRectangle(x0, y0, width, height);

g.DrawRectangle(WhitePen, rect0);  // 擦除上次画的框

width = e.X - x1;  // 计算鼠标左键按下后移动的距离

height = e。Y - y1;

Rectangle rect = newRectangle(x1, y1, width, height);  //创建矩形数据结构并赋值

g.DrawRectangle(RedPen, rect);  // 画框

x0 = x1; y0 = y1;

}

privatevoidpictureBox1_MouseUp(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left) // 鼠标左键抬起

{

x2 = e.X;  // 获取鼠标左键抬起时的坐标

y2 = e。Y;

textBox3.Text = Convert.ToString(x2); // 显示坐标

textBox4.Text = Convert.ToString(y2);

mouseDown = 0;  // 鼠标左键按下标识为0

以上就是C#的一些基本操作方法了,至于如何使用C#来实现运动控制卡/器的控制,敬请期待下篇文章哦~


声明:本文为转载类文章,如涉及版权问题,请及时联系我们删除(QQ: 2737591964),不便之处,敬请谅解!

供稿:深圳市雷赛智能控制股份有限公司

本文链接:http://www。chuandong。com/tech/detail。aspx?id=37394

中国传动网

官方微信

扫一扫,信息随手掌控

运动与控制

官方微信

扫一扫,运动与控制信息随手掌控

  • 地 址:深圳市南山区学苑大道1001号南山智园A3栋11楼
  • 电 话:0755-26433338
  • 网 址:
  • 传 真:0755-26402718

相关文章

联系我们

广告联系:0755-82048561
展会合作:0755-83736589
杂志投稿:0755-82048562

网站简介|会员服务|联系方式|帮助信息|版权信息|网站地图|友情链接|法律支持|意见反馈

版权所有 2006-2016 中国传动网(ChuanDong.com)

  • 经营许可证
    粤B2-20150019

  • 粤ICP备
    14004826号

  • 不良信息
    举报中心

  • 网络110
    报警服务

网站客服热线

0755-82949061

网站问题客服

光速飞艇在线计划_光速飞艇精准计划_光速飞艇稳定计划-网页版 开心赛车官网-开心赛车计划_开心赛车开奖 Toyou 开心飞艇-开心飞艇官网 开心快乐8-开心快乐8规律-开心快乐8走势图-开心快乐8官网 光速时时彩-光速时时彩网上购买 开心飞艇-开心飞艇投注平台 光速时时彩_光速时时彩网站注册_正规光速时时彩平台 开心赛车官网-开心赛车计划_开心赛车开奖 Toyou 光速快三官网-光速快三计划_光速快三开奖 Toyou 开心生肖app-开心生肖代理_开心生肖手机版 Toyou Welcome 光速赛车计划_光速赛车计划网_光速赛车平台 光速生肖_光速生肖官网_光速生肖平台_光速生肖人工计划