MFC中,如何给基本对话框加上JPG格式的背景图片
建立一个基本对话框,之后我想加入一幅JPG格式的图片作为背景.再在这对话框中建立几个按钮控件....当然,这几个控件不能被图片盖过......
建立一个基本对话框,之后我想加入一幅JPG格式的图片作为背景.再在这对话框中建立几个按钮控件....当然,这几个控件不能被图片盖过...
展开
3个回答
2013-06-26
展开全部
#ifndef HIMETRIC_INCH
#define HIMETRIC_INCH 2540
#endif
CString picfullname = "test.jpg";
CDC* pDC = GetDC();
IPicture* pPic;
IStream* pStm;
CFileStatus fstatus; //CFileStatus文件属性类
CFile file;
LONG cb;
//打开文件并获得文件的真实大小
if(file.Open(picfullname, CFile::modeRead)
&&file.GetStatus(picfullname, fstatus)
&&(-1 != (cb = fstatus.m_size)))
{
//从堆中分配指定数量字节的一整块,这时系统无法提供零零碎碎的局部或全局的堆
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if(NULL != hGlobal)
{
//锁定全局内存对象并返回它的首地址
if(NULL != (pvData = GlobalLock(hGlobal)))
{
//把文件内容读进全局内存对象的地址空间中
file.ReadHuge(pvData, cb);
//GlobalUnlock函数把以GMEM_MOVEABLE方式分配的内存对象的锁定计数器减1
GlobalUnlock(hGlobal);
//从全局内存中创建stream对象,第二个参数指定当stream释放时是否自动释放全局内存
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//创建一个新的picture对象并用stream对象中的内容初始化
if(SUCCEEDED(OleLoadPicture(pStm, fstatus.m_size, TRUE, IID_IPicture, (LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
//得到picture对象中图片的宽和高
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
int nWidth = MulDiv(hmWidth, pDC->GetDeviceCaps(LOGPIXELSX), HIMETRIC_INCH);
int nHeight = MulDiv(hmHeight, pDC->GetDeviceCaps(LOGPIXELSY), HIMETRIC_INCH);
pStm->Release();
pStm = NULL;
//把图像显示在dc中
CRect rect;
GetClientRect(&rect);
//if(FAILED(pPic->Render(*pDC, 0, 0, (DWORD)nWidth, (DWORD)nHeight, 0, hmHeight, hmWidth, -hmHeight, NULL)))
if(FAILED(pPic->Render(*pDC, 0, 0, rect.Width(), rect.Height(), 0, hmHeight, hmWidth, -hmHeight, NULL)))
{
MessageBox("图片出错!", "提示", MB_ICONINFORMATION);
}
pDC->SetBkMode(TRANSPARENT);
//释放不要的picture对象,并把指针清空
pPic->Release();
pPic = NULL;
//释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
FreeResource(hGlobal);
}
else
{
MessageBox("图片出错!", "提示", MB_ICONINFORMATION);
}
}
}
}
else
{
MessageBox("图片出错!", "提示", MB_ICONINFORMATION);
}
#define HIMETRIC_INCH 2540
#endif
CString picfullname = "test.jpg";
CDC* pDC = GetDC();
IPicture* pPic;
IStream* pStm;
CFileStatus fstatus; //CFileStatus文件属性类
CFile file;
LONG cb;
//打开文件并获得文件的真实大小
if(file.Open(picfullname, CFile::modeRead)
&&file.GetStatus(picfullname, fstatus)
&&(-1 != (cb = fstatus.m_size)))
{
//从堆中分配指定数量字节的一整块,这时系统无法提供零零碎碎的局部或全局的堆
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if(NULL != hGlobal)
{
//锁定全局内存对象并返回它的首地址
if(NULL != (pvData = GlobalLock(hGlobal)))
{
//把文件内容读进全局内存对象的地址空间中
file.ReadHuge(pvData, cb);
//GlobalUnlock函数把以GMEM_MOVEABLE方式分配的内存对象的锁定计数器减1
GlobalUnlock(hGlobal);
//从全局内存中创建stream对象,第二个参数指定当stream释放时是否自动释放全局内存
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//创建一个新的picture对象并用stream对象中的内容初始化
if(SUCCEEDED(OleLoadPicture(pStm, fstatus.m_size, TRUE, IID_IPicture, (LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
//得到picture对象中图片的宽和高
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
int nWidth = MulDiv(hmWidth, pDC->GetDeviceCaps(LOGPIXELSX), HIMETRIC_INCH);
int nHeight = MulDiv(hmHeight, pDC->GetDeviceCaps(LOGPIXELSY), HIMETRIC_INCH);
pStm->Release();
pStm = NULL;
//把图像显示在dc中
CRect rect;
GetClientRect(&rect);
//if(FAILED(pPic->Render(*pDC, 0, 0, (DWORD)nWidth, (DWORD)nHeight, 0, hmHeight, hmWidth, -hmHeight, NULL)))
if(FAILED(pPic->Render(*pDC, 0, 0, rect.Width(), rect.Height(), 0, hmHeight, hmWidth, -hmHeight, NULL)))
{
MessageBox("图片出错!", "提示", MB_ICONINFORMATION);
}
pDC->SetBkMode(TRANSPARENT);
//释放不要的picture对象,并把指针清空
pPic->Release();
pPic = NULL;
//释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
FreeResource(hGlobal);
}
else
{
MessageBox("图片出错!", "提示", MB_ICONINFORMATION);
}
}
}
}
else
{
MessageBox("图片出错!", "提示", MB_ICONINFORMATION);
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-06-26
展开全部
mfc只能识别bmp吧 你把jpg图片转成bmp格式的 用windows画图就可以,然后再资源里面添加位图资源,在对话框里放一个位图对话框,设置位图为你的图片 设置属性为透明
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询