1、使用一个CDC对象Attach一个用GetDC函数得到DC句柄后,当这个CDC对象释放后,它会不会自动连带释放这个句柄。如果不会,是不是会产生资源泄漏。我如何能正确释放一个通过Attach得来的CDC对象呢?相同的,像CBitmap对象和其它拥用句柄属性的对象,在Attach后,要通过什么方式才能正常释放呢?2、我在书上看到一段代码里在将一个位图对象选进一个内存DC后,却并没有将它选出,那么是不是将GDI对象选进一个DC后可以不选出,它会自动释放掉呢?3、我拦下主窗口的WM_KEYDOWN消息,在里面加了如果按ESC键就像主窗口SendMessage(WM_CLOSE)消息的逻辑,但在运行时会在一个我看不懂的地方产生访问冲突,只有我把SendMessage换成PostMessage后,程序才没有产生错误,这是为什么?(附注:我是在Win98下运行时出现错误,但在WinXP下没有错误产生,只有退出码不是0,而是0x1B.
高手救命啊!

解决方案 »

  1.   

    1 Attach 的对应方法是 Detach, GetDC 用完后应该 ReleaseDC.2 所有GDI对象SelectObject后都应再用完后SelectObject回原来的对象,然后再DeleteObject.3 SendMessage阻塞了进程,而PostMessage会立即返回,这可能是造成你进程出错的原因。
      

  2.   

    2>>我在书上看到一段代码里在将一个位图对象选进一个内存DC后,却....我们需要自己释放,比如用SelectObject(hDC,hBitmap);进来的hBitmap需要用DeleteObject(hBitmap);来释放。hDC需要DeleteDC(hDC);3>>我拦下主窗口的WM_KEYDOWN消息....SendMessage是在执行完成后就等待返回,而PostMessage是执行完毕把消息送出去就直接返回。我估计你的程序里在WM_CLOSE以后还有东西在跑,所以就不能出去了。xp下没有试过。
    1>>我现在用的是SDK啊,不是MFC,嘿嘿不能帮你了.
      

  3.   

    3、你应该用PostMessage代替SendMessage。
      

  4.   

    进来晚了,被: ljn2(没有人2 (账户惨被封)) 回答晚了:(
      

  5.   

    1.2 楼上3.
    在MFC中,你的消息处理函数并不是最后执行完成的,在你的处理完之后还可能调用基类的相应处理函数,所以当你在主窗口的WM_KEYDOWN消息中使用SendMessage发送WM_CLOSE之后(SendMessage是要等相应的消息处理完成后才会返回,在这里也就是等窗口销毁之后返回;而PostMessage是将相应消息加入到消息队列中后立即返回,所以在处理WM_CLOSE消息之前会先将WM_KEYDOWN消息处理完成),你的窗口已经销毁了,但是程序还会继续进入基类的相应处理函数中去,此时因为你的窗口已经销毁,所以在Windows98之类的系统中就会报错,而XP的系统是基于NT核心的,在这方面可能有自己的处理,直接将你的进程结束而不报错
      

  6.   

    没有GDI函数常见FAQ之类的东西可以看?
    我再使用GDI时总觉得不安心,像有什么地方错了一样。
      

  7.   

    看msdn和csdn就可以了啊,免费和权威。
    再说,gdi说来说去常见的就这么几个。
    用多了就熟练了
    对吗
    熟能生巧嘛
      

  8.   

    如果谁仔细总结一下的话,我可以加FAQ
      

  9.   

    谁要是翻译,解说一下GDI+的Using GDI+就好了,呵呵
      

  10.   

    最后问一下。
    用Attach添加成的对象,它会自身释放呢,还是最后得分离出句柄来,然后删除句柄呢?
      

  11.   

    Attach的应该要分离,然后再释放吧