调用一个图形渲染函数接口画了一个图形,由于无法用双缓存(解释起来很麻烦),所以,画出的图形比较抖.
我的想法很简单,希望能够获取当前的绘制窗体CMyWnd上的像素,将它保存在内存DC中再画出来.这样的话,虽然第一次
载入的时候会比较抖,但至少接下来的,我就可以利用上双缓存了.
因此,我的问题在于,如何将一个窗体上的图象信息记录到内存DC上来,希望高手解答!!谢谢!!

解决方案 »

  1.   

    用GetWIndowDC取出CMyWnd的DC,再用BitBlt试试
      

  2.   

    “获取当前的绘制窗体CMyWnd上的像素,将它保存在内存DC中再画出来”这与双缓冲有何不同?
      

  3.   

    “将一个窗体上的图象信息记录到内存DC上来”就是用窗体DC来CreateCompatibleDC、CreateCompatibleBitmap、SelectObject、BitBlt。
      

  4.   

    似乎不行,我有点怀疑自己的方法是否可行.
    //将图形画到一个隐藏的窗体上
    pWnd->ShowWindow(SW_HIDE);
    //由于这个DrawEx依赖于一个窗口句柄,使得事情变得很麻烦
    BOOL b = m_pAcroPDPage->DrawEx((long)pWnd->m_hWnd,NULL, pRect.m_lpDispatch,
                                  short(m_pOrigin.x) - 100,short(m_pOrigin.y), m_dZoom);
    //创建关于该窗体的画布,内存DC
    CDC *dc = pWnd->GetDC();
    if(m_Bmp.GetSafeHandle())
       m_Bmp.DeleteObject();
    m_Bmp.CreateCompatibleBitmap(dc,m_cRect.Width(),m_cRect.Height());
    if( m_dcMemory.GetSafeHdc() == NULL )
       m_dcMemory.CreateCompatibleDC(dc);
    ::SelectObject(m_dcMemory.GetSafeHdc(),m_Bmp.GetSafeHandle());
    //系统DC打印出来
    pDC->BitBlt(0, 0, m_cRect.Width(), m_cRect.Height(), &m_dcMemory, 0, 0, SRCCOPY);
    pWnd->ReleaseDC(dc);麻烦高手看看,这样的思路可行吗??
      

  5.   

    你的代码不完整没法判断问题出在哪里。
    如果按照你的设想,实现步骤是这样:
    1、创建窗口dc兼容的内存dc
    2、创建跟窗体尺寸一致的位图,选入内存dc
    3、从窗口bitblt到内存
    4、在内存dc上做图
    5、从内存bitblt到窗口或者你换个方式试试:创建一个兼容位图,把它选入窗口dc,调用渲染函数绘制,之后选出并保存该位图,以后用的时候就直接把这个位图bitblt到窗口