我们在使用GDI+实现类似画图板这样的系统时,经常需要支持平移、滚动条、缩放等功能、解决绘制时的闪烁,对于缺乏GDI+开发经验的朋友,经常会在这些问题上纠缠一段或长或短的时间。在这里,我将自己的经验小结一下,给后来的朋友作个参考。
1.如何解决绘制闪烁?
(1)所有的绘制动作都应该Paint事件中完成。
比如,即使我们要拖动一个View object,通常在MouseMove事件中处理拖动行为,但是不要在MouseMove事件中调用Graphics.Draw方法,而是应该采用Command模式,将要绘制的动作封装为一个对象,传递到下一次的Paint事件中再绘制。
(2)设置双缓冲。
通常我们会选择在某个控件的表面进行绘制,那么在初始化时,可以通过执行下面的代码来启用双缓冲:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->this.SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint,true);
注意,SetStyle是一个Control基类的一个Protected方法,也就是说,只能在其派生类中才能调用该方法。
通常,我是定义一个从Control继承的自定义控件,然后在构造方法中进行双缓冲设置,如:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> publicpartialclassViewPanel:UserControl
{
publicViewPanel()
{
InitializeComponent();
this.SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint,true);
}
}
(3)重新绘制发生变化的区域,而不是整个区域全部重绘。
Control的Invalidate方法有一个重载接收Region类型的参数,表示下次paint时要重绘的区域。比如,当我们拖动一个对象时,只需要重绘比这个对象的Bounds大一点的区域即可。
2.滚动条与缩放
当需要支持滚动条和缩放时,就需要采用一系列的坐标变换来正确的记录坐标和绘制图像,这些过程是比较繁琐的。幸运的是,GDI+能为我们减轻一部分这方面的负担。当绘制view object时,只要我们指定Graphics对象的几个参数,Graphics对象就会自动采用正确的比例和偏移来绘制所有的view object了。比如:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> //Graphics g ;
g.PageUnit=GraphicsUnit.Pixel;//GraphicsUnit.Pixel才支持缩放与偏移绘制。
g.TranslateTransform(this.hScrollValue,this.vScrollValue);//设置滚动条的当前位置
g.PageScale=this.Scale;//设置缩放比例
g.Draw(......);
分享到:
相关推荐
- 添加滚动条或缩放控件,使用户可以查看不同时间段的数据。 - 添加鼠标悬停或点击事件,显示特定数据点的信息。 以上就是使用GDI+绘制动态曲线图的基本步骤。通过熟练掌握GDI+的绘图API,开发者可以创建出功能...
在本文中,我们将深入探讨C#中的GDI+技术,特别是在绘制图形方面,特别是如何实现分层、拖放、缩放以及填充等高级功能。GDI+是.NET框架中的一个核心部分,它提供了丰富的图形绘制功能,使得程序员能够创建出交互式且...
2. `index-with-scrollbar.html`:此文件可能演示了如何用GDI+创建和控制滚动条,这是Windows程序中常见的交互元素。 3. `left-navigation.html`:这可能是一个关于创建左侧导航菜单的示例,展示了GDI+在界面布局和...
在本文中,我们将深入探讨如何使用GDI+在MFC对话框中绘制矩形,并实现旋转、缩放和移动的功能。GDI+是Windows应用程序开发中的一个图形库,提供了丰富的图形绘制能力,包括线条、形状、图像处理等。MFC(Microsoft ...
在C++或C#等编程语言中,我们可以创建GDI+对象来操作图形,如Graphics对象用于绘制,Image对象用于处理图像,Pen和Brush对象用于线条和填充等。 加载图片是图片查看器的基础。在GDI+中,我们可以使用`System....
GDI+可以结合Windows消息机制,实现滚动、缩放等交互功能。 8. **事件处理**:GDI+通常与MFC(Microsoft Foundation Classes)或Win32 API一起使用,通过消息循环和消息映射处理用户的输入事件,如鼠标点击、拖拽等...
GDI+(Graphics Device Interface Plus)是Windows操作系统中用于图形绘制的一个强大库,它是GDI(Graphics Device Interface)的升级版,提供了更多的图形处理功能和更丰富的API接口。在这个名为“GDI+的绘图控件”...
在本项目中,MFC被用来构建用户界面和应用程序框架,而GDI+(Graphics Device Interface Plus)则是微软提供的一个图形绘制库,用于在Windows平台上进行高质量的2D图形处理。 GDI+相比于传统的GDI,提供了更丰富的...
在C#高级编程中,GDI+(Graphics Device Interface Plus)是一个强大的图形处理库,用于在Windows应用程序中创建和操纵视觉元素。它扩展了原始的GDI,提供了更丰富的功能和更高的性能。在这个主题中,我们将深入探讨...
5. **绘图操作**:GDI+提供了丰富的绘图方法,如画线、填充区域、旋转、缩放等。例如,你可以使用`Pen`和`SolidBrush`对象定义线条和填充色,`DrawLine`和`FillRectangle`方法来进行实际的绘图操作。 6. **事件处理...
在本文中,我们将深入探讨如何使用C#编程语言和GDI+库来创建一个简单的示波器图形。GDI+是.NET Framework中的图形处理接口,它提供了丰富的绘图功能,可以用于绘制各种复杂的2D图形,包括模拟示波器显示。 首先,...
- 可以添加滚动条或滑块让用户手动调整歌词显示位置。 - 为了使歌词与背景融合,可以设计不同风格的背景图层,结合透明度和混合模式。 7. **事件处理**: - 实现用户交互,比如点击歌词跳转到对应时间,暂停/...
在地图应用中,用户可能通过鼠标拖动或者滚动条来触发平移,我们需要捕获这些事件并相应地调整平移值。 接下来,要实现从坐标点到屏幕坐标的转化,我们需要了解GDI+中的坐标系统。GDI+的坐标系统原点位于左上角,X...
6. **用户交互**:为了增强用户体验,可以添加滚动、缩放、平移等交互功能。这可能需要额外的逻辑来处理鼠标事件,并相应地调整绘图区域。 7. **中文属性设置**:由于描述中提到控件具有全中文属性设置,这意味着...
总结,VC++中使用滚动条显示图片涉及到的知识点包括:MFC控件操作、滚动条控件的使用、事件处理、图形绘制、图片裁剪与缩放、以及性能优化。通过这些步骤,我们可以实现一个能够完整显示大图片并支持滚动查看的用户...
4. **滚动事件处理**:为滚动条添加滚动事件处理,当用户滚动时,更新滚动条的位置并重新绘制图片。这通常通过重载OnHScroll()和OnVScroll()方法来实现,根据滚动条的滑块位置更新图像的显示区域。 5. **加载JPG...
4. **窗口和控件绘制**:在Windows应用程序中,GDI用于窗口和控件的绘制,包括窗口边框、滚动条、按钮等界面元素。开发者可以通过重写控件的WM_PAINT消息处理函数,利用GDI函数自定义控件的外观。 5. **混合模式和 ...
在Windows编程领域,GDI(Graphics Device Interface)是一种图形设备接口,用于绘制窗口、文本、图形、图像等元素。在给定的“鼠标操作矩形框GDI绘图可放大缩小,拖动矩形框”主题中,我们将深入探讨如何使用GDI...
在IT领域,开发一个能够显示位图并具备滚动条功能的应用程序是一项常见的需求,尤其是在处理大尺寸图像或者需要用户交互查看细节时。本程序的核心在于将图像与滚动条控件结合,实现用户通过滚动条来平移查看图像的...
7. **自绘(Redraw)逻辑**:由于图片可能被缩放并带有滚动条,因此在滚动或窗口大小改变后,需要重新绘制图片。使用InvalidateRect函数更新控件的画布,然后由OnPaint函数处理实际的绘制。 8. **资源管理**:确保...