现有一种场景,鼠标移动时,假设鼠标坐标为 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. 【转】使用:after清除浮动

    以前总是加一个<div sytle="clear:both"></div>来解决,但这样会增加无语义的标签,下面是用after伪类实现,兼容多种浏览器.cl ...

  2. Query Designer:变量的偏移 Variable Offset

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. 获取Echarts的DataZoom的起始值

    创建DataZoom拖动事件 myChart.on(ecConfig.EVENT.DATA_ZOOM, eConsole);   //事件名, 相关联的方法名 var ecConfig = requi ...

  4. python成长之路【第八篇】:异常处理

    一.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! 语法: try: pass except Exc ...

  5. 手把手教你写Sublime中的Snippet

    手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...

  6. 使用layer.open时content属性传值记录

    最近在做一个后台项目,正好碰上了要使用layer.open,就顺手记录一下,方便以后遇到了有个参考 - 2016/11/7 layer 这个是一个web弹层组件,挺好用的...然后项目框架是SSM.. ...

  7. zabbix3.0.4 部署之七 (zabbix3.0.4 邮件报警) & 微信报警

    1 [root@sv-zabbix ~]# cat /usr/local/zabbix/share/zabbix/alertscripts/sendEmail.sh #!/bin/bash#SMTP_ ...

  8. <css篇>关于页面的绝对定位与相对定位,且支持页面各元素自适应

    (哈哈,第一次写博客,简称处贴?主要记录下平时工作中遇到的问题及其解决方案,方便以后解决此类问题.) 话不多说,上代码看吧 代码有点乱,以后自己能看得懂就行咯 <body > <di ...

  9. ssh框架的工作原理

    struts2的工作原理 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextClea ...

  10. response 下载文件

    String basePath = "D://test.json"; String filename = basePath.substring(basePath.lastIndex ...