对话框常驻视图之上,想保存视图为BMP,但不保存对话框,请指教.

解决方案 »

  1.   

    双缓冲技术:CDC   MemDC;   //定义一个显示设备对象   
    CBitmap   MemBitmap;//定义一个位图对象   
      //建立与屏幕显示兼容的内存显示设备   
      MemDC.CreateCompatibleDC(NULL);       
      //建立一个与屏幕显示兼容的位图,位图的大小用窗口的大小   
      MemBitmap.CreateCompatibleBitmap(pDC,sz.cx,sz.cy);   
          
      //将位图选入到内存显示设备中      
      CBitmap   *pOldBit=MemDC.SelectObject(&MemBitmap);   
        
      //用背景色将位图清除干净      
      MemDC.FillSolidRect(0,0,sz.cx,sz.cy,RGB(255,255,255));   
        
      //绘图   
     MemDC.Move(0,0);
    MemDC.LineTo(300,300);   MemBitmap不就是你要的位图吗?//将内存中的图拷贝到屏幕上进行显示  
    pDC->BitBlt(0,0,sz.cx,sz.cy,&MemDC,0,0,SRCCOPY);   
      //绘图完成后的清理   
      MemBitmap.DeleteObject();   
      MemDC.DeleteDC(); 
    }
      

  2.   

    保存视图客户区
    void CXXXView::SaveToBmp()
    {
    BITMAPINFO bi;//信息头
    void *pBits=NULL;
    CRect rect;//客户区窗口
    GetClientRect(&rect);
    int nWidth=rect.right;
    int nHeight=rect.bottom;
    //填充信息头
    ZeroMemory(&bi,sizeof(bi));
    bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
    bi.bmiHeader.biHeight=nHeight;
    bi.bmiHeader.biWidth=nWidth;
    bi.bmiHeader.biPlanes=1;
    bi.bmiHeader.biBitCount=24;
    bi.bmiHeader.biCompression=BI_RGB;
    bi.bmiHeader.biSizeImage=3*nWidth*nHeight; //拷贝客户区至内存DC
    HDC hActiveDC=::GetDC(this->m_hWnd);
    HDC hActiveWndCompatibleDC=CreateCompatibleDC(hActiveDC);
    HBITMAP hActiveWndCompactibleBitmap=CreateCompatibleBitmap(hActiveDC,rect.right,rect.bottom);
    SelectObject(hActiveWndCompatibleDC,hActiveWndCompactibleBitmap);

    BitBlt(hActiveWndCompatibleDC,0,0,rect.right,rect.bottom,hActiveDC,0,0,SRCCOPY);

    //保存内存DC
    HDC hBmpFileDC=CreateCompatibleDC(hActiveWndCompatibleDC);
    HBITMAP hBmpFileBitmap=CreateDIBSection(hActiveWndCompatibleDC,&bi,DIB_RGB_COLORS,&pBits,NULL,0);
    SelectObject(hBmpFileDC,hBmpFileBitmap);
    BitBlt(hBmpFileDC,0,0,nWidth,nHeight,hActiveWndCompatibleDC,0,0,SRCCOPY);

    CString tempFileName=_T("test.bmp");//目标文件名
    CFileDialog dlg(FALSE, _T("bmp"), _T("Temp.bmp"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Bitmap Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"), this);
    if(dlg.DoModal() == IDOK)
    {
    tempFileName=dlg.GetPathName();
    }
    HANDLE hFile=CreateFile(tempFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFile!=INVALID_HANDLE_VALUE)
    {
    DWORD dwRet=0;
    //填充文件头
    BITMAPFILEHEADER bmfHeader;
    ZeroMemory(&bmfHeader,sizeof(bmfHeader));
    bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    bmfHeader.bfSize=bi.bmiHeader.biSizeImage+bmfHeader.bfOffBits;
    bmfHeader.bfType='MB';
    WriteFile(hFile,&bmfHeader,sizeof(bmfHeader),&dwRet,NULL);
    WriteFile(hFile,&bi.bmiHeader,sizeof(bi.bmiHeader),&dwRet,NULL);
    WriteFile(hFile,pBits,bi.bmiHeader.biSizeImage,&dwRet,NULL);
    CloseHandle(hFile);
    }
    }
      

  3.   

    如果你是用截图方法来截获客户区的,想把对话框去掉很难,你可以在对话框出现之前截图,或截图之前销毁对话框,如果必须在有对话框的时候截图,你可以采用一楼的方法,在对话框出现之前截图,把图片放在一个内存DC中就行了CClientDC dc(this);与当前窗口的设备上下文
    CDC       MemDC;       //定义一个显示设备对象      
    CBitmap       MemBitmap;//定义一个位图对象      
     //建立与屏幕显示兼容的内存显示设备      
    MemDC.CreateCompatibleDC(&dc);              
    //建立一个与屏幕显示兼容的位图,位图的大小用窗口的大小      
     MemBitmap.CreateCompatibleBitmap(&dc,cx,cy);    //cx,cy为图片大小,可以设置为你要截区域的大小  
               
     //将位图选入到内存显示设备中            
      CBitmap       *pOldBit=MemDC.SelectObject(&MemBitmap);
     MemDC.m.BitBlt(0,0,nx,ny,&dc,0,0,SRCCOPY);    //把你要保存的部分放到兼容DC中 
    这时MemBitmap中就是你要保存的图片
           
             
           
        //绘图      
         MemBitmap不就是你要的位图吗?//将内存中的图拷贝到屏幕上进行显示    
    pDC-> BitBlt(0,0,sz.cx,sz.cy,&MemDC,0,0,SRCCOPY);      
        //绘图完成后的清理      
        MemBitmap.DeleteObject();      
        MemDC.DeleteDC();