调整窗体上的ActiveX视频控件的大小会导致C ++中出现不必要的闪烁,即使有双重缓冲也是如此

时间:2011-03-08 14:27:44

标签: c++ activex resize controls flicker

C ++。 Borland Developer Studio的味道,但不确定这是否与此相关。

我有一个ActiveX控件(来自Axis Communications),可以显示来自摄像头的视频。它在正常操作中运行良好,但我想对它进行一些调整,这会引起问题。

如果,以编程方式,我在窗体周围移动组件(只是x,y坐标),一切都很好 - 视频矩形平滑移动,没有闪烁。

然而,如果我调整组件的大小(再次,在代码中),我会在较低和较低的位置闪烁。右手边缘。通过闪烁,我的意思是它会在这些边缘上产生白色边框,并且会在实际图片上闪烁。

我尝试过DoubleBuffering,但这并没有解决它。

这是一个ActiveX问题吗?或者可能出现Axis Component问题?

有没有办法可以在没有闪烁的情况下完成大小调整?


编辑:

进一步测试:

看起来这只会在我调整控件并同时移动控件时发生,不幸的是我想要做的事情(我正在放大和缩小)。

我在Visual Basic中使用ActiveX控件组合了一个简单的测试,它工作正常。

Borland C ++中的确切(转换)相同代码有闪烁。

C ++测试代码(只调整组件大小,保持中心点静态):

for (int i = 0; i < 100; i++)
{
    AxisMediaControl1->Width = AxisMediaControl1->Width - 2;
    AxisMediaControl1->Height = AxisMediaControl1->Height - 2;
    AxisMediaControl1->Top = AxisMediaControl1->Top + 1;
    AxisMediaControl1->Left = AxisMediaControl1->Left + 1;
    Sleep(50);
}

2 个答案:

答案 0 :(得分:0)

我(希望受过教育的)猜测是Axis组件的问题。也就是说,您的应用程序向ActiveX组件发送一个resize命令,该组件有一个事件循环,根据它内部存储的几何图形进行绘制,并且它没有正确更新几何体。

我建议创建一个简单的示例并将其发送给Axis技术支持,因为我之前曾与他们合作并且总是发现它们非常有帮助。

答案 1 :(得分:0)

这似乎是Borland和ActiveX控件的渲染/调整大小的问题。

当我更改代码以使用“SetWindowPos”API而不是仅调整组件大小时,问题就消失了!