void CMyDlg::OnBnClickedSave()
{
CClientDC dc(this);
CBitmap bmpForSave;
CDC cdcForSave;
CRect r;
r.bottom = m_ptEnd.y;
r.top    = m_ptOrigin.y;
r.left   = m_ptOrigin.x;
r.right  = m_ptEnd.x;
bmpForSave.CreateCompatibleBitmap(&dc, r.Width(), r.Height());
cdcForSave.CreateCompatibleDC(&dc);
cdcForSave.SelectObject(bmpForSave);
cdcForSave.BitBlt(0, 0, r.Width(), r.Height(), &dc, 0, 0, SRCCOPY); CImage image;
image.Attach((HBITMAP)bmpForSave);
image.Save(L"d:\\test.jpg");
image.Detach();
// TODO: Add your control notification handler code here
}这样的 只能保存客户区窗口的图片 不能保存rect结构体的
另外顺便问下MFC怎么加载非BMP格式的图片?

解决方案 »

  1.   

    第一个问题:
    CDC cdcForSave;
    int w = m_ptEnd.x - m_ptOrigin.x;
    int h = m_ptEnd.y - m_ptOrigin.y;
    bmpForSave.CreateCompatibleBitmap(&dc, w, h);
    cdcForSave.CreateCompatibleDC(&dc);
    cdcForSave.SelectObject(bmpForSave);
    cdcForSave.BitBlt(0, 0, w, h, &dc, m_ptOrigin.x, m_ptOrigin.y, SRCCOPY);第二个问题:
    HRESULT CImage::Load(
       LPCTSTR pszFileName 
    ) throw( );
    加载常用的文件格式
      

  2.   


    大哥 实际上r.Width()就是m_ptEnd.x - m_ptOrigin.x  
    您的更改换汤不换药啊 还是一样的效果 只是去掉rect结构体而已 
    我觉得要改应该是this这里  他代表的就是整个客户区,要是能代表rect这个区域就好了  还是谢谢你了
      

  3.   

    网上到处都是:HBITMAP CopyScreenToBitmap(LPRECT lpRect)
    {
    HDC hScrDC, hMemDC;      
    // 屏幕和内存设备描述表
    HBITMAP hBitmap,hOldBitmap;   
    // 位图句柄
    int        nX, nY, nX2, nY2;      
    // 选定区域坐标
    int        nWidth, nHeight;      
    // 位图宽度和高度
    int        xScrn, yScrn;         
    // 屏幕分辨率
    // 确保选定区域不为空矩形
    if (IsRectEmpty(lpRect))
       return NULL;
    //为屏幕创建设备描述表
    hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
    //为屏幕设备描述表创建兼容的内存设备描述表
    hMemDC = CreateCompatibleDC(hScrDC);
    // 获得选定区域坐标
    nX = lpRect->left;
    nY = lpRect->top;
    nX2 = lpRect->right;
    nY2 = lpRect->bottom;
    // 获得屏幕分辨率
    xScrn = GetDeviceCaps(hScrDC,  HORZRES);
    yScrn = GetDeviceCaps(hScrDC,VERTRES );
    //确保选定区域是可见的
    if (nX < 0)
       nX = 0;
    if (nY < 0)
       nY = 0;
    if (nX2 > xScrn)
       nX2 = xScrn;
    if (nY2 > yScrn)
       nY2 = yScrn;
    nWidth = nX2 - nX;
    nHeight = nY2 - nY;
    // 创建一个与屏幕设备描述表兼容的位图
    hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
    // 把新位图选到内存设备描述表中
    hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
    // 把屏幕设备描述表拷贝到内存设备描述表中
    BitBlt(hMemDC,0,0, nWidth,nHeight,hScrDC, nX, nY, SRCCOPY);
    //得到屏幕位图的句柄
    hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);
    //清除 
    DeleteDC(hScrDC);
    DeleteDC(hMemDC);
    // 返回位图句柄
    return hBitmap;
    }
      

  4.   

    CRectTracker _tracker; _tracker.m_rect.left = 10;
    _tracker.m_rect.top = 10;
    _tracker.m_rect.right = 101;
    _tracker.m_rect.bottom = 101; _tracker.m_nStyle = CRectTracker::solidLine; _tracker.m_nStyle &= ~CRectTracker::resizeOutside;
    _tracker.m_nStyle ^= CRectTracker::resizeInside;用这个
      

  5.   

    cdcForSave.BitBlt(0, 0, r.Width(), r.Height(), &dc, 0, 0, SRCCOPY);
    //前面四个是你要绘制的区域,0,0表示起始点,后面两个表示宽高,想保存一个rect的,更改这四个值
      

  6.   


    如果前两个改成10,10 表示 他会贴图从10,10这个左上角定点开始 右下角会有图片(图片还是对话框左上角的部分,不是我要的rect) ,但是上面和左边一截都是黑的。 
    总之  那个dc定死了 是从客户区的左上角开始拿图片,不能拿别的区域的图片,贴的是&dc,不是&rect。我要的功能是BitBlt(0, 0, r.Width(), r.Height(), &rect, 0, 0, SRCCOPY);
    但是这明显不可能呀,谁懂我说的不?
      

  7.   


    我改的有一个换汤又换药的地方,把后面两个0改成了m_ptOrigin.x, m_ptOrigin.y:
    cdcForSave.BitBlt(0, 0, w, h, &dc, m_ptOrigin.x, m_ptOrigin.y, SRCCOPY);
    这样就可以实现取Rect(m_ptOrigin, m_ptEnd)的区域。试试看,应该行了。int w = m_ptEnd.x - m_ptOrigin.x; 只是为了简化代码,提高效率,习惯而已。
      

  8.   

    第二个问题:
    CString        ext = strFileName.Right(strFileName.GetLength() - strFileName.ReverseFind('.')-1);
    std::string    strType = ext.GetBuffer(100);
    ext.ReleaseBuffer();
    DWORD dFileType = CxImage::GetTypeIdFromName(strType.c_str());
    CxImage cImage;
    cImage.Load(strFileName.c_str(),dFileType);
    CRect PicRect;
    GetDlgItem(IDC_PIC)->GetClientRect(&PicRect);
    HDC tDC = ::GetDC(::GetDlgItem(m_hWnd,IDC_PIC));
    cImage.Draw(tDC,PicRect);
      

  9.   


    多谢大哥指点 小弟还是没仔细看api,一看bitbit就知道了 之前按你的做的时候前面用了setwindowory 哈哈多谢了