Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有GDI+的图层;_C++_Gdi+_Bitmap - Fatal编程技术网

C++ 带有GDI+的图层;

C++ 带有GDI+的图层;,c++,gdi+,bitmap,C++,Gdi+,Bitmap,我正在考虑创建一个带有图层的绘图程序,并使用GDI+来显示它们。我想使用GDI+,因为它支持透明度 问题是,将线条绘制到DC非常快,但直接绘制到位图非常慢。只有在锁定位并开始设置像素时,它才是快速的。我是否可以在WM_PAINT事件中绘制多个DC,然后只需将每个层的DrawBitmap绘制到MemDC?最好的办法是什么 感谢您,GDI+对于绘图程序来说确实足够快了。我使用它(从C#)制作高速动画(>30fps) 似乎您希望能够操纵单个像素。这对于使用锁存器来说非常快,尽管在C语言中使用它有点笨拙

我正在考虑创建一个带有图层的绘图程序,并使用GDI+来显示它们。我想使用GDI+,因为它支持透明度

问题是,将线条绘制到DC非常快,但直接绘制到位图非常慢。只有在锁定位并开始设置像素时,它才是快速的。我是否可以在WM_PAINT事件中绘制多个DC,然后只需将每个层的DrawBitmap绘制到MemDC?最好的办法是什么


感谢您,GDI+对于绘图程序来说确实足够快了。我使用它(从C#)制作高速动画(>30fps)

似乎您希望能够操纵单个像素。这对于使用锁存器来说非常快,尽管在C语言中使用它有点笨拙(需要指针和<代码>不安全< /COD>标签),但它似乎不像C++中那样困难。 您可能不希望在绘制事件中从多个层直接复制到控件曲面。相反,该渲染应在屏幕外缓冲区(B1)中进行。完成所有复制/绘制操作后绘制B1后,将其复制到第二个屏幕外缓冲区(B2),然后使控制面无效/刷新。在控件的绘制事件中,将从B2复制到可见曲面

您不希望使用多步骤绘制操作直接在可见表面上绘制,因为会出现闪烁形式(有时屏幕会重新绘制自身,而代码仅在多步骤操作的中途完成,因此用户偶尔会看到半成品帧)

可以渲染到单个屏幕外缓冲区,并在绘制事件中将其复制到可见曲面。这里的主要复杂性是,您必须以某种方式处理“游离”绘制事件,即事件不是由您故意使控件无效引起的,而是由其他原因引起的(例如用户在您的窗口上拖动另一个窗口)。如果从屏幕外缓冲区复制到曲面,而缓冲区仅绘制了一半,则会出现闪烁。如果在绘制事件中阻止,直到缓冲区绘制完成,您将在控件上看到“表单轨迹”,这看起来更糟

解决方案是上述的双缓冲方法。杂散(或无效时的非杂散)绘制事件将从B2复制,B2始终是完全渲染和最新的,因此不会闪烁。双缓冲确实会占用更多内存,但在具有多个图层的绘图程序中,这并不是什么大问题