如何在MFC对话框中导入位图,并且当鼠标点击图时以鼠标为中心进行缩放
怎么在MFC对话框中导入位图,并且当鼠标点击图时以鼠标为中心进行缩放?
以下代码是点击对话框上的导入按钮时导入jpg图片,但图片超过窗口大小时只能显示一部分,怎么才能全部显示啊 ?(按窗口大小显示) ,还有当鼠标点击图时以鼠标为中心进行放大和缩小啊?
哪位朋友有这方面的代码发下啊,急啊,谢谢了
void CLargeDlg::OnButtonLoad()
{
// TODO: Add your control notification handler code here
// LoadPct("E:\T\Trouspy-MD 图片");
CDC *pDC = GetDC();
IPicture *pPic;
IStream *pStm;
CFileStatus fstatus; //CFileStatus文件属性类
CFile file;
LONG cb;
//1 打开文件并获得文件的真实大小
if (file.Open("E:\\095539_812_h.jpg",CFile::modeRead)
&& file.GetStatus("E:\\095539_812_h.jpg", fstatus)
&& ((cb = fstatus.m_size) != -1))
{
//2 从堆中分配指定数量字节的一整块,这时系统无法提供零零碎碎的局部或全局的堆
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
//3 锁定全局内存对象并返回它的首地址
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
//4 把文件内容读进全局内存对象的地址空间中
file.ReadHuge(pvData, cb);
//5 GlobalUnlock函数把以GMEM_MOVEABLE方式分配的内存对象的锁定计数器减1
GlobalUnlock(hGlobal);
//6 从全局内存中创建stream对象,第二个参数指定当stream释放时是否自动释放全局内存
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//7 创建一个新的picture对象并用stream对象中的内容初始化
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
//8 得到picture对象中图片的宽和高
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
//9 GetDeviceCaps(HORZRES)得到屏幕的宽度(单位:像素)
//GetDeviceCaps(HORZSIZE)得到屏幕的宽度(单位:毫米)
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/
((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/
((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
//10 释放不要的stream对象并清空stream指针
pStm->Release();
pStm=NULL;
//11 把图像显示在dc中
if(FAILED(pPic->Render(*pDC/*pDC->GetSafeHdc()*/,100,50,(DWORD)fX,(DWORD)fY,0,hmHeight,hmHeight,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
//pDC->StretchBlt(0,0,1024,758,pDC,0,0,hmHeight,hmWidth,SRCCOPY);
// ::StretchDIBits(pDC,0,0,1024,758,0,0,1000,1000,SRCCOPY);
UpdateData(FALSE);
m_i =1;
//pPic->St
// StretchBl();
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(100,50,"这是一个JPG图像");
//12 释放不要的picture对象,并把指针清空
pPic->Release();
pPic=NULL;
//13 释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
FreeResource(hGlobal);
}
else
{
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
}
else
{
AfxMessageBox("Can't Open Image File!");
}
}
------解决方案--------------------
StretchBlt()函数
以下代码是点击对话框上的导入按钮时导入jpg图片,但图片超过窗口大小时只能显示一部分,怎么才能全部显示啊 ?(按窗口大小显示) ,还有当鼠标点击图时以鼠标为中心进行放大和缩小啊?
哪位朋友有这方面的代码发下啊,急啊,谢谢了
void CLargeDlg::OnButtonLoad()
{
// TODO: Add your control notification handler code here
// LoadPct("E:\T\Trouspy-MD 图片");
CDC *pDC = GetDC();
IPicture *pPic;
IStream *pStm;
CFileStatus fstatus; //CFileStatus文件属性类
CFile file;
LONG cb;
//1 打开文件并获得文件的真实大小
if (file.Open("E:\\095539_812_h.jpg",CFile::modeRead)
&& file.GetStatus("E:\\095539_812_h.jpg", fstatus)
&& ((cb = fstatus.m_size) != -1))
{
//2 从堆中分配指定数量字节的一整块,这时系统无法提供零零碎碎的局部或全局的堆
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
//3 锁定全局内存对象并返回它的首地址
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
//4 把文件内容读进全局内存对象的地址空间中
file.ReadHuge(pvData, cb);
//5 GlobalUnlock函数把以GMEM_MOVEABLE方式分配的内存对象的锁定计数器减1
GlobalUnlock(hGlobal);
//6 从全局内存中创建stream对象,第二个参数指定当stream释放时是否自动释放全局内存
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//7 创建一个新的picture对象并用stream对象中的内容初始化
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
//8 得到picture对象中图片的宽和高
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
//9 GetDeviceCaps(HORZRES)得到屏幕的宽度(单位:像素)
//GetDeviceCaps(HORZSIZE)得到屏幕的宽度(单位:毫米)
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/
((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/
((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
//10 释放不要的stream对象并清空stream指针
pStm->Release();
pStm=NULL;
//11 把图像显示在dc中
if(FAILED(pPic->Render(*pDC/*pDC->GetSafeHdc()*/,100,50,(DWORD)fX,(DWORD)fY,0,hmHeight,hmHeight,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
//pDC->StretchBlt(0,0,1024,758,pDC,0,0,hmHeight,hmWidth,SRCCOPY);
// ::StretchDIBits(pDC,0,0,1024,758,0,0,1000,1000,SRCCOPY);
UpdateData(FALSE);
m_i =1;
//pPic->St
// StretchBl();
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(100,50,"这是一个JPG图像");
//12 释放不要的picture对象,并把指针清空
pPic->Release();
pPic=NULL;
//13 释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
FreeResource(hGlobal);
}
else
{
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
}
else
{
AfxMessageBox("Can't Open Image File!");
}
}
------解决方案--------------------
StretchBlt()函数