C# GDI+编程(一)
虽然是C++的,但总有一些相通的地方。
窗口刷新的时候,会产生Paint事件,那么我们给这个事件添加一个处理函数。然后在这个函数里画图。就能保证所画的图不被刷新掉,
它可以总是显示。Paint事件对应的委托是:public delegate void PaintEventHandler(object sender, PaintEventArgs e);
先来个最简单的绘制,在窗口上画一根线。(创建WindowsForms应用程序)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//添加Paint事件处理函数
this.Paint += formPaint;
}
private void formPaint(Object sender, PaintEventArgs e)
{
Graphics graphics = e.Graphics;
//画笔,绿色,2像素宽
Pen pen=new Pen(Color.FromArgb(0,255,0),2);
//画一根线,两点是0,0和100,100
graphics.DrawLine(pen,new Point(0,0),new Point(100,100));
}
}
像绘制直线,矩形,圆形,还有图片,都可以通过Graphics类来完成。
示例2:一个填充矩形
Graphics graphics = e.Graphics;
//蓝色画刷
SolidBrush brush = new SolidBrush(Color.FromArgb(0, 0, 255));
//一个矩形
Rectangle rect = new Rectangle(0, 0, 100, 100);
//填充一个矩形
graphics.FillRectangle(brush, rect);
示例3:画一张png图片(用PNG是因为可以显示透明的图片,GIF图片也有这个作用)
private void formPaint(Object sender, PaintEventArgs e)
{
Graphics graphics = e.Graphics;
//加载图片
Image img=Image.FromFile("d:\\Image\\win.png");
//图片显示起始位置
Point strPoint=new Point(50,50);
//不限制大小绘制
graphics.DrawImage(img, strPoint);
//缩小图片绘制,限制在一个矩形内
Rectangle rect=new Rectangle(50,50,100,100);
graphics.DrawImage(img, rect);
}
用DrawString显示文字
DrawString在Grahpics类里有好几个重载,有的可以让字符串在一个矩形内显示,有的可以使用特定的显示格式。这里就不做详细介绍了。
只讲比较常用的。
看例子吧,处理键盘输入字符事件,在窗口显示输入的字符。如下:
public partial class Form1 : Form
{
public static String strText = "";
public Form1()
{
InitializeComponent();
this.Paint += formPaint;
this.KeyPress += formKeyPress;
}
private void formPaint(Object sender, PaintEventArgs e)
{
Graphics graphics = e.Graphics;
//创建画刷
SolidBrush brush=new SolidBrush(Color.FromArgb(0,255,0));
//创建字体
Font font=new Font("宋体",20f);
//显示字符串,在一个矩形内
graphics.DrawString(strText, font, brush, this.ClientRectangle);
}
private void formKeyPress(object sender, KeyPressEventArgs e)
{
strText += e.KeyChar;
//刷新整个窗口
this.Invalidate();
}
}
还有graphics.DrawString(strText, font, brush, new Point(100, 100));显示方式,这个只是指定了文字显示的起始位置。
关于显示格式看下例:
//显示字符串,在一个矩形内
StringFormat strFormat = new StringFormat(StringFormatFlags.DirectionRightToLeft);
graphics.DrawString(strText, font, brush, this.ClientRectangle,strFormat);
StringFormatFlags是一个枚举类型,自己一个一个试吧,看看每个枚举成员表示什么样的格式。
接下来,我们来看一下。Form类中默认处理事件的方法,和你的添加的事件处理方法,这两者有什么关系。
一个示例:处理鼠标左键事件
public partial class Form1 : Form
{
private Color prBackColor;
public Form1()
{
InitializeComponent();
//窗口默认的背景颜色
prBackColor = this.BackColor;
//添加事件处理
this.MouseDown += formMouseDown;
this.MouseUp += formMouseUp;
}
//鼠标键按下事件处理方法
private void formMouseDown(object sender, MouseEventArgs e)
{
//如果是鼠标右键按下
if (e.Button == MouseButtons.Right)
{
Form1 form1 = (Form1)sender;
//改变背景颜色
form1.BackColor = Color.FromArgb(0, 255, 0);
}
}
//鼠标键弹起(松开)事件处理方法
private void formMouseUp(object sender, MouseEventArgs e)
{
if(e.Button==MouseButtons.Right)
{
Form1 form1 = (Form1)sender;
form1.BackColor = prBackColor;
}
}
}
像鼠标键按下MouseDown和鼠标键松开,Form都有默认的事件处理方法,这些方法都是虚方法,你可以重写它们,比如重写
protected virtual void OnMouseDown(MouseEventArgs e);和protected virtual void OnMouseUp(MouseEventArgs e);
这样就可以不必添加事件处理方法,也能处理鼠标事件了,可以通过重写父类默认事件处理方法,来实现上面的例子。
而在查MSDN可以发现,像这些默认的事件处理方法,调用都能引发其对应的事件。比如,我调用了OnMouseDown就能引发鼠标左键按下事件,其实也就是执行了我们添加的事件处理方法(委托)。而且我们还是多播委托的,因为我们是用"+="添加委托方法的。
这样的话,如果你重写了OnMouseDown一定要在里面调用基类的OnMouseDown方法,
不然我们添加的MouseDown方法就不会被执行(如果有)
那么知道了上面那些,我就来做一个实际例子吧。重写OnPaintBackground绘制背景的方法。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//重写OnPaintBackground方法
protected override void OnPaintBackground(PaintEventArgs e)
{
//禁止基类处理,我们自己来绘制背景
//base.OnPaintBackground(e);
//透明背景画刷
SolidBrush brush=new SolidBrush(Color.Transparent);
//填充整个窗口
e.Graphics.FillRectangle(brush,this.ClientRectangle);
//再画一个圆圈
Pen pen = new Pen(Color.FromArgb(0, 255, 0),3);
e.Graphics.DrawEllipse(pen, this.ClientRectangle);
}
}
TextureBursh图片画刷
可以用图片来填充一个形状,如矩形,圆形。图片不够大则平铺显示。
示例:
private void formPaint(Object sender, PaintEventArgs e)
{
Graphics graphics = e.Graphics;
//创建图片画刷
Rectangle rect = new Rectangle(10, 10, 70, 70);
TextureBrush brush = new TextureBrush(Image.FromFile("d:\\Image\\345.jpg"),rect);
graphics.FillEllipse(brush, 0, 0, 200, 200);
}
构造函数最后一个参数,rect表示要用图片的哪部分进行填充,10,10表示图片起始位置(左上角),70,70表示宽度和高度,注意不能超出图片原有范围。整张图片填充的话,则不需要指定rect。构造函数里填一个参数就行了。
LinearGradientBursh线性渐变画刷(这个类存在于System.Drawing.Drawing2D命名空间里)
LinearGradientBursh类有一个构造函数重载,它有四个参数,是两个点,和两种颜色。
这四个参数指定了起始点的颜色,和结束点的颜色。还有位置。
看下例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Paint += formPaint;
}
private void formPaint(Object sender, PaintEventArgs e)
{
Graphics graphics = e.Graphics;
LinearGradientBrush lineBrush = new LinearGradientBrush(new Point(0, 0), new Point(50, 0),
Color.FromArgb(255, 255, 255), Color.FromArgb(0, 0, 0));
//填充整个窗口
graphics.FillRectangle(lineBrush,this.ClientRectangle);
}
}
起始点是0,0 结束点是0,50的效果图。从白色到黑色的渐变颜色段。超过50的部分,又开始重新渐变。
就好比在使用PS的时候,渐变颜色是白到黑,然后拉一根线。起始点是0,0,结束点是0,50。
那么如果我用这个属性的渐变画刷在窗口随便画一个矩形是什么样的呢,看上面效果图就可以知道。
比如 graphics.FillRectangle(lineBrush, 0, 0, 100, 100);
这个矩形的画刷填充跟第一张效果的对应的矩形区域是一样的。
如果改变起始点和结束点的值,也可以看得出来。这其中是按着什么方式来填充的。
比如起始点改成0,0,结束点改变50,50。
private void formPaint(Object sender, PaintEventArgs e)
{
Graphics graphics = e.Graphics;
LinearGradientBrush lineBrush = new LinearGradientBrush(new Point(0, 0), new Point(50, 50),
Color.FromArgb(255, 255, 255), Color.FromArgb(0, 0, 0));
//填充整个窗口
graphics.FillRectangle(lineBrush, this.ClientRectangle);
Pen pen = new Pen(Color.FromArgb(0, 255,0));
graphics.DrawRectangle(pen, 0, 0, 50, 50);
}
在里面绘制填充图形,就是按上面的规则来显示的。这个窗口并没有禁止掉最大化功能,可以改变窗口大小以便更进一步的观察。
多种颜色渐变
LinearGradientBrush类有个InterpolationColors属性成员可以指定多种颜色渐变,这个成员是一个ColorBlend类型,像之前的渐变,都只能限于两种颜色的渐变,使用了InterpolationColors后,就可以使用多种,如从红到绿的渐变,然后绿到蓝。
看示例:
private void formPaint(Object sender, PaintEventArgs e)
{
//创建ColorBlend对象,指定多种颜色渐变信息
ColorBlend color_blend=new ColorBlend();
//指定几种颜色
color_blend.Colors=new Color[]{Color.Red,Color.Green,Color.Blue};
//指定颜色的范围
color_blend.Positions=new float[]{0/3f,2/3f,3/3f};
Rectangle rect=new Rectangle(0,0,200,100);
//创建渐变画刷
LinearGradientBrush brush=
new LinearGradientBrush(new Point(0,0),new Point(200,0),Color.White,Color.White);
brush.InterpolationColors=color_blend;
e.Graphics.FillRectangle(brush,rect);
}
color_blend.Colors数组是指定有多少颜色渐变,比如上面就是红绿蓝,那么渐变应该是这样的,从红到绿渐变,然后从绿到蓝渐变。
color_blend.Positions指定颜色的范围,如把那上面那个矩形宽度看作整体1的话,那么红到绿渐变,是从0/3f至2/3f完成的,也就是在这个
范围内完成了红到绿的渐变,那么绿到蓝渐变的范围就是2/3f至3/3f。
如果要各占一半的话,那就是color_blend.Positions=new float[]{0/2f,1/2f,2/2f};
更多C# GDI+编程(一)相关文章请关注PHP中文网!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les méthodes d'utilisation des symboles dans la couverture du langage C Couverture arithmétique, l'affectation, les conditions, la logique, les opérateurs de bits, etc. Les opérateurs arithmétiques sont utilisés pour les opérations mathématiques de base, les opérateurs d'affectation sont utilisés pour les opérations et les opérations de la soustraction, la multiplication et les opérations de division, les opérations BIT sont utilisé pointeurs nuls, marqueurs de fin de fichier et valeurs non nucères.

La différence entre le multithreading et l'asynchrone est que le multithreading exécute plusieurs threads en même temps, tandis que les opérations effectuent de manière asynchrone sans bloquer le thread actuel. Le multithreading est utilisé pour les tâches à forte intensité de calcul, tandis que de manière asynchrone est utilisée pour l'interaction utilisateur. L'avantage du multi-threading est d'améliorer les performances informatiques, tandis que l'avantage des asynchrones est de ne pas bloquer les threads d'interface utilisateur. Le choix du multithreading ou asynchrone dépend de la nature de la tâche: les tâches à forte intensité de calcul utilisent le multithreading, les tâches qui interagissent avec les ressources externes et doivent maintenir la réactivité de l'interface utilisateur à utiliser asynchrone.

Le Array Char stocke des séquences de caractères en C et est déclaré Char Array_name [Taille]. L'élément d'accès est passé par l'opérateur d'indice, et l'élément se termine par le terminateur nul «\ 0», qui représente le point final de la chaîne. Le langage C fournit une variété de fonctions de manipulation de cordes, telles que strlen (), strcpy (), strcat () et strcmp ().

En C, le type de char est utilisé dans les chaînes: 1. Stockez un seul caractère; 2. Utilisez un tableau pour représenter une chaîne et se terminer avec un terminateur nul; 3. Faire fonctionner via une fonction de fonctionnement de chaîne; 4. Lisez ou sortant une chaîne du clavier.

Dans le langage C, les caractères spéciaux sont traités à travers des séquences d'échappement, telles que: \ n représente les pauses de ligne. \ t signifie le caractère d'onglet. Utilisez des séquences d'échappement ou des constantes de caractères pour représenter des caractères spéciaux, tels que char c = '\ n'. Notez que l'arrière-plan doit être échappé deux fois. Différentes plates-formes et compilateurs peuvent avoir différentes séquences d'échappement, veuillez consulter la documentation.

Dans le langage C, la conversion de type char peut être directement convertie en un autre type par: Casting: Utilisation de caractères de casting. Conversion de type automatique: Lorsqu'un type de données peut accueillir un autre type de valeur, le compilateur le convertit automatiquement.

Il n'y a pas de fonction de somme intégrée dans le langage C, il doit donc être écrit par vous-même. La somme peut être obtenue en traversant le tableau et en accumulant des éléments: Version de boucle: la somme est calculée à l'aide de la longueur de boucle et du tableau. Version du pointeur: Utilisez des pointeurs pour pointer des éléments de tableau, et un résumé efficace est réalisé grâce à des pointeurs d'auto-incitation. Allouer dynamiquement la version du tableau: allouer dynamiquement les tableaux et gérer la mémoire vous-même, en veillant à ce que la mémoire allouée soit libérée pour empêcher les fuites de mémoire.

Dans le langage C, la principale différence entre Char et WCHAR_T est le codage des caractères: Char utilise ASCII ou étend ASCII, WCHAR_T utilise Unicode; Char prend 1 à 2 octets, WCHAR_T occupe 2-4 octets; Char convient au texte anglais, WCHAR_T convient au texte multilingue; Le char est largement pris en charge, WCHAR_T dépend de la prise en charge du compilateur et du système d'exploitation Unicode; Le char est limité dans la gamme de caractères, WCHAR_T a une gamme de caractères plus grande et des fonctions spéciales sont utilisées pour les opérations arithmétiques.
