Windows窗体的.Net框架绘图技术实现方法

本文实例讲述了Windows窗体的.Net框架绘图技术实现方法,非常实用,具体内容如下:

一般来说,当编写一个典型的Windows 窗体程序时,窗体和控件的绘制、效果等操作是不需要特别加以考虑的。这是为什么呢?因为通过使用 .Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写一些简单的与事件相关联的代码然后在IDE中按F5,一个完完全全的窗体程序就诞生了!所有控件都将自己绘制自己,窗体或者控件的大小和缩放都调整自如。在这里经常会用到的,且需要引起一点注意的就是控件效果。游戏,自定义图表控件以及屏幕保护程序的编写会需要程序员额外撰写用于响应 Paint 事件的代码。

  本文针对那些Windows 窗体开发人员并有助于他们在应用程序编制过程中使用简单的绘图技术。首先,我们会讨论一些基本的绘图概念。到底谁在负责进行绘制操作?Windows 窗体程序是如何知道何时该进行绘制的?那些绘制代码究竟被放置在哪里?之后,还将介绍图像绘制的双重缓冲区技术,你将会看到它是怎样工作的,怎样通过一个方法来实现缓存和实际显示的图像间的交替。最后,我们将会探讨”智能无效区域”,实际就是仅仅重绘或者清除应用程序窗体上的无效部分,加快程序的显示和响应速度。希望这些概念和技术能够引导读者阅读完本文,并且有助于更快和更有效的开发Windows 窗体程序。

  Windows 窗体使用GDI+图像引擎,在本文中的所有绘图代码都会涉及使用托管的.Net 框架来操纵和使用Windows GDI+图像引擎。

  尽管本文用于基本的窗体绘图操作,但是它同样提供了快速的、有效的且有助于提高程序性能的技术和方法。所以,在通读本文之前建议读者对.Net框架有个基本的了解,包括Windows 窗体事件处理、简单的GDI+对象譬如Line,Pen和Brush等。熟悉Visual Basic .Net或者C#编程语言。

概念

  Windows 应用程序是自己负责绘制的,当一个窗体”不干净”了,也就是说窗体改变了大小,或者部分被其它程序窗体遮盖,或者从最小化状态恢复时,程序都会收到需要绘制的信息。Windows把这种”不干净”状态称为”无效的(Invalidated)”状态,我们理解为:需要重绘,当Windows 窗体程序需要重绘窗体时它会从Windows消息队列中获取绘制的信息。这个信息经过.Net框架封装然后传递到窗体的 PaintBackground 和 Paint 事件中去,在上述事件中适当的书写专门用于绘制的代码即可。

  简单的绘图示例如下:

   using System;
   using System.Drawing;
   using System.Windows.Forms;
   public class BasicX : Form
   {
   public BasicX()
   {
   InitializeComponent();
   }
   private void BasicX_Paint(object sender,  PaintEventArgs e)
   {
   Graphics g = e.Graphics;
   Pen p = new Pen(Color.Red);
   int width = ClientRectangle.Width;
   int height= ClientRectangle.Height;
   g.DrawLine(p, 0,0, width, height);
   g.DrawLine(p, 0, height, width, 0);
   p.Dispose();
   }
   private void InitializeComponent()
   {
   this.SetStyle(ControlStyles.ResizeRedraw,  true);
   this.ClientSize = new  System.Drawing.Size(300, 300);
   this.Text = "BasicX";
   this.Paint += new  PaintEventHandler(this.BasicX_Paint);
   }
   [System.STAThreadAttribute()]
   public static void Main()
   {
   Application.Run(new BasicX());
   }
   }

  上述代码分成两个基本的步骤来创建示例程序。首先 InitializeComponent 方法包含一些属性的设置和附加窗体 Paint 事件的处理过程。注意,在方法中控件的样式也同时被设置,设置控件的样式也是自定义Windows 窗体及控件行为的一种有效途径,譬如:控件的"ResizeRedraw"属性指示当窗体的大小变化发生以后需要对其完全进行重绘,也就是说重绘时总是需要对整个窗体的客户区域进行重绘。窗体的“客户区域”是指除了标题栏和边框的所有窗体区域。可以进行一个有趣的试验,取消该控件的属性然后再运行程序,我们可以很明显的看出为什么该属性会被经常的设置,因为窗体调整大小后的无效区域根本不会被重绘。

  好了,我们需要注意一下BasicX_Paint方法,正如先前所提到的,Paint 事件在程序需要重绘时被激活,程序窗体利用Paint事件来负责回应需要重绘的系统消息,BasicX_Paint方法的调用需要一个对象 sender 和一个PaintEventArgs类型的变量,PaintEventArgs类的实例或称之为变量 e 封装了两个重要的数据,第一个就是窗体的 Graphics 对象,该对象表示窗体可绘制的表面也称之为画布用于绘制诸如线、文本以及图像等,第二个数据就是ClipRectangle,该Rectangle对象表示窗体上无效的的矩形范围,或者说就是窗体需要重绘的区域。记住,当窗体的ResizeRedDraw设置后,调整大小后该ClipRectangle的大小实际就等于窗体整个客户区域的大小,或者是被其它程序窗体遮盖的那部分剪切区域。关于部分剪切区域的用处我们会在智能重绘章节作更详细的阐述。

双重缓冲区绘图技术

  双重缓冲区技术能够使程序的绘图更加快速和平滑,有效减少绘制时的图像闪烁。该技术的基本原理是先将图像绘制到内存中的一块画布上,一旦所有的绘制操作都完成了,再将内存中的画布推到窗体的或者控件的表面将其显示出来。通过这种操作后的程序能使用户感觉其更加快速和美观。

  下面提供的示例程序能够阐明双重缓冲区的概念和实现方法,这个示例所包含的功能已相当完整,且完全可以在实际应用中使用。在该章节后面还会提及该技术应该配合控件的一些属性设置才能达到更好的效果。

  要想领略双重缓冲区绘图技术所带来的好处就请运行SpiderWeb示例程序吧。程序启动并运行后对窗口大小进行调整,你会发现使用这种绘图算法的效率不高,并且在调整大小的过程中有大量的闪烁出现。

不具备双重缓冲区技术的SpiderWeb示例程序

  纵观程序的源码你会发现在程序Paint事件激活后是通过调用LineDrawRoutine方法来实现线的绘制的。LineDrawRoutine方法有两个参数,第一个是Graphics对象是用于绘制线条的地方,第二个是绘图工具Pen对象用来画线条。代码相当简单,一个循环语句,LINEFREQ常量等,程序从窗体表面的左下一直划线到其右上。请注意,程序使用浮点数来计算在窗体上的绘制位置,这样做的好处就是当窗体的大小发生变化时位置数据会更加精确。

   private void LineDrawRoutine(Graphics g,  Pen p)
   {
   float width = ClientRectangle.Width;
   float height = ClientRectangle.Height;
   float xDelta = width / LINEFREQ;
   float yDelta = height / LINEFREQ;
   for (int i = 0; i < LINEFREQ; i++)
   {
   g.DrawLine(p, 0, height - (yDelta * i),  xDelta * i, 0);
   }
   }

撰写很简单的用于响应Paint事件SpiderWeb_Paint的代码,正如前面所提到的,Graphics对象就是从Paint事件参数PaintEventArgs对象中提取出来的表示窗体的绘制表面。这个Graphics对象连同新创建Pen对象一起传递给LineDrawRoutine方法来画出蜘蛛网似的线条,使用完Graphics对象和Pen对象后释放其占用的资源,那么整个绘制操作就完成了。

   private void SpiderWeb_Paint(object sender,  PaintEventArgs e)
   {
   Graphics g = e.Graphics;
   Pen redPen = new Pen(Color.Red);
   LineDrawRoutine(g, redPen);
   redPen.Dispose();
   g.Dispose();
   }

  那么到底作怎么样的改动才能使上面的SpiderWeb程序实现简单的双重缓冲区技术呢?原理其实相当简单,就是将应该画到窗体表面的绘制操作改成先画到内存中的位图上,LineDrawRoutine向这个在内存中隐藏的画布执行同样的蜘蛛网绘制操作,等到绘制完毕再通过调用Graphics.DrawImage方法将隐藏的画布上内容推到窗体表面来显示出来,最后,再加上一些小的改动一个高性能的绘图窗体程序就完成了。

请比较下面双重缓冲区绘图事件与前面介绍的简单绘图事件间的区别:

   private void SpiderWeb_DblBuff_Paint(object  sender, PaintEventArgs e)
   {
   Graphics g = e.Graphics;
   Pen bluePen = new Pen(Color.Blue);
   Bitmap localBitmap = new  Bitmap(ClientRectangle.Width,ClientRectangle.Height);
   Graphics bitmapGraphics =  Graphics.FromImage(localBitmap);
   LineDrawRoutine(bitmapGraphics, bluePen);
   //把在内存里处理的bitmap推向前台并显示
   g.DrawImage(localBitmap, 0, 0);
   bitmapGraphics.Dispose();
   bluePen.Dispose();
   localBitmap.Dispose();
   g.Dispose();
   }

  上面的示例代码创建了内存位图对象,它的大小等于窗体的客户区域(就是绘图表面)的大小,通过调用Graphics.FromImage将内存中位图的引用传递给Graphics对象,也就是说后面所有对该Graphics对象的操作实际上都是对内存中的位图进行操作的,该操作在C++中等同于将位图对象的指针复制给Graphics对象,两个对象使用的是同一块内存地址。现在Graphics对象表示的是屏幕后方的一块画布,而它在双重缓冲区技术中起到至关重要的作用。所有的线条绘制操作都已经针对于内存中的位图对象,下一步就通过调用DrawImage方法将该位图复制到窗体,蜘蛛网的线条就会立刻显示在窗体的绘制表面而且丝毫没有闪烁出现。

  这一系列的操作完成后还不是特别有效,因为我们先前提到了,控件的样式也是定义Windows 窗体程序行为的一条途径,为了更好的实现双重缓冲区必须设置控件的Opaque属性,这个属性指明窗体是不负责在后台绘制自己的,换句话说,如果这个属性设置了,那么必须为清除和重绘操作添加相关的代码。具备双重缓冲区版本的SpiderWeb程序通过以上的设置在每一次需要重绘时都表现良好,窗体表面用其自己的背景色进行清除,这样就更加减少了闪烁的出现。

   public SpiderWeb_DblBuff()
   {
   SetStyle(ControlStyles.ResizeRedraw |  ControlStyles.Opaque, true);
   }
   private void SpiderWeb_DblBuff_Paint(object  sender, PaintEventArgs e)
   {
   Bitmap localBitmap = new  Bitmap(ClientRectangle.Width,
   ClientRectangle.Height);
   Graphics bitmapGraphics =  Graphics.FromImage(localBitmap);
   bitmapGraphics.Clear(BackColor);
   LineDrawRoutine(bitmapGraphics, bluePen);
   }

  结果怎么样?图像的绘制平滑多了。从内存中将蜘蛛网的线条推到前台以显示出来是完全没有闪烁的,但是我们还是稍微停顿一下,先将内存中的位图修整一下再显示出来,可以添加一行代码以便使线条看上去更加平坦。

   bitmapGraphics.SmoothingMode =  SmoothingMode.AntiAlias;

  在将内存中的位图对象赋给Graphics后通过放置这行代码,我们在画布上所画的每一个线条都使用了反锯齿,使凹凸不平的线条显得更加平坦。

  具备双重缓冲区技术的且使用AntiAliasing(反锯齿)属性的SpiderWeb_DblBuff示例程序

  完成了简单的双重缓冲区应用后有两个问题需要向读者阐明,.Net中的某些控件例如:Button、PictureBox、Label还有PropertyGrid都已经很好的利用了该技术!这些控件在默认状态下会自动启用双重缓冲区技术,用户可以通过对“DoubleBuffer”属性的设置来就可以实现双重缓冲区技术。所以,用户若使用PictureBox来绘制蜘蛛网将会更有效率一些,而且也使程序变得更加简单了。

  我们在这里讨论的双重缓冲区技术既不是完全被优化但也没有什么太大的负面影响。双重缓冲区技术是减少Windows 窗体绘制时闪烁的一条重要途径,但是它也确实消耗不少内存,因为它将会使用双倍的内存空间:应用程序所显示的图像和屏幕后方内存中的图像。每次Paint事件被激活时都会动态的创建位图对象,这种机制会相当耗费内存。而自带双重缓冲区技术的控件在使用DoubleBuffer属性后执行起来的优化程度则会更好一些。

  使用GDI+的DIB(与设备无关的位图)对象来实现这种画面以外的内存缓冲,自带双重缓冲区机制的控件则能好的利用该位图对象。DIB是底层Win32的对象用于高效的屏幕绘制。同样,值得注意的是GDI+的第一个版本GDI中仅与硬件加速有关以及一些简单功能可以直接使用,由于这样的限制,像反锯齿和半透明等屏幕绘制方法执行起来的速度则相当慢。尽管双重缓冲区机制消耗了一些内存但是它的使用不容置疑的增强了程序的执行性能。

智能重绘,在绘制前需要斟酌一下

  “智能无效”(智能重绘)就是在暗示程序员应该明白仅应对程序中无效的区域进行重绘,对Regions对象所对应的无效区域进行重绘可以提高绘制性能,使用Regions对象你可以仅排除或绘制控件和窗体的部分区域已获得更好的性能。我们现在就开始来看一下BasicClip示例程序,这个程序使用保存在PaintEventArgs对象的ClipRectangle对象,之前我们已经提及,无论何时当程序的大小发生变化时Paint事件都会被激活。BasicClip示例程序用红和蓝两种颜色填充剪切的矩形区域,利用不同的速度调整窗体的大小几次以后,你会发现绘制的矩形区域其实就是窗体的无效区域(包括大于原始窗体大小的区域部分和缩少了的区域部分),示例程序的Paint事件代码如下:

   private void BasicClip_Paint(object sender,  PaintEventArgs e)
   {
   Graphics g = e.Graphics;
   if (currentBrush.Color == Color.Red)
   currentBrush.Color = Color.Blue;
   else
   currentBrush.Color = Color.Red;
   g.FillRectangle(currentBrush,  e.ClipRectangle);
   g.Dispose();
   }

该示例程序的唯一目的就是演示怎样仅针对部分区域进行图形绘制。

  BasicClip示例程序中的彩色矩形区域就是表示窗体的下方和右侧的无效区域。

  Regions是一种被用来定义Windows 窗体或者控件区域的对象,调整窗体大小后所获得的Regions就是窗体重绘的最小区域。当程序需要进行绘制的时候仅绘制感兴趣的特殊区域,这样绘制更小的区域就会使程序的运行速度更快。

  为了更好的演示Regions的用法,请查看TextCliping示例程序。该程序重载了OnPaintBackground和OnPaint方法,直接重载这些方法比侦听事件更能保证代码在其它的绘制操作之前被调用,而且对于自定义控件的绘制也更加有效。为了清楚起见,示例程序提供了一个Setup方法,该方法定义了全局的Graphics对象。

   private void Setup()
   {
   GraphicsPath textPath = new GraphicsPath();
   textPath.AddString(displayString,  FontFamily.GenericSerif,
   0, 75, new Point(10, 50), new  StringFormat());
   textRegion = new Region(textPath);
   backgroundBrush = new TextureBrush(new  Bitmap("CoffeeBeanSmall.jpg"),
   WrapMode.Tile);
   foregroundBrush = new  SolidBrush(Color.Red);
   }

  上面的Setup方法首先定义一个空的GraphicsPath对象变量textPath,下一步字符串“Windows Forms”的边界被添加到该路径中,围绕这个轮廓创建Region。这样,一个被绘制在窗体表面的以字符串轮廓为区域的Region就被创建了。最后,Setup方法创建以材质刷子为背景和以实色刷子为前景来绘制窗体。

   protected override void  OnPaintBackground(PaintEventArgs e)
   {
   base.OnPaintBackground(e);
   Graphics bgGraphics = e.Graphics;
   bgGraphics.SetClip(textRegion,  CombineMode.Exclude);
   bgGraphics.FillRectangle(backgroundBrush,  e.ClipRectangle);
   bgGraphics.Dispose();
   }

  上面定义的OnPaintBackground方法先立刻调用基类方法,这能够保证所有底层绘制的代码都能够被执行。下一步,从PaintEventArgs中获得Graphics对象,再将Graphics对象的剪切区域定义为textRegion对象。通过指定CombineMode.Exclude参数,明确无论在哪里绘制或怎样绘制Graphics对象都不绘制textRegion区域内部。

   protected override void  OnPaint(PaintEventArgs e)
   {
   base.OnPaint(e);
   Graphics fgGraphics = e.Graphics;
   fgGraphics.FillRegion(foregroundBrush, textRegion);
   fgGraphics.Dispose();
   }

  最后,OnPaint事件负责精确的绘制出字符串。可以很容易的通过调用Graphics的FillRegion方法来实现。通过指定的前景刷子foregroundBrush和textRegion且仅是该区域被绘制。结果,Windows 窗体程序在运行之前确实“思考”该怎样进行绘制。

  TextClipping示例程序,通过Region定义的Windows Forms字符串。能够使程序在绘制时避开一个区域。

  适当的组合使用区域和智能重绘你可以编写出运行速度快且不会引起闪烁的绘制代码,并且比单独使用双重缓冲区绘制还要节省内存的消耗。

结论

  如果你的程序确定要进行绘制操作,使用几种技术可以增强绘制性能。确保争取设置控件属性以及适当的Paint事件处理是编写健壮程序的开始。在权衡好利弊后可以使用双重缓冲区技术产生非常“保护视力”的结果。最后,在实际绘制前进行思考到底哪些客户区域或Region需要被绘制将非常有益。

  希望通过这篇文章能够使读者更好的理解关于.net框架的绘制技术及其应用。

(0)

相关推荐

  • .NET Web开发之.NET MVC框架介绍

    MVC概念 MVC是一种架构设计模式,该模式主要应用于图形化用户界面(GUI)应用程序.那么什么是MVC?MVC由三部分组成:Model(模型).View(视图)及Controller(控制器). Model即应用程序的数据模型.任何应用程序都离不开数据,数据可以存储在数据库中.磁盘文件中,甚至内存中.Model就是对这些数据的抽象,不论数据采取何种存储形式,应用程序总是能够通过Model来对数据进行操作,而不必关心数据的存储形式.数据实体类就是常用的一种Model.例如,一个客户管理应用程序使

  • ASP.NET MVC5 网站开发框架模型、数据存储、业务逻辑(三)

    前面项目的层次和调用关系都说明了,关系如下图 采用三层架构的时候,研究过BLL层的必要性,觉得业务逻辑完全可以在controller里实现,没有必要单独做一个项目,另一个分层多了会影响性能.后来我还是把业务逻辑独立出来,原因如下: 业务逻辑写进controller里代码看着比较混乱,时间久了代码容易理不清. 在controller里直接写逻辑重复代码会不较多,开发效率低. 分项目有利于代码重用,有时候可以直接拿到其他项目中稍作修改就可以用. 对于性能我觉得分层多了肯定会有影响,但是不会很大.现在

  • 基于.NET平台常用的框架和开源程序整理

    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继续补充这篇日志,日积月累,就能形成一个自己的组件经验库. 分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度. Redis:是一个高性能的KV数据库. 它的出现很大程度补偿了Mem

  • ASP.NET MVC5网站开发项目框架(二)

    前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过"摸着石头过河"吧.这段时间看了一些博主的文章收获很大,特别是@kencery,依葫芦画瓢开写. 一.基本框架 还是先说下基本框架吧,一下子搞了7个项目看着挺乱的,我的理解是M.V.C 3者中,M是数据载体,V是用户要看的试图,C主要是协调控制与用户界面相关的操作,而数据的处理,数据库的的操作交给DAL.BLL来做.整个思路就是:View是用户看到的界面:Control

  • 使用ASP.NET.4.5.1+MVC5.0 搭建一个包含 Ninject框架 项目

    1.创建一个空白解决方案 2.添加一个类库 名称为XXX.Domain 3.添加一个ASP.MVC名称为XXX.WebUI 4.选着空模版,勾选MVC核心引用 5.添加单元测试项目XXX.UntiTests 6.在程序包控制台里面输入以下代码 复制代码 代码如下: Install-Package Ninject -version 3.0.1.10 -projectname Toad.WebUI Install-Package  Ninject.Web.Common  -version  3.0.

  • ASP.NET 2.0页面框架的几处变化

    新增的页面事件: 在ASP.NET 2.0中,一个ASP.NET页面的生命周期主要为(红色字体表示ASP.NET 2.0新增加的阶段页面事件):客户端请求页面->预初始化(OnPreInit)->初始化(OnInit)->完成初始化(OnInitComplete)->载入ViewState(LoadViewState)->处理回送数据(IPostBackDataHandler)->Page_OnPreLoad->Page_OnLoad->回发更改通知(Rai

  • ASP.NET MVC+EF框架+EasyUI实现权限管系列

    前言:本文开始我们便一步一步的来实现这个权限系统的初步设计-框架搭建,首先我要说的是我们需要开发工具Visual Studio 2012或者10也行,其次是我们要有SQL Server数据库,如果是Visual Studio 2010的话,你还要安装MVC4的开发文件,这个是吗?我不记得了,谁可以回答我一下的,我一直用2012,都是集成好的,所以不太清楚.因为这篇博客比较简单,只是建立一个简单的架构,所以我顺便进行一下MVC的知识补充,后面我也会这样穿插着介绍项目中遇到的技术,下面开始今天之旅.

  • 扩展ASP.NET MVC三层框架且使用StructureMap实现依赖注入1-Model层

    本篇文章将向大家介绍如何添加Service和Repository层并且使用StructureMap把Service层注入到Controller,把Repository注入到Service层.Service层主要是我们的业务逻辑层,这一层不和底层的Database打交道,和Database打交道的是Repository数据持久层.本篇文章通过使用StructureMap依赖注入使Controller,Service,Repository三层的耦合度降到最低. 本系统使用NorthWind开源数据,

  • asp.net 学习之路 项目整体框架简单的搭建

    最近刚学了些关于asp.net mvc方面的知识,于是了要拿个小项目来练练手,提高下自己的code能力跟思维能力.在此之前做东西都很简单,直接用动软那一套生成代码,生成一个简单的三层架构作为项目整体的框架,数据库访问层用的是ado.net.这么做了感觉挺麻烦,如果要项目要换数据库,要给数据库增加表或者给表增加某个字段,或者不使用ado.net用个orm框架来访问数据库等等,这样整体项目该动起来就提别的麻烦,为了解决这一些问题我们需要重新思考怎么搭建. 关于数据库访问层 数据库访问驱动层--大家都

  • Windows窗体的.Net框架绘图技术实现方法

    本文实例讲述了Windows窗体的.Net框架绘图技术实现方法,非常实用,具体内容如下: 一般来说,当编写一个典型的Windows 窗体程序时,窗体和控件的绘制.效果等操作是不需要特别加以考虑的.这是为什么呢?因为通过使用 .Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写一些简单的与事件相关联的代码然后在IDE中按F5,一个完完全全的窗体程序就诞生了!所有控件都将自己绘制自己,窗体或者控件的大小和缩放都调整自如.在这里经常会用到的,且需要引起一点注意的就是控件效果.游戏,自定义图表控

  • Java绘图技术的详解及实例

    Java绘图技术的详解及实例 简单实例 public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Demo1 demo=new Demo1(); } public Demo1(){ mp=new MyPanel(); this.add(mp); this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT

  • 如何:对Windows 窗体控件进行线程安全调用

    示例 访问 Windows 窗体控件本质上不是线程安全的.如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用情况和死锁.确保以线程安全方式访问控件非常重要. .NET Framework 有助于在以非线程安全方式访问控件时检测到这一问题.在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,并提示消息:"从不是创建控件 contr

  • Java绘图技术基础(实例讲解)

    如下所示: public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Demo1 demo=new Demo1(); } public Demo1(){ mp=new MyPanel(); this.add(mp); this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); th

  • 浅析PHP绘图技术

    1.图片格式:目前网站开发常见的图片格式有gif,jpg/jpeg,png .....区别:•gif 图片压缩率高,但是只能显示256色,可能造成颜色的丢失,可以显示动画•jpg/jpeg 图片压缩率高(有损压缩),可以用较小的文件来显示,网页上用得比较多•png 该格式综合了gif和jpg的优势,缺点是不能显示动画 2.通过PHP编程来绘图 复制代码 代码如下: <?php    //绘图技术 基本步骤 前提:在php.ini文件中启用gd库    //创建画布 默认背景是黑色的    $im

  • Windows下安装Django框架的方法简明教程

    本文实例讲述了Windows下安装Django框架的方法.分享给大家供大家参考,具体如下: 在idea上运行Python项目时,出现了如下错误,这是因为系统中只安装了Python,没有安装Django,有童鞋可能会问,什么是Django,博主的建议是去问度年或谷老师 既然报错的原因就是缺少Django,那我们现在就开始安装这个应用框架. 本站下载Django1.6:Django-1.6.11.tar.gz 官网下载: Django-1.6.11.tar.gz || Django-1.7.11.t

  • Django框架会话技术实例分析【Cookie与Session】

    本文实例讲述了Django框架会话技术.分享给大家供大家参考,具体如下: 会话技术 1.Cookie 客户端会话技术(数据存储在客户端) 以key-value的形式进行存储 cookie的操作都是通过Response来实现的 典型场景 购物车 登录信息 支持过期时间 Cookie清除策略 默认关闭浏览器时cookie自动清除 配置Cookie过期时间 max-age=0 关闭就失效 max-age=None 永久有效 max-age = int 单位秒 expires 过期时间,和max-age

  • Yii框架分页技术实例分析

    本文实例讲述了Yii框架分页技术.分享给大家供大家参考,具体如下: 直接上代码: 1.首先写控制器层 先引用pagination类 use yii\data\Pagination; 写自己的方法: function actionFenye(){ $data = Field::find(); //Field为model层,在控制器刚开始use了field这个model,这儿可以直接写Field,开头大小写都可以,为了规范,我写的是大写 $pages = new Pagination(['total

  • C#创建简单windows窗体应用(加法器)

    用C#创建一个简单的windows窗体应用,供大家参考,具体内容如下 编译环境,本人用的VS2013. 打开vs2013,新建项目 选择C#,创建windows窗体应用 自定义名称及存储位置 创建完成之后界面 从工具箱中添加控件 找不到工具箱在哪的可能在这里 我们这次要做的是一个加法器首先在加法器上添加好所需要的控件: Button Label TextBox 之后排成自己想要的样子 调整控件属性 单击自己要调整的控件,在vs的右下角会有一个属性窗口,调整属性窗口中外观一栏的Text项目,可以修

  • 4种Windows系统下Laravel框架的开发环境安装及部署方法详解

    1.准备工作 1.1PHP集成环境 这里我们使用的是XAMPP,XAMPP是一个功能强大的建站集成软件包,采用一键安装的方式,包含PHP7.0.Mysql.Tomcat等.最新版下载地址:PHP 5.6.28版(32位)|PHP 7.0.13版(32位)这两个版本的XAMPP都不再支持WindowsXP操作系统,这意味着你需要更高版本的Windows操作系统. 注意:由于Laravel5.1要求PHP 5.5.9+(含)版本,所以要针对该PHP版本要求选择合适的XAMPP. 1.2安装Compo

随机推荐