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中文网!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Kaedah penggunaan simbol dalam bahasa C meliputi aritmetik, tugasan, syarat, logik, pengendali bit, dan lain-lain. Operator aritmetik digunakan untuk operasi matematik asas, pengendali tugasan digunakan untuk penugasan dan penambahan, penolakan, pendaraban dan tugasan pembahagian, pengendali keadaan digunakan untuk operasi yang digunakan untuk operasi yang digunakan untuk Operasi Bit untuk Penunjuk null, penanda akhir fail, dan nilai bukan angka.

Arus char menyimpan urutan watak dalam bahasa C dan diisytiharkan sebagai array_name char [saiz]. Unsur akses diluluskan melalui pengendali subskrip, dan elemen berakhir dengan terminator null '\ 0', yang mewakili titik akhir rentetan. Bahasa C menyediakan pelbagai fungsi manipulasi rentetan, seperti strlen (), strcpy (), strcat () dan strcmp ().

Perbezaan antara multithreading dan asynchronous adalah bahawa multithreading melaksanakan pelbagai benang pada masa yang sama, sementara secara tidak sengaja melakukan operasi tanpa menyekat benang semasa. Multithreading digunakan untuk tugas-tugas yang berintensifkan, sementara asynchronously digunakan untuk interaksi pengguna. Kelebihan multi-threading adalah untuk meningkatkan prestasi pengkomputeran, sementara kelebihan asynchronous adalah untuk tidak menghalang benang UI. Memilih multithreading atau asynchronous bergantung kepada sifat tugas: tugas-tugas intensif pengiraan menggunakan multithreading, tugas yang berinteraksi dengan sumber luaran dan perlu menyimpan respons UI menggunakan asynchronous.

Dalam C, jenis char digunakan dalam rentetan: 1. Simpan satu watak; 2. Gunakan array untuk mewakili rentetan dan berakhir dengan terminator null; 3. Beroperasi melalui fungsi operasi rentetan; 4. Baca atau output rentetan dari papan kekunci.

Dalam bahasa C, watak -watak khas diproses melalui urutan melarikan diri, seperti: \ n mewakili rehat garis. \ t bermaksud watak tab. Gunakan urutan melarikan diri atau pemalar watak untuk mewakili watak khas, seperti char c = '\ n'. Perhatikan bahawa backslash perlu melarikan diri dua kali. Platform dan penyusun yang berbeza mungkin mempunyai urutan melarikan diri yang berbeza, sila rujuk dokumentasi.

Dalam bahasa C, penukaran jenis char boleh ditukar secara langsung kepada jenis lain dengan: Casting: Menggunakan aksara pemutus. Penukaran Jenis Automatik: Apabila satu jenis data dapat menampung jenis nilai lain, pengkompil secara automatik menukarkannya.

Tiada fungsi jumlah terbina dalam dalam bahasa C, jadi ia perlu ditulis sendiri. Jumlah boleh dicapai dengan melintasi unsur -unsur array dan terkumpul: Versi gelung: SUM dikira menggunakan panjang gelung dan panjang. Versi Pointer: Gunakan petunjuk untuk menunjuk kepada unsur-unsur array, dan penjumlahan yang cekap dicapai melalui penunjuk diri sendiri. Secara dinamik memperuntukkan versi Array: Perlawanan secara dinamik dan uruskan memori sendiri, memastikan memori yang diperuntukkan dibebaskan untuk mengelakkan kebocoran ingatan.

Dalam bahasa C, perbezaan utama antara char dan wchar_t adalah pengekodan aksara: char menggunakan ASCII atau memanjangkan ASCII, WCHAR_T menggunakan unicode; Char mengambil 1-2 bait, wchar_t mengambil 2-4 bait; Char sesuai untuk teks bahasa Inggeris, WCHAR_T sesuai untuk teks berbilang bahasa; CHAR disokong secara meluas, WCHAR_T bergantung kepada sama ada penyusun dan sistem operasi menyokong Unicode; Char adalah terhad dalam pelbagai watak, WCHAR_T mempunyai pelbagai watak yang lebih besar, dan fungsi khas digunakan untuk operasi aritmetik.
