none
Gdiplus绘制异常 RRS feed

  • 问题

  • 我在VS2008的MFC工程里,

    使用GDI+进行绘制,出现以下情况:

    我使用Graphics将Image绘制到我窗口的DC上,

    但是有时会绘制到桌面DC上,

    以至于不管当前窗口是哪个程序的,我的窗口都会把图片绘制到当前窗口上。

     

    不知道大家有没有遇到过类似的情况。

     

    还有一个问题是,Gdiplus在多线程中使用,有没有什么需要注意的地方呢。

    是不是每个使用了Gdiplus的线程,都需要单独进行它的初始化及反初始化?

    2010年7月1日 3:09

答案

  • 您好,

    您的DC是不是有的时候没初始化啊。当DC为空时,一般默认是桌面DC,这时候会绘制到桌面上。

    至于多线程的话,如果这些线程都需要在某个DC上绘制的话,需要处理一下同步问题,也就是一个线程绘制时必须锁一下DC。这个可以调用InterlockedExchanged函数,或者EnterCriticalSection/LeaveCriticalSection 来处理。也可以创建一些同步相关的内核对象来处理(比如信号量或互斥量之类)。MFC也有一些类负责线程同步,您可以参考下面的文档:
    http://msdn.microsoft.com/zh-cn/library/975t8ks0(VS.80).aspx

    Aland Li


    Please mark the replies as answers if they help and unmark if they don't. This can be beneficial to other community members reading the thread.
    2010年7月8日 8:11
    版主

全部回复

  • 您好,

    您的DC是不是有的时候没初始化啊。当DC为空时,一般默认是桌面DC,这时候会绘制到桌面上。

    至于多线程的话,如果这些线程都需要在某个DC上绘制的话,需要处理一下同步问题,也就是一个线程绘制时必须锁一下DC。这个可以调用InterlockedExchanged函数,或者EnterCriticalSection/LeaveCriticalSection 来处理。也可以创建一些同步相关的内核对象来处理(比如信号量或互斥量之类)。MFC也有一些类负责线程同步,您可以参考下面的文档:
    http://msdn.microsoft.com/zh-cn/library/975t8ks0(VS.80).aspx

    Aland Li


    Please mark the replies as answers if they help and unmark if they don't. This can be beneficial to other community members reading the thread.
    2010年7月8日 8:11
    版主
  • 感谢Aland,抱歉现在才回复。

    我重新整理了一下代码,问题不在了。

    但是可能只是巧合,我看到QT写出的程序有时候也会有这个情况。

    我基本可以确认DC不是桌面的,用很多的Assert。。

    2011年2月10日 2:26