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

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

MouseMove 事件代码:

lblX.Location = new Point(e.X, );
lblY.Location = new Point(, 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(, , curPoint.X + , curPoint.Y + ); if (isFirst)
{
isFirst = false;
}
else
{
//将上一次更新区域添加到更新列表
pictureBox1.Invalidate(lstRec);
} //更新绘制区域
pictureBox1.Invalidate(cur); lstRec = cur;

Paint 重绘代码

e.Graphics.DrawString(curPoint.X.ToString(), font, brush, curPoint.X, );
e.Graphics.DrawString(curPoint.Y.ToString(), font, brush, , 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, , , ), e.X.ToString());
GDIDrawString(rectY = new Rectangle(, e.Y , , ), 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);
}

GDI+ 绘制经验的更多相关文章

  1. 通过GDI+绘制 验证码

    只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 using System; using System.Collections.Generic; using Syste ...

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

    C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...

  3. C# 使用GDI+绘制漂亮的MenuStrip和ContextMenuStrip皮肤

    通过上面的效果截图可以看到,重绘后的MenuStrip和ContextMenuStrip可以添加自己的LOGO信息,实现了类似OFFICE2007的菜单显示效果. .NET对菜单控件的绘制提供了一个抽 ...

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

    MFC 用gdi绘制填充多边形区域 这里的代码是实现一个三角形的绘制,并用刷子填充颜色 在OnPaint()函数里面 运用的是给定的三角形的三个点,很多个点可以绘制多边形 CBrush br(RGB( ...

  5. GDI绘制时钟效果,与系统时间保持同步,基于Winform

    2018年工作之余,想起来捡起GDI方面的技术,特意在RichCodeBox项目中做了两个示例程序,其中一个就是时钟效果,纯C#开发.这个CSharpQuartz是今天上午抽出一些时间,编写的,算是偷 ...

  6. 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制

    背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...

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

    C#GDI+ 绘制线段(实线或虚线).矩形.字符串.圆.椭圆 绘制基本线条和图形 比较简单,直接看代码. Graphics graphics = e.Graphics; //绘制实线 )) { pen ...

  8. C# GDI绘制仪表盘(纯代码实现)

    纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...

  9. 如何使用GDI绘制半透明矩形

    /*使用GDI绘制半透明矩形*/ void CDirectXDraw::DrawHalfOpacityRect(HDC hdc,CRect rect) { CDC dc; dc.Attach(hdc) ...

随机推荐

  1. 聊聊 virtualenv 和 virtualenvwrapper 实践

    各位 Python 的小伙伴肯定多多少少接触过 virtualenv.本文将介绍 virtualenv 以及如何更科学更优雅地使用 virtualenv. virtualenv 首先来聊一下 virt ...

  2. SQL-Server使用点滴(一)

    前言 SQL的语法比较简单,学起来相比界面UI控制要简单得多,但是SQL在企业级应用中又是如此的重要,以至于很多开发人员都把重点放在SQL上. SQL并没有面向对象的概念,最复杂的设计也不过是表值函数 ...

  3. Arduino 极速入门系列–1 点亮 LED

    本篇内容为,使用 Arduino 点亮 LED 的做法示范.很简单的一个入门示范.我们让 LED 闪. 本篇使用到的工具和材料 Arduino Mini Pro 1 PCS Mini USB 数据线 ...

  4. 景区3D指纹验证系统解决方案

    旅游业已成为全球经济中发展势头最强劲和规模最大的产业之一.旅游业在城市经济发展中的产业地位.经济作用逐步增强,旅游业对城市经济的拉动性.社会就业的带动力.以及对文化与环境的促进作用日益显现.指纹门票为 ...

  5. hiho #1329 : 平衡树·Splay

    #1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...

  6. python走起之第八话

    1. Socket介绍 概念 A network socket is an endpoint of a connection across a computer network. Today, mos ...

  7. Linux下的系统调用

    张雨梅   原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 1.linux的的用户态与内核 ...

  8. Too Many Connections: How to Increase the MySQL Connection Count To Avoid This Problem

    1.问题描述 在启动使用mysql数据库的项目时,遇到一个报错,如下: Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConn ...

  9. eclipse导入android项目红叉和红色感叹号怎么解决

    解决办法如下:第一步:你要确保这个项目没有问题,有的项目本身就有问题,例如:xml文件,java程序等本身就有错.第二步:在Eclipse菜单中选择“Project”----〉Clean 解决不了,下 ...

  10. php curl 采集

    curl 采集五个步骤: 1.curl_init()初始化curl 2.curl_setopt()设置传输数据和参数 3.curl_exec()执行传输并获取返回数据 4.curl_errono()返 ...