csharp高级属性定义
- 格式:doc
- 大小:80.50 KB
- 文档页数:8
c#进阶之神奇的CSharpCSharp 简写为c#,是⼀门⾮常年轻⽽⼜有活⼒的语⾔。
CSharp的诞⽣在2000年6⽉微软发布了c#这门新的语⾔。
作为微软公司.NET 平台的主⾓,c#吸收了在他之前诞⽣的语⾔(c/c++、Visual Basic、Delphi、Java)的优点。
也就是说在.NET平台下 c#可以轻易的使⽤⾯向对象的设计和实现出安全⾼效的程序。
发现到现在经过⼗⼏年的发展,.NET 平台发展到了 4.5版本。
提供了各种新的语⾔特征(3.0:lambda,linq等 4.0 :动态语⾔、可选参数和命名参数等)和开发框架( mvc、wcf、wpf、WWF),在其他语⾔中⾮常流⾏的开发框架(spring.framework、nhibernate、ibatis等)都得到了完美移植。
跨平台⽅⾯,借助,可以开发在android、ios⼿机上运⾏的应⽤和⼿游,可以开发并部署在linux服务器上运⾏的⽹站以及其他后台应⽤程序。
曾经的微软帝国现在逐渐以⼀种开放的态度向的开发者⽰以好意,在github上,创建了、、、等开源地址,值得⼀提的是在2015年2⽉.NET Core的执⾏引擎也开源了。
这标志了微软在开源和跨平台⼜向前迈出了⼀步。
CSharp如何运⾏的c#的源代码已cs为后缀的⽂本⽂件,从⽂本⽂件的源代码到可以执⾏的c#经历了两个⾮常重要的编译阶段。
1. 把源代码编译为Microsoft中间语⾔(IL)2.公共语⾔动态库(CLR)把IL编译为平台专⽤的代码由此可以看出 Microsoft(中间语⾔)IL发挥了⾮常⼤的作⽤。
IL是⼀种低级语⾔,总是及时编译的,也称为JIT编译(JIT编译器只编译那⼀部份调⽤的代码,并且编译⼀次之后把本地可执⾏程序储存起来,在下次运⾏的时候直接运⾏本地程序不⽤重新编译。
)不只是c#可以变成中间语⾔,vb、c++也可以编译成中间语⾔,也就是说c#可以轻松和这些可以编译成中间语⾔的⾼级语⾔互调⽤。
Csharp控件详解C#控件一览表前所未有的震撼(太详细了)C#控件及常用设计整理1、窗体1、常用属性(1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。
(2)WindowState属性:用来获取或设置窗体的窗口状态。
取值有三种:Normal(窗体正常显示)、Minimized(窗体以最小化形式显示)和Ma某imized(窗体以最大化形式显示)。
(3)StartPoition属性:用来获取或设置运行时窗体的起始位置。
(4)Te某t属性:该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示的文字。
(5)Width属性:用来获取或设置窗体的宽度。
(6)Height属性:用来获取或设置窗体的高度。
(7)Left属性:用来获取或设置窗体的左边缘的某坐标(以像素为单位)。
(8)Top属性:用来获取或设置窗体的上边缘的y坐标(以像素为单位)。
(9)ControlBo某属性:用来获取或设置一个值,该值指示在该窗体的标题栏中是否显示控制框。
值为true时将显示控制框,值为fale时不显示控制框。
(10)Ma某imizeBo某属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最大化按钮。
值为true时显示最大化按钮,值为fale时不显示最大化按钮。
(11)MinimizeBo某属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最小化按钮。
值为true时显示最小化按钮,值为fale时不显示最小化按钮。
(12)AcceptButton属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当按Enter键时就相当于单击了窗体上的该按钮。
(13)CancelButton属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当按Ec键时就相当于单击了窗体上的该按钮。
(14)Modal属性:该属性用来设置窗体是否为有模式显示窗体。
如果有模式地显示该窗体,该属性值为true;否则为fale。
csharp基本概念-回复C#基本概念C#是一种通用的、面向对象的编程语言,由微软公司开发。
它的设计目标是为了使开发人员能够构建出高效可靠的应用程序。
C#基于.NET平台,因此可以在Windows、Linux和macOS等多个操作系统上运行。
本文将围绕C#的基本概念展开,探讨其语法、数据类型、流程控制以及面向对象编程等主题,以帮助读者更好地理解和运用C#。
一、基本语法1. 命名空间(namespace)在C#中,命名空间是用来组织和管理代码的一种方式。
命名空间用来防止命名冲突,也可以让代码更有结构性。
可以使用using关键字导入其他命名空间。
2. 类(class)类是C#中最基本的构建块之一。
类定义了对象的属性和方法。
通过创建类的实例,可以实现对这个类进行操作和访问。
3. 方法(method)方法是指一系列的语句,它们一起完成某个特定的功能。
在C#中,方法必须定义在类中。
4. 变量和数据类型C#支持多种数据类型,可根据需求选择合适的类型来存储数据。
常见的数据类型有整型(int)、浮点型(float)、布尔型(bool)等。
变量是用来存储数据的容器,可以通过给变量赋值来存储相应的数据。
二、数据类型1. 值类型和引用类型在C#中,数据类型可分为值类型和引用类型。
值类型变量直接包含数据的实际值,而引用类型变量存储了对象的引用。
值类型在栈上分配内存,而引用类型在堆上分配内存。
2. 数组(array)数组是一种存储固定大小元素的集合,可以通过索引访问数组中的元素。
在C#中,数组可以是值类型或引用类型。
3. 字符串(string)字符串是C#中的常用数据类型,用于存储多个字符。
C#中的字符串是不可变的,即无法直接修改字符串中的字符。
可以通过使用字符串类的方法和属性来操作字符串。
三、流程控制1. 条件语句C#中的条件语句用于根据特定的条件来执行不同的代码块。
常见的条件语句有if语句、if-else语句和switch语句。
csharpskin 用法
C# Skin是一种用户界面设计工具,用于创建C#(C Sharp)编
程语言的Windows窗体应用程序的外观和样式。
C#是一种由微软开
发的面向对象的编程语言,广泛用于开发Windows应用程序和Web
应用程序。
C# Skin可以帮助开发人员创建具有吸引人外观和用户
友好界面的应用程序,提供了一种简便的方式来自定义控件的外观,包括按钮、文本框、标签等。
使用C# Skin,开发人员可以通过修改控件的外观属性来实现
自定义的界面设计,比如改变按钮的颜色、边框样式、文字样式等。
这使得开发人员可以轻松地创建个性化的应用程序界面,以满足用
户的审美需求和品牌要求。
另外,C# Skin还提供了一些预设的主题和样式,开发人员可
以直接使用这些主题和样式,而无需从头开始设计界面。
这样可以
节省开发时间,并且确保应用程序的外观符合当前的设计趋势。
总的来说,C# Skin是一个用于创建个性化和吸引人的用户界
面的工具,它为C#开发人员提供了丰富的外观定制选项,使他们能
够轻松地打造出令人印象深刻的应用程序界面。
命名规范_C(Sharp)1.命名规范a)类【规则1-1】使用Pascal规则命名类名,即首字母要大写。
【规则1-2】使用能够反映类功能的名词或名词短语命名类。
【规则1-3】不要使用“I”、“C”、“_”等特定含义前缀。
【规则1-4】自定义异常类应以Exception结尾。
【规则1-5】文件名要能反映类的内容,最好是和类同名。
b)类字段【规则2-1】用camel规则来命名类成员变量名称,即首单词(或单词缩写)小写。
【规则2-2】类字段变量名前可加“_”前缀。
【规则2-3】坚决禁止在普通变量前加“m_”(这是VC老命名规则)。
c)方法【规则3-1】方法名采用Pascal规则,第一个字符要大写。
【规则3-2】方法名应使用动词或动词短语。
【规则3-3】类中访问修饰符或功能相同的方法应该放在一起,且公共或实现接口的方法在前。
d)属性【规则4-1】使用名词定义属性,属性使用Pascal规则,首字符大写。
【规则4-2】属性和相应字段名称要关联,可以使用“重构”菜单来生成属性。
e)参数【规则5-1】参数采用camel规则命名,且首字符小写。
【规则5-2】使用描述性参数名称,参数名称应当具有最够的说明性。
【规则5-3】不要给参数加匈牙利语类型表示法的前缀。
【规则5-4】检查方法所有输入参数的有效性。
f)常量【规则6-1】只读常量使用Pascal命名规则,即首字母大写。
【规则6-2】枚举名使用Pascal规则命名,枚举成员本质属于常量,命名规则同上。
【规则6-3】枚举值从小到大顺序定义。
【规则6-4】静态字段或属性采用Pascal规则,即首字符大写。
g)接口【规则7-1】接口定义使用Pascal规则,且必须以大写“I”开头。
【规则7-2】接口名称要有意义,中间不要有下划线“_”等字符。
【规则7-3】如果类实现了接口,名称尽量和接口相同,只是省掉“I”字符。
h)事件【规则8-1】委托名称采用Pascal规则,即首字符大写。
3. 基本概念3.1 应用程序启动具有入口点 (entry point) 的程序集称为应用程序 (application)。
应用程序运行时,将创建新的应用程序域(application domain)。
同一台计算机上可能会同时运行着同一个应用程序的若干个实例,此时,每一个实例都拥有各自的应用程序域。
应用程序域用作应用程序状态的容器,以此隔离应用程序。
应用程序域作为应用程序中和它使用的类库中所定义的类型的容器和边界。
同一个类型若被加载到不同的应用程序域中就成为各自独立的客体,由它们在各自应用程序域中产生的实例亦不可直接共享。
例如,对于这些类型的静态变量,每个应用程序域都有自己的副本,并且这些类型的静态构造函数在每个应用程序域中也要(最多)运行一次。
关于如何处理程序域的创建和销毁,各实现可以按具体情况确定自己的策略或机制。
当执行环境调用指定的方法(称为应用程序的入口点)时发生应用程序启动 (application startup)。
此入口点方法总是被命名为Main,可以具有下列签名之一:static void Main() {...}static void Main(string[] args) {...}static int Main() {...}static int Main(string[] args) {...}如上所示,入口点可以选择返回一个int值。
此返回值用于应用程序终止(第 3.2 节)。
入口点可以包含一个形参(可选)。
该参数可以具有任意名称,但参数的类型必须为string[]。
如果存在形参,执行环境会创建并传递一个包含命令行实参的string[]实参,这些命令行实参是在启动应用程序时指定的。
string[]参数永远不能为 null,但如果没有指定命令行参数,它的长度可以为零。
由于 C# 支持方法重载,因此类或结构可以包含某个方法的多个定义(前提是每个定义有不同的签名)。
但在一个程序内,没有任何类或结构可以包含一个以上的名为Main的方法,因为 Main 的定义限定它只能被用作应用程序的入口点。
第一讲C#语言简介§1.1 概述C#(读作“See Sharp”)是一种简单、现代、面向对象且类型安全的编程语言, C# 起源于 C 语言家族。
C# 是面向对象的语言,然而C# 进一步提供了对面向组件(component-oriented) 编程的支持。
C#具有一个统一类型系统(unified type system)。
所有C# 类型(包括诸如int和double之类的基元类型)都继承于一个唯一的根类型:object。
因此,所有类型都共享一组通用操作,并且任何类型的值都能够以一致的方式进行存储、传递和操作。
此外,C# 同时支持用户定义的引用类型和值类型,既允许对象的动态分配,也允许轻量结构的内联存储。
为了确保C# 程序和库能够以兼容的方式逐步演进,C# 的设计中充分强调了版本控制(versioning)。
许多编程语言不太重视这一点,导致采用那些语言编写的程序常常因为其所依赖的库的更新而无法正常工作。
C# 的设计在某些方面直接考虑到版本控制的需要,其中包括单独使用的virtual和override修饰符、方法重载决策规则以及对显式接口成员声明的支持。
§1.2 Hello world按照约定俗成的惯例,我们先从“Hello, World”程序着手介绍这一编程语言。
下面是它的C# 程序:【例1.1】“Hello, World”程序。
程序名称:Hello.csusing System;class Hello{static void Main() {Console.WriteLine("Hello, World");}}C# 源文件的扩展名通常是.cs。
假定“Hello, World”程序存储在文件hello.cs 中,可以使用下面的命令行调用Microsoft C# 编译器编译这个程序:csc hello.cs编译后将产生一个名为hello.exe的可执行程序集。
csharp基本概念C#(C Sharp)是一种通用的、面向对象的编程语言,由微软公司于2000年推出。
作为一门现代化的编程语言,C#具有许多强大的功能和特性,它的语法简洁易懂,易于学习和使用。
本文将通过回答以下问题,逐步介绍C#的基本概念:1. 什么是C#?2. C#的发展历史是什么?3. C#的特点和优点有哪些?4. 如何安装和设置C#环境?5. C#的基本语法是什么样的?6. C#的变量和数据类型有哪些?7. 如何定义和使用函数?8. 如何进行条件判断和循环?9. 如何操作数组和集合?10. C#的面向对象编程特性是什么?现在让我们逐步回答这些问题,深入了解C#的基本概念。
1. 什么是C#?C#是一种基于对象的编程语言,它以C和C++为基础,并引入了一些Java 的特性。
C#旨在提供一种安全、稳定和易于使用的编程语言,用于构建各种应用程序,包括桌面应用程序、Web应用程序和移动应用程序。
2. C#的发展历史是什么?C#最早于2000年发布,是微软公司为了支持其.NET平台而推出的语言。
C#的设计目标是在保留C和C++语言优点的同时,简化语法和提供更高级的特性。
随着.NET的不断发展,C#也在不断改进和更新。
3. C#的特点和优点有哪些?C#具有多种特点和优点,包括:- 简单易学:C#的语法简洁明了,结构清晰,易于学习。
- 安全性:C#提供了许多安全机制,包括类型安全和内存管理,减少了一些常见的编程错误。
- 跨平台性:C#可以在Windows、Mac和Linux等多个平台上运行,提供了一致的开发体验。
- 面向对象:C#是一种面向对象的语言,支持封装、继承和多态等概念,使得代码更加模块化和易于维护。
- 垃圾回收:C#采用自动垃圾回收机制,减少了手动内存管理的工作量。
4. 如何安装和设置C#环境?要安装和设置C#环境,需要进行以下步骤:- 下载和安装Visual Studio:Visual Studio是一种集成开发环境(IDE),可以用于开发C#应用程序。
CSharp扩展方法扩展方法是实现新增类方法同时不改变类名称的一种技术。
可以部分的替代原本必须继承类才能够实现的功能。
但是,目前还不能扩展类的属性,也不能在不继承类的情况下而直接修改类方法。
例如在 MVC Web Application中的,我们想快速了解某个Action上是否有某个Attribute. 那我们可以使用这样的扩展方法:/// <summary>/// Gets the method./// </summary>/// <typeparam name="T">Type</typeparam>/// <param name="instance">The instance.</param>/// <param name="methodSelector">The method selector.</param>/// <returns>MethodInfo</returns>public static MethodInfo GetMethod<T>(this T instance, Expression<Func<T, object>> methodSelector){// it is not work all methodreturn ((MethodCallExpression)).Method;}/// <summary>/// Gets the method./// </summary>/// <typeparam name="T"></typeparam>/// <param name="instance">The instance.</param>/// <param name="methodSelector">The method selector.</param>/// <returns>MethodInfo</returns>public static MethodInfo GetMethod<T>(this T instance,Expression<Action<T>> methodSelector){return ((MethodCallExpression)).Method;}/// <summary>/// Determines whether the specified member has attribute./// </summary>/// <typeparam name="TAttribute">The type of the attribute.</typeparam> /// <param name="member">The member.</param>/// <returns>/// <c>true</c> if the specified member has attribute; otherwise,<c>false</c>./// </returns>public static bool HasAttribute<TAttribute>(this MemberInfo member)where TAttribute : Attribute{return GetAttributes<TAttribute>(member).Length > 0;}/// <summary>/// Gets the attributes./// </summary>/// <typeparam name="TAttribute">The type of the attribute.</typeparam> /// <param name="member">The member.</param>/// <returns></returns>public static TAttribute[] GetAttributes<TAttribute>(this MemberInfo member)where TAttribute : Attribute{var attributes =(typeof(TAttribute), true);return (TAttribute[])attributes;}如何使用,请看下面的代码,我们使用lambda表达式获取某个方法,然后获取其上面的Attribute:[Fact]public void GetHttpPostAttributeFromCreateAction(){// Arrangevar controller = GetEmployeeController(new MemeoryEmployeeBoService());//Actbool hasPostAttribute =(e => (new Employee())).HasAttribute<HttpPostAttribute>();// AssertAssert.True(hasPostAttribute);}扩展方法的实现1.首先,我们需要在项目中添加自己的一个类型,此处为ProjectExt,其中的方法与之前定义的方法大致上无区别,只是在方法中第一个参数前面添加了this关键字,this关键字必须是在方法参数中第一个参数的前面,不可以移位。
13. 接口一个接口定义一个协定。
实现某接口的类或结构必须遵守该接口定义的协定。
一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。
接口可以包含方法、属性、事件和索引器。
接口本身不提供它所定义的成员的实现。
接口只指定实现该接口的类或结构必须提供的成员。
13.1 接口声明interface-declaration是用于声明新的接口类型的type-declaration(第 9.6 节)。
interface-declaration:attributes opt interface-modifiers opt partial opt interfaceidentifier variant-type-parameter-list opt interface-base opttype-parameter-constraints-clauses opt interface-body ;optinterface-declaration由以下内容组成:一组可选attributes(第 17 章),然后依次是一组可选interface-modifiers(第 13.1.1 节)、可选partial修饰符、关键字interface和用于命名接口的identifier、可选variant-type-parameter-list规范(第 13.1.3 节)、可选interface-base规范(第 13.1.4 节)、可选type-parameter-constraints-clauses规范(第 10.1.5 节)、interface-body(第 13.1.5 节),最后是一个分号(可选)。
13.1.1 接口修饰符interface-declaration可以根据需要包含一个接口修饰符序列:interface-modifiers:interface-modifierinterface-modifiers interface-modifierinterface-modifier:newpublicprotectedinternalprivate同一修饰符在一个接口声明中多次出现属于编译时错误。
csharp基本概念-回复C#的基本概念1. 引言C#(读作C Sharp)是一种通用的面向对象编程语言,由微软公司开发并于2000年发布。
它是.NET框架的一部分,通常用于开发Windows桌面应用程序、移动应用程序、Web应用程序和游戏等。
本文将介绍C#的基本概念,包括数据类型、变量、运算符、控制结构和函数等。
2. 数据类型在C#中,数据类型用于定义变量的类型。
C#提供了许多基本数据类型,包括整数类型(byte、sbyte、short、ushort、int、uint、long、ulong)、浮点类型(float、double、decimal)、布尔类型(bool)、字符类型(char)、字符串类型(string)等。
例如,可以使用int类型来声明一个整数变量:int x = 10;。
3. 变量变量是用于存储数据的内存位置,可以通过变量名访问和操作存储的数据。
在C#中,变量必须先声明后使用。
可以使用以下语法来声明变量:数据类型变量名;。
例如,可以使用int类型来声明一个名为x的变量:int x;。
4. 运算符运算符用于执行各种数学和逻辑操作。
C#提供了一系列常用的运算符,包括算术运算符(+、-、*、/、)、关系运算符(>、<、==、!=)、逻辑运算符(&&、、!)、赋值运算符(=、+=、-=)、条件运算符(?:)等。
例如,可以使用加法运算符来计算两个整数的和:int sum = 5 + 3;。
5. 控制结构控制结构用于控制代码的执行流程。
C#提供了许多控制结构,包括条件语句(if、else、switch)、循环语句(for、while、do-while)、跳转语句(break、continue、return)等。
例如,可以使用if语句来根据条件执行不同的代码块:if (x > 0) { Console.WriteLine("x是正数"); } else { Console.WriteLine("x是负数或零"); }。
8. 语句C# 提供各种语句。
使用过 C 和 C++ 编程的开发人员熟悉其中大多数语句。
statement:labeled-statementdeclaration-statementembedded-statementembedded-statement:blockempty-statementexpression-statementselection-statementiteration-statementjump-statementtry-statementchecked-statementunchecked-statementlock-statementusing-statementyield-statementembedded-statement非终结符用于在其他语句内出现的语句。
使用embedded-statement(而非statement)便不需要在这些上下文中使用声明语句和标记语句。
下面的示例void F(bool b) {if (b)int i = 44;}将导致编译时错误,原因是if语句的 if 分支要求embedded-statement而不是statement。
若允许执行上述代码,则声明了变量i,却永远无法使用它。
但是请注意,如果是将i的声明放置在一个块中,则该示例就是有效的。
8.1 结束点和可到达性每个语句都有一个结束点 (end point)。
直观地讲,语句的结束点是紧跟在语句后面的那个位置。
复合语句(包含嵌入语句的语句)的执行规则规定了当控制到达一个嵌入语句的结束点时所采取的操作。
例如,当控制到达块中某个语句的结束点时,控制就转到该块中的下一个语句。
如果执行流程可能到达某个语句,则称该语句是可到达的 (reachable)。
相反,如果某个语句不可能被执行,则称该语句是不可到达的 (unreachable)。
在下面的示例中229void F() {Console.WriteLine("reachable");goto Label;Console.WriteLine("unreachable");Label:Console.WriteLine("reachable");}第二个Console.WriteLine调用是不可到达的,这是因为不可能执行该语句。
c#图像处理入门教程一.Bitmap类Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下:1. GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色.2. PixelFormat属性:返回图像的像素格式.3. Palette属性:获取和设置图像所使用的颜色调色板.4. Height Width属性:返回图像的高度和宽度.5. LockBits方法和UnlockBits方法:分别锁定和解锁系统内存中的位图像素.在基于像素点的图像处理方法中使用LockBits和UnlockBits是一个很好的方式,这两种方法可以使我们指定像素的范围来控制位图的任意一部分,从而消除了通过循环对位图的像素逐个进行处理,每调用LockBits之后都应该调用一次UnlockBits.二.BitmapData类BitmapData对象指定了位图的属性1. Height属性:被锁定位图的高度.2. Width属性:被锁定位图的高度.3. PixelFormat属性:数据的实际像素格式.4. Scan0属性:被锁定数组的首字节地址,如果整个图像被锁定,则是图像的第一个字节地址.5. Stride属性:步幅,也称为扫描宽度.如上图所示,数组的长度并不一定等于图像像素数组的长度,还有一部分未用区域,这涉及到位图的数据结构,系统要保证每行的字节数必须为4的倍数.三.Graphics类Graphics对象是GDI+的关键所在,许多对象都是由Graphics 类表示的,该类定义了绘制和填充图形对象的方法和属性,一个应用程序只要需要进行绘制或着色,它就必须使用Graphics对象. 四.Image类这个类提供了位图和元文件操作的函数.Image类被声明为abstract,也就是说Image类不能实例化对象,而只能做为一个基类1.FromFile方法:它根据输入的文件名产生一个Image对象,它有两种函数形式:public static Image FromFile(string filename);public static Image FromFile(string filename, bool useEmbeddedColorManagement);2.FromHBitmap方法:它从一个windows句柄处创建一个bitmap 对象,它也包括两种函数形式:public static bitmap fromhbitmap(intptr hbitmap);public static bitmap fromhbitmap(intptr hbitmap, intptr hpalette); 3. FromStream方法:从一个数据流中创建一个image对象,它包含三种函数形式:public static image fromstream(stream stream);public static image fromstream(stream stream, bool useembeddedcolormanagement);fromstream(stream stream, bool useembeddedcolormanagement, bool validateimagedata);有了上面的了解,我们便可以开始利用C#做图像处理,下面介绍几种方法:一. 打开、保存、显示图像privateBitmap srcBitmap = null;privateBitmap showBitmap = null;//打开文件privatevoid menuFileOpen_Click(object sender, EventArgs e){OpenFileDialog openFileDialog = newOpenFileDialog();openFileDialog.Filter = @"Bitmap文件(*.bmp)|*.bmp|Jpeg 文件(*.jpg)|*.jpg|所有合适文件(*.bmp,*.jpg)|*.bmp;*.jpg";openFileDialog.FilterIndex = 3;openFileDialog.RestoreDirectory = true;if (DialogResult.OK == openFileDialog.ShowDialog()){srcBitmap = (Bitmap)Bitmap.FromFile(openFileDialog.FileName, false);showBitmap = srcBitmap;this.AutoScroll = true;this.AutoScrollMinSize =newSize((int)(showBitmap.Width), (int)(showBitmap.Height));this.Invalidate();}}//保存图像文件privatevoid menuFileSave_Click(object sender, EventArgs e){if (showBitmap != null){SaveFileDialog saveFileDialog = newSaveFileDialog(); saveFileDialog.Filter =@"Bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|所有合适文件(*.bmp,*.jpg)|*.bmp;*.jpg";saveFileDialog.FilterIndex = 3;saveFileDialog.RestoreDirectory = true;if (DialogResult.OK == saveFileDialog.ShowDialog()){ImageFormat format = ImageFormat.Jpeg;switch(Path.GetExtension(saveFileDialog.FileName).ToLower()){case".jpg":format = ImageFormat.Jpeg;break;case".bmp":format = ImageFormat.Bmp;break;default:MessageBox.Show(this, "Unsupported image format was specified", "Error",MessageBoxButtons.OK,MessageBoxIcon.Error);return;}try{showBitmap.Save(saveFileDialog.FileName,format ); }catch (Exception){MessageBox.Show(this, "Failed writing image file", "Error",MessageBoxButtons.OK, MessageBoxIcon.Error); }}}}c#中将bitmap或者image保存为清晰的gif在c#中默认可以讲bitmap保存为gif等格式,但是这种保存方法保存的gif会严重失真,正常情况下的代码:1 System.Drawing.Bitmap b = new System.Drawing.Bitmap(“c://original_image.gif“);2 System.Drawing.Image thmbnail =b.GetThumbnailImage(100,75,null,new IntPtr());3 thmbnail.Save(“c://thumnail.gif“, System.Drawing.Imaging.ImageFormat.Gif);一个批量处理图片的软件,包括各种处理方式,处理效果,但是在保存为gif的时候出现了问题,在网上查了很久也没有发现一个可用的改善gif图片质量的方法,找到了一个解决办法,保存出来的gif容量大减,但是效果基本符合常规这中方法就是就是“Octree“算法。
cefsharp处理命令行参数1. 背景介绍CefSharp是一个.NET封装的Chromium Embedded Framework (CEF),它允许我们在Windows应用程序中嵌入基于Chromium 的浏览器。
在使用CefSharp构建应用程序时,我们可能需要处理一些特定的命令行参数,以满足应用程序的需求。
2. CefSharp概述CefSharp是一个功能强大的工具,它允许我们在Windows应用程序中使用基于Chromium的浏览器。
它提供了丰富的API和功能,可以方便地定制和控制浏览器的行为。
然而,在项目开发过程中,我们可能会遇到需要处理命令行参数的情况,这就需要我们了解如何在CefSharp中进行相应的处理。
3. CefSharp处理命令行参数的方法为了在CefSharp中处理命令行参数,我们可以使用CefSharpSettings类的CommandLineArgs属性。
下面是一些具体的步骤:3.1 在应用程序启动时,创建一个CefSharpSettings实例。
3.2 设置CommandLineArgs属性,将需要处理的命令行参数添加到其中。
传递给CefSharp初始化方法。
通过以上步骤,我们就可以在CefSharp中成功地处理自定义的命令行参数。
这样,我们就能够根据实际需求,定制化地控制CefSharp浏览器的行为。
4. 实际应用案例下面是一个实际的应用案例,演示了如何在CefSharp中处理命令行参数。
4.1 我们在应用程序启动时创建一个CefSharpSettings实例。
```csharpvar settings = new CefSettings();```4.2 我们添加需要处理的命令行参数到CommandLineArgs属性中。
```csharpmandLineArgs.Add("disable-gpu");```传递给CefSharp初始化方法。
CBoard 是一个基于Web 的数据可视化工具,它可以用来创建各种类型的图表和图形,包括条形图、饼图、折线图、散点图等。
CBoard 的表达式用于定义图表的属性和数据。
在CBoard 中,可以通过编写表达式来定义图表的各个属性,例如标题、坐标轴标签、颜色等。
CBoard 支持多种类型的表达式,包括字符串、数字、布尔值和数组等。
下面是一个简单的CBoard 表达式示例,用于创建一个柱状图:
csharp复制代码
{
"columns": [ "Name", "Value" ] ,
"data": [
[ "John", 23 ] ,
[ "Jane", 31 ] ,
[ "Bob", 12 ]
]
}
在这个示例中,columns属性定义了两个列标题,data属性定义了每个数据点的值。
每个数据点是一个包含两个元素的数组,第一个元素是名称,第二个元素是值。
除了上述示例中的基本表达式外,CBoard 还支持更复杂的表达式,例如数学运算、条件语句和循环等。
这些表达式可用于动态生成数据和调整图表属性。
教程01 -入门入门-创建图表与填充数据序列目录简介创建一个图表将TeeChart添加到一个窗体上图表编辑器图表数据序列集填充新的数据序列使用代码进行数据输入选择一个满足您需要的序列类型说明使用TeeChart编辑器及少量或完全无需用代码就可以创建和实现基本的图表。
TeeChart编辑器是一个二合一的编辑器,图表能与完全不同的数据序列相关联。
您可以在不插入一个数据序列的情况下来定义图表的外观,名称,图例的特性和3D样式。
您可以无需重新定义整个图表的外观样式,就可在运行时任意的添加和删除不同类型的数据序列。
图表的坐标轴是图表和数据序列的接口,这些组件可以协同工作。
一个数据序列,它的值将影响图表坐标轴的标签特征。
坐标轴的外观样式,颜色,网格密度特性和标签字体都可以在插入数据序列之前为图表定义好。
TeeChart编辑器将对大多数的值作出一个最好的估算,然后来预定义您所需要的图表和数据序列。
通过图表编辑器添加多种序列类型:TeeChart的“特殊的数据序列图表”设计模式允许你混合使用多种类型的系列,而不限于选择一组预定义的图表格式。
互联网!TeeChart Pro .Net完全兼容,在设计时,它能够放在一个 WebForm上,并且在设计时能以一个完全所见即所得的方式来编辑图表。
在运行时,您可以选择下面列出的图像格式进行输出:JPEG,GIF,PNG,TIFF,BMP 和EMF。
通过互联网应用教程获得更多信息。
此教程中强调的是轻松地从零开始建立一个图表的步骤,当您学习完后面的教程就可以修改和进一步改善图表外观和功能。
我们开始吧!创建图表将TeeChart添加到窗体中通过使用TeeChart默认的安装程序,您已经将TeeChart默认图标成功添加到Visual Studio .Net设计环境的工具箱中。
开始体验!TeeChart图表的图标是用一个圆型(饼图)图来表示的。
选择并点击工具栏中的TeeChart图标,并将其拖放到窗体上。
C#自定义控件属性与行为分类:C#2010-10-08 09:49 1337人阅读评论(1) 收藏举报控件应该定义属性而不是公共字段,因为可视化设计器在属性浏览器中显示属性,而不显示字段。
属性就像智能字段。
属性通常具有带访问函数的专用数据成员,在语法上属性被作为类的字段进行访问。
(虽然属性可以具有不同的访问级别,但此处的讨论将重点放在公共访问这种更加常见的情况上。
属性定义通常由以下两部分组成:1、专用数据成员的定义。
[c-sharp]view plaincopy1.private int number = 0;2、使用属性声明语法对公共属性进行的定义。
[c-sharp]view plaincopy1.//该语法通过 get 和 set 访问函数将专用数据成员和公共属性关联起来。
2.public int MyNumber3.{4.get5.{6.return number;7.}8.set9.{10.number = value;11.}12.}虽然属性定义中通常包含专用数据成员,但这不是必需的。
get 访问器不用访问私有数据成员就可以返回值。
get 方法返回系统时间的属性就属于这种情况。
属性启用数据隐藏,访问器方法隐藏属性的实现。
定义属性时需考虑以下重要的注意事项:1、必须将属性应用于定义的属性。
属性用来指定设计器显示属性的方式。
2、如果改变属性将影响控件的外观显示,请从set 访问器中调用Invalidate 方法(从Control 继承该方法)。
Invalidate 随后调用OnPaint 方法,该方法将重新绘制控件。
为提高效率起见,对Invalidate 的多次调用将产生对OnPaint 的一次调用。
3、 .NET Framework 类库为常见数据类型(如整数、小数、布尔值和其他数据)提供了类型转换器。
类型转换器的目的通常是用来提供字符串到数值的转换(从字符串数据转换为其他数据类型)。
常见数据类型与默认类型转换器(将数值转换为字符串,并将字符串转换为相应数据类型)相关联。
如果定义了自定义(即,非标准)数据类型的属性,则应用的属性必须将类型转换器指定为与该属性相关联。
还可以使用属性使自定义UI 类型编辑器与某个属性相关联。
UI 类型编辑器提供了一个用来编辑属性或数据类型的用户界面。
颜色选择器是UI 类型编辑器的一个示例。
例:首先创建一个名为DrawingMode 的简单枚举。
[c-sharp]view plaincopy1.public enum DrawingMode2.{3.Happy = 0,4.Sad = 1,5.Angry = 26.}接着,向该控件添加MyDrawingMode 属性[c-sharp]view plaincopy1.private DrawingMode myDrawingMode;2.[Browsable(true), Category("Appearance")]3.public DrawingMode MyDrawingMode4.{5.get6.{7.return myDrawingMode;8.}9.set10.{11.myDrawingMode = value;12.SetColors();13.}14.}对SetColors 方法的调用只是根据myDrawingMode 的值设置控件的BackColor 和ForeColor。
向控件添加下面的代码。
[c-sharp]view plaincopy1.private void SetColors()2.{3.switch (myDrawingMode)4.{5.case DrawingMode.Happy:6.this.BackColor = Color.Yellow;7.this.ForeColor = Color.Green;8.break;9.case DrawingMode.Sad:10.this.BackColor = Color.LightSlateGray;11.this.ForeColor = Color.White;12.break;13.case DrawingMode.Angry:14.this.BackColor = Color.Red;15.this.ForeColor = Color.Teal;16.break;17.default:18.this.BackColor = Color.Black;19.this.ForeColor = Color.White;20.break;21.}22.}现在可以向控件的paint方法添加代码,来绘制控件的样式,也可以添加现有的控件来组合实现想要的功能(例子里面有)。
[c-sharp]view plaincopy1.private void UserControl1_Paint(object sender, PaintEventArgs e)2.{3.Graphics curG = e.Graphics;4.Pen curPen = new Pen(Color.Black);5.Rectangle curRect = new Rectangle(0, 0, Width - 2, Height - 3);6.curG.DrawRectangle(curPen, curRect);7.curG.DrawEllipse(curPen, curRect);8.}事件(Event)事件是对象发送的消息,以发信号通知操作的发生。
操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。
引发事件的对象称为事件发送方。
捕获事件并对其作出响应的对象叫做事件接收方。
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。
所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。
.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。
代理(delegate)delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。
与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。
这样,代理就等效于一个类型安全函数指针或一个回调。
它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。
但与函数指针相比,delegate有许多函数指针不具备的优点。
首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。
在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。
其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。
也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。
实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate:1.声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
2.创建delegate对象,并将你想要传递的函数作为参数传入。
3.在要实现异步调用的地方,通过上一步创建的对象来调用方法。
[c-sharp]view plaincopy1.public class MyDelegateTest2.{3.// 步骤1,声明delegate对象4.public delegate void MyDelegate(string name);5.// 这是我们欲传递的方法,它与MyDelegate具有相同的参数和返回值类型6.public static void MyDelegateFunc(string name)7.{8.Console.WriteLine("Hello, {0}", name);9.}10.public static void Main ()11.{12.// 步骤2,创建delegate对象13.MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc);14.// 步骤3,调用delegate15.md("sam1111");16.}17.}C#中的事件处理实际上是一种具有特殊签名的delegate,象下面这个样子:[c-sharp]view plaincopy1.public delegate void MyEventHandler(object sender, MyEventArgs e);其中的两个参数,sender代表事件发送者,e是事件参数类。
MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从System.EventArgs类派生。
当然,如果你的事件不含特别的参数,那么可以直接用System.EventArgs类作为参数。
结合delegate的实现,我们可以将自定义事件的实现归结为以下几步:1:定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。
2:定义事件参数类,此类应当从System.EventArgs类派生。
如果事件不带参数,这一步可以省略。
3:定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。
4:用event关键字定义事件对象,它同时也是一个delegate对象。
5:用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。
6:在需要触发事件的地方用调用delegate的方式写事件触发方法。
一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。
名字是可以是OnEventName。
7:在适当的地方调用事件触发方法触发事件。
下面是一个例子,例子模仿容器和控件的模式,由控件触发一个事件,在容器中捕捉并且进行处理。
[c-sharp]view plaincopy1.///2./// 事件的触发者3.///4.public class Control5.{6.public delegate void SomeHandler(object sender, System.EventArgs e);7.public event SomeHandler SomeEvent;8.public Control()9.{10.//这里使用的delegate必须与事件中声名的一致11.this.SomeEvent += new SomeHandler(this.ProcessSomeEvent);12.}13.public void RaiseSomeEvent()14.{15.EventArgs e = new EventArgs();16.Console.Write("Please input 'a':");17.string s = Console.ReadLine();18.//在用户输入一个小a的情况下触发事件,否则不触发19.if (s == "a")20.{21.SomeEvent(this, e);22.}23.}24.//事件的触发者自己对事件进行处理,这个方法的参数必须和代理中声名的一致25.private void ProcessSomeEvent(object sender, EventArgs e)26.{27.Console.WriteLine("hello");28.}29.}[c-sharp]view plaincopy1.///2./// 事件的接收和处理者3.///4.class Container5.{6.private Control ctrl = new Control();7.public Container()8.{9.//这里使用的delegate必须与事件中声名的一致10.ctrl.SomeEvent += new Control.SomeHandler(this.ResponseSomeEvent);11.ctrl.RaiseSomeEvent();12.}13.public static void Main()14.{15.Container pane = new Container();16.Console.ReadLine();17.}18.//这是事件的接受者对事件的响应19.private void ResponseSomeEvent(object sender, EventArgs e)20.{21.Console.WriteLine("Some event occur!");22.}23.}[c-sharp]view plaincopy1.//程序运行的结果如下:2.please input 'a':a3.hello4.Some event occur!而我们看到的工具箱上的每个控件都有自己的图标,我们可以通过下面语句为自己制作的控件添加图标。