GDI+简介及其应用示例

随着C# WINFORMS应用程序功能的越来越复杂,需求的越来越多,那么不得不提到2个重要的接口Windows API和GDI(或者说GDI+),今天就来讲解下GDI+及其一些应用示例。

GDI(graphic device interface,图形设备接口),负责在屏幕和打印机上输出信息。GDI+是GDI的后续版本。

要使用GDI+,首先应该创建Graphics类对象(简单的来说,Graphics类对象就相当于画布,没画布我们在什么地方绘图呢?),然后调用一系列绘图方法即可,最后再释放资源(调用Graphics类对象的Dispose()方法)。

那么,第一步,创建Graphics类对象的几种方式如下

方式一,

Form类的CreateGraphics()方法。

例如:this.CreateGraphics(); //这里的this指的是当前form类

方式二,

重写Form类的OnPaint事件方法,通过其中的PaintEventArgs对象的Graphics属性来创建。

例如:override void OnPaint(PaintEventArgs e)
        {
           Graphics g = e.Graphics;

        }

通过以上2种方式的了解,我们可以知道Form类的派生控件都可以生成Graphics对象,例如button、picturebox都有CreateGraphics()方法。

方式三,

把现有的图像转换为Graphics对象,参数是Image类的任何派生类。例如:

Bitmap bmap = new Bitmap("e:/test/1.jpg");//当然也可以指定宽高度进行创建
Graphics g = Graphics.FromImage(bmap);

第二步,认识基本的GDI+对象,辅助制图

1,画笔Pen对象:

Pen pen = new Pen(Color.Red);或使用系统预设的画笔,如Pen pen = Pens.Black;

可以指定一些常见属性

Width; //画笔粗细属性

Color; //画笔颜色属性

DashStyle;//画线类型属性,如pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;点线

2,笔刷对象,主要如下几种:

实心笔刷 SolidBrush solidBrush = new SolidBrush(Color.Red);//笔刷颜色为红色

阴影笔刷,在System.Drawing.Drawing2D命名空间下

HatchBrush hatchBrush = new HatchBrush(HatchStyle.Vertical,Color.Blue,Color.Green);//笔刷的阴影样式为垂直,前景色为蓝色,背景色为绿色

纹理阴影笔刷,可以理解为以图像为填充的笔刷

 Image img1 = Image.FromFile("e:/test/1.jpg");
 TextureBrush textureBrush = new TextureBrush(img1);

 渐变笔刷,顾名思义吧

LinearGradientBrush lgbrush = new LinearGradientBrush(ClientRectangle,Color.Blue,Color.Green,LinearGradientMode.Horizontal);//参数解释,ClientRectangle为笔刷填充的范围是整个当前Form对象;渐变色由蓝色到绿色;渐变模式为水平

3,颜色对象Color

使用系统预设的Color的枚举,例如红色Color.Red;

自定义颜色 Color color = Color.FromArgb(100,110,120,130);//参数解释,100为透明度,后面为红绿蓝RGB的值

4,字体Font

Font font = new Font("黑体",24);也可用FontFamily类详细指定格式如

 FontFamily fontFamily = new FontFamily("华文行楷");
 Font font = new Font(fontFamily,16,FontStyle.Regular);

第三步,绘制基本图形

画线 g.DrawLine(pen,0,0,10,10); //用画笔工具在始终点进行画线

画矩形 g.DrawRectangle(pen,20,20,30,40);//用画笔工具在起点画宽度为30,长度为40的矩形

画椭圆 g.DrawEllipse(pen,30,10,20,20);//用画笔工具在圆心(30,10)横向半径为20,纵向半径为20的椭圆

画多边形 g.DrawPolygon(pen, new PointF[] { new PointF(1, 2), new PointF(20, 10), new PointF(100, 20), new PointF(200, 50), new PointF(39, 45) });

填充矩形 g.FillRectangle(sredbrush, 20, 20, 30, 40);

填充椭圆 g.FillEllipse(sredbrush, 30, 10, 20, 20);

填充多边形 g.FillPolygon(sredbrush, new PointF[] { new PointF(1, 2), new PointF(20, 10), new PointF(100, 20), new PointF(200, 50), new PointF(39, 45) });

填充扇形 g.FillPie(sredbrush, new Rectangle(20, 20, 30, 40), 90, 180); //从90度开始填充到180度

第四步,绘制文本

Font font = new Font("华文行楷",24);

 g.DrawString("文本内容",font,sredbrush,50,50);//在指定坐标处绘制文本

g.DrawString("文本内容,在矩形范围内将不断字换行",font,sredbrush,new RectangleF(50,80,80,100));

第五步,绘制图像

  Bitmap bitmap = new Bitmap("e:/test/1.jpg");
  g.DrawImage(bitmap,0,0);//在指定位置开始绘制图像,或者

Image img = Image.FromFile("e:/test/1.jpg");
g.DrawImage(img,0,0);

验证码的示例:主要方法代码如下

//生成验证码图片,并在pbchecknum中显示 count为生成验证码的位数

void CreateCheckNum(int count) {
            //生成4位验证码
            string checkCode = "";
            string str = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
            string[] strs = str.Split(',');
            Random random=new Random();
            for (int i = 1; i <= count; i++)
            {
                checkCode+=strs[random.Next(0,strs.Length)];
            }
            checkNum=checkCode;
            //生成验证码图像
            Bitmap bg = new Bitmap((int)Math.Ceiling(checkCode.Length*12.5),22);
            Graphics g = Graphics.FromImage(bg);
            Font font=new Font("Arail",12,FontStyle.Bold);
            LinearGradientBrush lgbrush=new LinearGradientBrush(new Rectangle(0,0,bg.Width,bg.Height),Color.Blue,Color.DarkRed,LinearGradientMode.Horizontal);
            g.DrawString(checkCode,font,lgbrush,2,2);
            //画干扰线
            for (int i = 0; i < 4; i++)
            {
                int x1 = random.Next(bg.Width);
                int x2 = random.Next(bg.Width);
                int y1 = random.Next(bg.Height);
                int y2 = random.Next(bg.Height);
                g.DrawLine(new Pen(Color.GreenYellow),x1,y1,x2,y2);
            }
            //画干扰点
            for (int i = 0; i < 100; i++)
            {
                int x = random.Next(bg.Width);
                int y = random.Next(bg.Height);
                bg.SetPixel(x,y,Color.FromArgb(random.Next()));
            }
            //画边框
            g.DrawRectangle(new Pen(Color.Red),new Rectangle(0,0,bg.Width-1,bg.Height-1));
            pbchecknum.Image = bg;//在pbchecknum中显示
            //释放资源
            g.Dispose();
        }

最终效果图如下,其他的功能自己试着完善,不了解的还可以咨询下我

GDI+简介及其应用示例 - 天涯的海风 - 天涯的海风

有关ASP.NET的GDI+生成验证码的主体部分没有多少区别,关键就是最终把当前页面作为图片生成,并且放在输出流种输出。验证码字符串保存在COOKIE或者SESSION中。最后通过图片控件指向此页面,点击超链接使图片控件进行URL重写再次指向此页面即可完成局部更新验证码!主要代码我找时间贴出来!

来了,现在贴出来了,就几行,了解就行,呵呵

//保存验证码字符串

Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));
 //Session["CheckCode"] = checkCode;//用于客户端校验码比较

//把当前页作为图片生成,方便调用,当然这要放在啊释放资源前面

System.IO.MemoryStream ms = new System.IO.MemoryStream();
            bg.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            Response.ClearContent();
            Response.ContentType = "image/Jpeg";
            Response.BinaryWrite(ms.ToArray());

Visual C++6.0使用GDI+的一般方法 1. 载解压GDI+开发包; 2. 正确设置include & lib 目录; 3. stdafx.h 添加: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include 4. 程序中添加GDI+的包含文件gdiplus.h以及附加的类库gdiplus.lib。 通常gdiplus.h包含文件添加在应用程序的stdafx.h文件中,而gdiplus.lib可用两种进行添加: 第一种是直接在stdafx.h文件中添加下列语句: #pragma comment( lib, "gdiplus.lib" ) 另一种方法是: 在VC.net中添加库文件在:项目菜单->属性->链接器->输入 举个例子: (1)在应用程序项目的应用类中,添加一个成员变量,如下列代码: ULONG_PTR m_gdiplusToken; 其中,ULONG_PTR是一个DWORD数据类型,该成员变量用来保存GDI+被初始化后在应用程序中的GDI+标识,以便能在应用程序退出后,引用该标识来调用Gdiplus:: GdiplusShutdown来关闭GDI+。 (2)在应用类中添加ExitInstance的重载,并添加下列代码用来关闭GDI+: int CGDITestApp::ExitInstance() { Gdiplus::GdiplusShutdown(m_gdiplusToken); return CWinApp::ExitInstance(); } (3)在应用类的InitInstance函数中添加GDI+的初始化代码: 注意:下面这些GDI+的初始化代码必须放在m_pMainWnd->UpdateWindow();之前。 CWinApp::InitInstance(); Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); (4)在需要绘图的窗口或视图类中添加GDI+的绘制代码。 下面分别就单文档和基于对话框应用程序为例,说明使用GDI+的一般过程和方法。 1. 在单文档应用程序中使用GDI+ 在上面的过程中,我们就是以一个单文档应用程序Ex_GDIPlus作为示例的。下面列出第4步所涉及的代码: void CGDITestView::OnDraw(CDC* pDC) { CGDITestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here usingnamespace Gdiplus; Graphics graphics(pDC->m_hDC); Pen newPen(Color(255,0,0),3); HatchBrush newBrush(HatchStyleCross,Color(255,0,255,0),Color(255,0,0,255));//创建一个填充画刷,前景色为绿色,背景色为蓝色 graphics.DrawRectangle(&newPen,50,50,100,60);// 在(50,50)处绘制一个长为100,高为60的矩形 graphics.FillRectangle(&newBrush,50,50,100,60); // 在(50,50)处填充一个长为100,高为60的矩形区域 } 编译并运行,结果如图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值