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格式的图片?
{
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格式的图片?
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( );
加载常用的文件格式
大哥 实际上r.Width()就是m_ptEnd.x - m_ptOrigin.x
您的更改换汤不换药啊 还是一样的效果 只是去掉rect结构体而已
我觉得要改应该是this这里 他代表的就是整个客户区,要是能代表rect这个区域就好了 还是谢谢你了
{
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;
}
_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;用这个
//前面四个是你要绘制的区域,0,0表示起始点,后面两个表示宽高,想保存一个rect的,更改这四个值
如果前两个改成10,10 表示 他会贴图从10,10这个左上角定点开始 右下角会有图片(图片还是对话框左上角的部分,不是我要的rect) ,但是上面和左边一截都是黑的。
总之 那个dc定死了 是从客户区的左上角开始拿图片,不能拿别的区域的图片,贴的是&dc,不是&rect。我要的功能是BitBlt(0, 0, r.Width(), r.Height(), &rect, 0, 0, SRCCOPY);
但是这明显不可能呀,谁懂我说的不?
我改的有一个换汤又换药的地方,把后面两个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; 只是为了简化代码,提高效率,习惯而已。
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);
多谢大哥指点 小弟还是没仔细看api,一看bitbit就知道了 之前按你的做的时候前面用了setwindowory 哈哈多谢了