GDI+ 绘制经验

现有一种场景,鼠标移动时,假设鼠标坐标为 X , Y , 需实时在 坐标 (X , 0) , (0 , Y) 两处更新内容。

方案一:
增加两个label ,或其它控件,鼠标移动时,实时更新 label 坐标区域 , 及内容。

MouseMove 事件代码:

lblX.Location = new Point(e.X, 0);
lblY.Location = new Point(0, e.Y);
lblX.Text = e.X.ToString();
lblY.Text = e.Y.ToString();

经过检单测式,鼠标移动时,CPU 升到 10 %  - 50% 。

方案二:

GDI Drawing 绘制相关信息.

MouseMove 事件代码 , 记录鼠标位置

//记录当前绘制坐标
curPoint = e.Location;
//重绘区包括当前需绘制区域,和需擦除区域 ,使用自身合并函数

if (isFirst)
{
    isFirst = false;
}

//当前绘制区
Rectangle cur = new Rectangle(0, 0, curPoint.X + 50, curPoint.Y + 25);

if (isFirst)
{
    isFirst = false;
}
else
{
    //将上一次更新区域添加到更新列表
    pictureBox1.Invalidate(lstRec);
}

//更新绘制区域
pictureBox1.Invalidate(cur);

lstRec = cur;

Paint 重绘代码

e.Graphics.DrawString(curPoint.X.ToString(), font, brush, curPoint.X, 0);
e.Graphics.DrawString(curPoint.Y.ToString(), font, brush, 0, curPoint.Y);
Console.WriteLine("width:{0} , height:{1}", e.ClipRectangle.Width, e.ClipRectangle.Height);

经过简单测式,鼠标移动时,CPU 升到 10 %  - 40% 。
由于重绘区域随着X, Y 值增大而增加,Invalidate方法会将重绘区域合并新矩形, 虽然更新很小部份,但重绘面积仍很大。后期,经过优化,重绘面积可不超过全屏四分之一。但CPU 占用仍然很高。

方案三:
采用 gdi32 绘制 , gdi32因绘制区域无合并,重绘机制存在,在局部更新时 默认只更新修改部份。CPU 占用2% - 5%

MouseMove 事件代码:

if (isFirst)
{
    isFirst = false;
}
else {
    //擦除背景色 , 区域描述参数为 左,上,右,下。
    GDIDrawText.FillRgn(hdc, GDIDrawText.CreateRectRgn(rectX.Left, rectX.Top, rectX.Right, rectX.Bottom), brushWin32);
    GDIDrawText.FillRgn(hdc, GDIDrawText.CreateRectRgn(rectY.Left, rectY.Top, rectY.Right, rectY.Bottom), brushWin32);
}

GDIDrawString(rectX = new Rectangle(e.X, 0, 50, 20), e.X.ToString());
GDIDrawString(rectY = new Rectangle(0, e.Y , 50, 20), e.Y.ToString());

绘制方法

private void GDIDrawString(Rectangle rec , string value) {
    int flags = GDIDrawText.DT_CENTER | GDIDrawText.DT_VCENTER | GDIDrawText.DT_SINGLELINE;
    Rect bounds = new Rect(rec);
    GDIDrawText.DrawText(hdc, value , value.Length, ref bounds, flags);
}
时间: 2024-11-09 09:53:26

GDI+ 绘制经验的相关文章

使用GDI绘制验证码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 使用GDI绘制验证码B { public parti

新手们的GDI+绘制方格

//绘制panel控件触发的事件 //不可在窗体加载时绘制方格        private void panel1_Paint(object sender, PaintEventArgs e)        {            int rowNum = 12;//行数            int colNum = 15;//列数:            Pen pen = new Pen(Color.Black);//实例化一个"画笔"            Brush br

D2D引擎与GDI\GDI+绘制效果对比

本例主要是对比D2D和GDI在绘制文字.线条的区别,以及D2D与GDI+在绘制图片时的区别. D2D是基于COM组件开发的,使用前的CoInitialize(NULL)是必须的:另外,GDI+的初始化GdiplusStartup()也别忘了. 废话少说,完整代码如下: // D2DDemo.cpp : 定义应用程序的入口点. // #include "stdafx.h" #include "D2DDemo.h" #include <D2D1.h> #in

通过GDI+绘制 验证码

只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 GDI+绘制验证码 以下为运行结果图

MFC 用gdi绘制填充多边形区域

MFC 用gdi绘制填充多边形区域 这里的代码是实现一个三角形的绘制,并用刷子填充颜色 在OnPaint()函数里面 运用的是给定的三角形的三个点,很多个点可以绘制多边形 [cpp] view plaincopy CBrush br(RGB(40,130,170)); CRgn rgn; CPoint arrpt[3]; arrpt[0].x = m_rcAT.right-8; arrpt[0].y = m_rcAT.top+m_rcAT.Height()*2/5; arrpt[1].x = a

C#利用GDI+绘制旋转文字等效果

C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程.利用下面的类可以实现该功能. [csharp] view plaincopy using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D;

C#利用GDI+绘制旋转文字等效果实例

本文实例讲述了C#利用GDI+绘制旋转文字等效果的方法,是非常实用的技巧.分享给大家供大家参考之用.具体如下: C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程.利用下面的类可以实现该功能. 具体实现代码如下: using System; using System.Collections.Generic; using System

C#GDI 绘制线段(实线或虚线)、矩形、字符串、圆、椭圆

C#GDI 绘制线段(实线或虚线).矩形.字符串.圆.椭圆 绘制基本线条和图形 比较简单,直接看代码. 1 Graphics graphics = e.Graphics; 2 3 //绘制实线 4 using (Pen pen = new Pen(Color.Black, 2)) 5 { 6 pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; //实现 7 graphics.DrawLine(pen,0,10,100,10); 8

C# GDI绘制验证码

步骤: 1.通过Random生成随机数或字符及验证码 2.通过验证码内容长度生成指定大小的图片 3.获取生成图片的Graphics对象 4.定义验证码字体格式 5.通过指定字体将验证码绘制到图片 6.向图片上添加背景噪音线 7.添加前景噪音点 1 private void pictureBox1_Click(object sender, EventArgs e) 2 { 3 Random r = new Random(); 4 string str = null; 5 for (int i =