我在使用GDI+绘制应用程序的用户界面时遇到了一个奇怪的问题。有时会出现显示错误,显示其他应用程序的伪影。有时,我的文本控件的边框完全被绘制成黑色。
在某些情况下,问题也不仅仅是一个简单的显示错误。当这种情况发生时,我有一个菜单或来自其他应用程序的上下文菜单嵌入到我的应用程序中。这个菜单不仅是可见的,而且你还可以用鼠标悬停在菜单上突出显示菜单项,并展开子菜单。然而,当你点击这些条目时,它们背后没有任何功能。似乎这些菜单始终是Windows资源管理器的一部分。
我不知道我应该从哪里开始寻找这些问题的原因。也许有人能在SO这里给我指出一个可能的问题来源,甚至是一个解决方案?
澄清一下。 同样的代码在不同硬件、不同图形卡驱动和不同操作系统(XP、Win7、Server 2008)的多台电脑上都会出现这个错误。我很想发布一些代码,但它非常复杂,而且在整个应用程序中广泛存在。由于我不知道问题的根本原因是什么,所以我无法分离出正确的代码部分。
下面是一些截图。
我的文本控件和面板控件周围有黑色边框。
另一个应用程序的内容被画在我的应用程序窗口里。你可以看到左边是Windows资源管理器的上下文菜单,右边是excel表的一部分。窗体下部的网格表通常直接在窗口标题栏下:在显示资源管理器上下文菜单的窗体中显示错误。
如你所说,你嵌入了另一个应用程序,我猜你是在使用经典的GDI调用和GDI+一起使用?这是一个繁琐的事情。我也做了同样的事情,但它引起了一些问题,我的程序的一些部分没有被绘制出来,变得不可见。
我的解决办法是(现在也是)在使用GDI函数之前总是销毁所有的Gdiplus::Graphics--或者你可以尝试调用Graphics::Flush。
毕竟我必须重申,开始使用GDI+是个坏主意,而且把它混入现有的GDI应用中是个可怕的主意。你应该只使用一个API(也许是direct3D)。GDI+并不是基于GDI--显然两者是并行工作的。
我刚刚发现这篇文章描述了混合GDI和GDI+的一些限制。https:/support.microsoft.comen-gbhelp311221info-interoperability-between-gdi-and-gdi。