2011-09-20 45 views
0

我已经作出了程序,读取从XML文件中的一些二极管曲线的电压和电流值,并绘制他们在屏幕上(只是使用普通2D图形和一些简单的命令,如DrawCurve和东西像那样)。交互式放大到C#中的2D图形位图

我主画面为800×800像素(下面你可以看到下一个较小的屏幕截图)。现在我想添加一个缩放功能,当我将鼠标悬停在这个图像区域上时,当我将鼠标移动到这个区域时,会弹出一个飞行的小方块并放大+移动。

我不知道如何解决这个问题。当然,我不要求完整的工作代码,但请帮助我接近!

举例来说,我可以让变焦的工作,不读取曲线数据和绘画实时?或者它没有逃脱?当我将鼠标移动到原始图像上时,如何获得悬停图像框?

谢谢!

enter image description here

回答

2

你有没有定时DrawCurve需要多长时间?也许它足够快,可以实时进行。不要忘记,GDI会将绘图原语剪切到绘图区域。您只需在您移动鼠标时设置剪切矩形。

为了加速重绘,创建主窗口图像(您粘贴的那个)作为离屏位图,并在屏幕上显示屏幕上的屏幕版本。这样你可以减少DrawCurve的影响。

最后,为了获得好看的结果,重载OnPaintBackground(记不清名字,但是它是这样的),所以它什么都不做(甚至不用调用基类)并在OnPaint方法中执行所有的绘制使用一个BufferedGraphics对象。

更新

你的油漆的功能可能是这样的:

OnPaint (...) 
{ 
    the_graphics_object.DrawImage (the background image); 
    the_graphics_object.Clip = new Region (new Rectangle (coords relative to mouse position)); 
    the_graphics_object.TranslateTransform (drawing offset based on mouse position); 
    RenderScene (the_graphics_object, scale_factor); // draws grid and curve, etc 
    the_graphics_object.DrawRectangle (zoom view rectangle); // draw a frame around the zoomed view 
} 

这将产生相对于鼠标位置的浮动“窗口”。

+0

嗯,我认为它绘制te曲线相当快(我粗略猜测大约10毫秒)。你能解释更多关于使用鼠标悬停剪辑的事件吗? –

+1

@ Sean87:查看更新的答案。当鼠标移动并且缩放功能启用时,重新绘制窗口。 – Skizz

2

通常,当重绘可能很耗时的情况下,变焦通常是通过提供“快速,但丑”的实施,旁边的“正确的,但慢”的实施解决。当缩放操作正在进行中时(例如,当用户点击滑块时,或直到距上一次缩放值更改发生后的50ms),则使用快速和丑陋模式,以便用户可以看到最终的形象是什么。一旦他们放开缩放滑块(或您提供的任何机制),您可以重新计算图像的细节。快速版本通常根据您正在使用的原始图像进行计算。

在你的情况,你可以简单地把原始图像,制定出新的,放大图像的边框,并缩放原始图像的相关部分到满图像大小。如果说100毫秒已经过去,没有变焦,请重新计算整个图像。

这种功能的例子非常普遍:大多数分形生成器完全使用这种技术,甚至与谷歌StreetView无关的东西(它提供了一个非常丑陋的前一张图片,当你移动时,直到实际图像已下载)。