void CChildView::OnPaint() 
{
CPaintDC dc(this);                                                                   //创建一个用于截屏的DC
//dc.CreateDC(_T("Display"), NULL, NULL, NULL); //然后就截屏咯 // 用于绘制的设备上下文

CDC memDC;

memDC.CreateCompatibleDC(&dc);

static bool Once = true;
if (Once)
{
m_bmp.CreateCompatibleBitmap(&dc,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN));
Once = false;
}

memDC.SelectObject(&m_bmp); dc.BitBlt(0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN),&memDC,0,0,SRCCOPY);
//dc.DeleteDC();
memDC.DeleteDC();
// TODO: 在此处添加消息处理程序代码

// 不要为绘制消息而调用 CWnd::OnPaint()
}

解决方案 »

  1.   

    楼主你是不是只想实现截屏一次?
    void CChildView::OnPaint()  
    {
    CPaintDC dc(this); //创建一个用于截屏的DC
    //dc.CreateDC(_T("Display"), NULL, NULL, NULL); //然后就截屏咯 // 用于绘制的设备上下文static bool Once = true;
    if (Once)
    {
    CDC memDC;memDC.CreateCompatibleDC(&dc);m_bmp.CreateCompatibleBitmap(&dc,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN));
    memDC.SelectObject(&m_bmp);dc.BitBlt(0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN),&memDC,0,0,SRCCOPY);
    //dc.DeleteDC();
    memDC.DeleteDC();Once = false;
    }// TODO: 在此处添加消息处理程序代码// 不要为绘制消息而调用 CWnd::OnPaint()
    }否者第二次运行的时候,你的memdc连画布都没绑定,肯定是黑的啊...
      

  2.   

    或者楼主这么试试
    CBitamp *pOldBmp = memDC.SelectObject(&m_bmp);
    memDC.SelectObject(&m_bmp);
    dc.BitBlt(0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN),&memDC,0,0,SRCCOPY);
    memdc.SelectObject(pOldBmp);