我可以直接将Qt对象绘制到Win32 DC(设备上下文)吗?

3

我可以将Qt对象绘制到QImage中,然后将图像绘制到HDC或CDC中。这可能会影响我们应用程序的性能。如果我可以直接将Qt对象绘制到Win32 HDC或MFC CDC中,那就太好了。我期望有一个类,比如QWin32Image,然后我可以这样使用它:

QWin32Image image(hdc, 100, 100, Format_ARGB32_Premultiplied);
QPainter painter(&image);
painter.drawText(....);

这是我的想法可行吗?还是有更好的方法可以实现?

1个回答

4

简短回答 - 不行。据我所知,在Qt中,他们在应用程序代码级别上抽象了整个UI以实现跨平台性。Qt将所有小部件绘制到自己的缓冲区中,然后再绘制到屏幕上。

长回答 - 有限的可以。

Qt提供了Win/MFC Integration Library,它允许Qt对象与HDC和MFC对象交互。这个库确实很好用。但我发现在理解其工作原理之前使用它有些困惑。

这个库的作用是允许您在MFC窗口或Qt帧中显示QWindows,或者在Qt帧中显示MFC窗口。只要您记住这一点,就可以让它正常工作。

或者,QImage.scanLine(0)指向整个原始位图,您可以使用其中一种Windows函数直接写入屏幕。尽管函数名称为scanline,但使用它这种方式指向原始像素缓冲区的开头。


哪些Windows函数可以用于此目的?QPixmap可以将QImage转换为Windows位图句柄:QPixmap::fromImage(image).toWinHBITMAP(QPixmap::PremultipliedAlpha),从性能角度来看,哪种方法更好? - Kevin C.
在这方面我没有很多经验。在我们的应用程序中,我们一直在使用QImage.scanLine(0)来直接使用Intel性能原语库来操作原始像素缓冲区,因为这更适合我们的应用程序。我的经验是,转换越少,效果就越好。尤其是在调试模式下,QImage和QPixmap有时非常慢。但是在发布模式下,这个问题就不存在了。 - photo_tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接