none
设置MFC双缓冲绘图的内存DC为成员变量 RRS feed

  • 问题

  • 参见下面代码,m_MemDC是CTstDlg类的成员变量. CDC m_MemDC;

    现在发现必须在OnPaint()中//m_MemDC.DeleteDC() ;执行这句,否则程序就会崩溃. 猜想是因为多次调用

    CreateCompatible(DC)了.

    疑问是,如果在OnInit,或者Oncreate中,调用GetDC(),得到的句柄,然后CreateCompatibleDC,和

    这个dc = BeginPaint(),是不是得到的同一个DC的内存DC呢?

    我想用同一个成员变量内存DC,在程序中多次进行绘图,贴图.除了Onpaint,还有个定时器中会

    定时绘图,想都绘制在同一个成员变量内存DC上,然后定时在bitblt到显示设备屏幕上.

    memBitMap是不是也可以作为成员变量?

    然后在不同的绘图,贴图函数中,就不需要重复的创建内存兼容画布,Bitmap了?

    void CTstDlg::OnPaint() 

    {

    dc = BeginPaint( &ps ) ;

     m_MemDC.CreateCompatibleDC(dc);
    CBitmap  memBitmap;
    memBitmap.CreateCompatibleBitmap(dc,800,600 ); 

            CBitmap* pOldBitmap; // bitmap originally found in m_MemDC
    pOldBitmap = (CBitmap *)m_MemDC.SelectObject(&memBitmap);

           ....

           m_MemDC.SelectObject(pOldBitmap);
           memBitmap.DeleteObject() ;
    //m_MemDC.DeleteDC() ;

    }

    2015年1月22日 2:39

答案

  • 可以将他们都定义为类的成员变量。

    OnPaint()函数中可以使用CPaintDC类,可以不用调用BeginPaint()/EndPaint()。需要提醒的是BeginPaint和EndPaint()要成双出现。

    Do not call the BeginPaint member function except in response to a WM_PAINT message. Each call to the BeginPaint member function must have a matching call to the EndPaint member function. If the caret is in the area to be painted, the BeginPaint member function automatically hides the caret to prevent it from being erased. 

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.


    2015年1月22日 6:15
    版主