由于要自己实现AnimateWindows这个API动画特效,(某些平台上是没有这个API的)
,需要将即将显示的窗口界面先画到内存里,在内存中做一定的处理后,再画到屏幕上,
问题是该如何将窗口界面画到内存里,生成一个位图句柄.
要求:
1)窗口界面在显示到屏幕之前,就画到内存里了,
2)是即将显示的窗口界面,不是一张图片,画到内存里.麻烦各位朋友们,看看有什么好的建议,或者方法.
我想了很久,也想不出来,如何不将窗口显示到屏幕上.谢谢

解决方案 »

  1.   

    如果可以的话,那么,可以先申请一个内存DC,同时关联一个BMP,然后在这个DC上面话;当要显示的时候,直接贴出来即可!
      

  2.   


    // 创建内存DC
    HDC hdcMemory = ::CreateCompatibleDC(hDC);
    HBITMAP hBitmap = ::CreateCompatibleBitmap( hDC, rect.Width(), rect.Height());
    HGDIOBJ hOriginalBmp = ::SelectObject(hdcMemory, hBitmap);
    ::BitBlt( hDC
    , 0
    , 0
    , rect.Width()
    , rect.Height()
    , hdcMemory
    , 0
    , 0
    , SRCCOPY
    );
    ::SelectObject(hdcMemory, hOriginalBmp);
    ::DeleteObject(hBitmap);
    ::DeleteDC(hdcMemory); 
      

  3.   

    谢谢楼上的几位,但都不是我想要的答案.
    这么说吧,
    1)窗口画面1已经显示到屏幕上.
    2)现在要显示窗口画面2,由于特殊需要,先要在内存里,生成该窗口画面2的位图.
    3)再做一定的位图处理,将内存中的窗口画面2,再显示到屏幕上.一般我们窗口都是调用ShowWindows,或者DoModal,就直接显示到屏幕,而不是内存里,
    这样就会取代窗口画面1.
    这个问题的困难处是,怎样在显示窗口画面1的同时,能够对窗口画面2进行位图处理,然后再显示.
      

  4.   

    3楼的哪里回答了我的问题2)了,
    只不过是创建了兼容的内存DC,和内存位图,
    关键的是把窗口画面2如何BitBlt到hdcMemory,这个没有啊?
    不然的话,还是空的hdcMemory啊.
      

  5.   


    你的"窗口画面2"是什么东西?  hdcMemory就是给你画的, 你爱怎么画就怎么画。如果你的意思是说, 在窗口最终显示出来之前进行一些处理,那么你可以参考这个:
    http://www.codeproject.com/KB/dialog/VisitaLookingDialog.aspx创建2个窗口,上面的是LAYERED Windows, 下面的是一个几乎不透明的Window。下面的窗口接受消息。上面的窗口用于显示。
    截取下面窗口的图形, 经过中间处理, 显示到上面的窗口
      

  6.   

    下面的是一个几乎不透明的Window
    --------------
    改错:下面的是一个几乎透明的Window