最近遇到一个诡异的问题,大致是这样的:在主框架中有一个菜单,菜单的功能是弹出一个新建的框架视图。我使用一个MFC常规DLL把新建框架视图封装起来,现在已经能实现新建框架视图,接着实现在新建的视图里绘图,开始使用视图的DC进行绘图是没有问题的,后来为了提高绘图效率,使用双缓冲绘图,发现居然什么图形也绘制不出来。我的测试代码是这样的:
//视图类头文件,只抽取主要的写
class CDBBTestView : public CView
{// Operations
public:  afx_msg void OnLButtonDown(UINT nID,CPoint point);private:  CBitmap m_Bmp;
CDC m_dcMemory;
}// 视图类cpp文件void CDBBTestView::OnLButtonDown(UINT nID,CPoint point)
{
     CRect rt;
this->GetClientRect(&rt); // 为屏幕DC创建兼容的内存DC
if(!m_dcMemory.CreateCompatibleDC(NULL))
{
::PostQuitMessage(0);
} // 创建位图
m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height()); // 相当于选择画布
::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp);
 
        // 在View内用双缓冲画很多的圆 CDC *pdcView = this->GetDC();        m_dcMemory.FillSolidRect(&rt, 0x00FFFFFF); // 白色填充, 注意,这次是画在内存设备环境上 // 画圆
for(int i = 0; i < rt.Width() - 1; i+= 16)
{
for(int j = 0; j < rt.Height() - 1; j+= 16)
{
m_dcMemory.Ellipse(i, j, i + m_nRadius, j + m_nRadius);
}
} // 一次性的将内存设备环境上绘制完毕的图形"贴"到屏幕上
pdcView->BitBlt(0, 0, rt.Width(), rt.Height(), &m_dcMemory, 0, 0, SRCCOPY); this->ReleaseDC(pdcView); // 释放view的设备环境         CView::OnLButtonDown(nID,Point);}
      执行上面的代码什么也没绘制出来,我想是不是在DLL中不能使用兼容DC呢?特请教一下大家,谢谢!

解决方案 »

  1.   

    LZ这个用DEBUG编译,并且非连续点击两次鼠标左键,没有Assert错误么?
    为什么要把m_Bmp、m_dcMemory定义为类成员变量?这两个变量都没有Destroy,在第二次创建的时候,上一次所创建GDI对象就丢失了,GDI资源内存泄漏。
    另外绘图操作也不应该放在OnLButtonDown里面,如果放在这里面,随便拖一个其他窗口过来把此窗口覆盖再拖开,那么这个绘图就丢了,绘图应该集中到WM_PAINT对应的处理函数里面。
    此外如果要在DLL里面用MFC,并且DLL里面用到DLL自身资源之类,那么要在DLL函数的开头加上AFX_MANAGE_STATE(AfxGetStaticModuleState())来指明现在要使用DLL里面的东西而不是Exe里面的东西。
      

  2.   

    关键是句柄
    正确获得本地窗口句柄才可以画
    GETDC那个不知道能不能
    要不是试试传个过去
      

  3.   


         资源句柄已经考虑过,什么AfxSetresourceHandle和AFX_MANAGE_STATE(AfxGetStaticModuleState())之前已经用过,都不是这方面的问题。
      

  4.   


    你的只是测试代码,也不好说明什么。
    不过我可以告诉你,MFC的DLL里面用兼容DC可以绘图,我做过。