请教高手,关于加载背景图片的问题 请教高手,我新做了一个项目,是mfc 单文档框架,现在我想在我的主程序运行后再视图区加载一个公司的jpg图片上去,感觉挺麻烦,望指点迷津,我的视图区是基于view类 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 麻烦一点的是你可能需要处理透明的问题,否则一张方方正正的图片,在不同的分辨率下有点丑最好是写一个Static的继承类,在里面处理OnPaint消息,根据背景对于图片透明化,动态打印其它启动字幕 如果想简单点,建议把JPG图片转换成BMP图片然后加到资源中,假如浆糊ID为:IDB_BACKGROUND,再增加如下代码即可:void CXXXView::OnDraw(CDC* pDC){ CSurfaceDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); DrawBackGround(pDC, IDB_BACKGROUND);}void CXXXView::DrawBackGround(CDC *pDC, UINT nIDResource){ CBitmap bitmap; if (!bitmap.LoadBitmap(IDB_BACKGROUND)) return; CDC dcImage; if (!dcImage.CreateCompatibleDC(pDC)) return; BITMAP bm; bitmap.GetBitmap(&bm); // Paint the image. CBitmap* pOldBitmap = dcImage.SelectObject(&bitmap); pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcImage, 0, 0, SRCCOPY); dcImage.SelectObject(pOldBitmap); } void CBhView::OnDraw(CDC* pDC){ CBhDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here IPicture *pPic; IStream *pStm; CFileStatus fstatus; CFile file; LONG cb; char buffer[200]; _getcwd(buffer,200); CString str=buffer; str.Format(_T("%s"), buffer); str = buffer; str=str+"\\1.jpg";//注意在串里面的就是字符,如果要输出一个字符 //“/”,就是要输出一个转义的字符 // AfxMessageBox(str); if (file.Open(str,CFile::modeRead) && file.GetStatus(str, fstatus) && ((cb = fstatus.m_size) != -1)) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = NULL; if (hGlobal != NULL) { if ((pvData = GlobalLock(hGlobal)) != NULL) { file.ReadHuge(pvData, cb); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE, IID_IPicture,(LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); double fX,fY; 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); // (DWORD)fX,(DWORD)fY if(FAILED(pPic->Render(*pDC,0,0,500,300, 0,hmHeight,hmWidth,-hmHeight,NULL))) AfxMessageBox("Failed To Render The picture!"); //pDC->TextOut(120,175,"这是一个JPG图像"); pPic->Release(); } else { AfxMessageBox("Error Loading Picture From Stream!"); } } } } else { AfxMessageBox("Can't Open Image File!"); }}//给楼主一个我已经实现的例子,在view类中重载ondraw,要在文件头加上#include <direct.h>,因为运用了_getcwd获取当前路径库函数,str=str+"\\1.jpg"是加载jpg文件的名称。 多线程中用Mutex互斥访问资源的问题 谁知道关于打印方面的资料,代码??? windows 核心编程源码的问题 急问!! 属性业怎么会显示乱码 一个简单的问题?来者送分。 问一个比较菜的问题,但是很急,请大家帮帮忙~~~~~~~ 《VC++6.0时尚编程百例》中CView::OnLButtonDown(..)的作用? 我想实现某各类在创建对象时从一大堆函数中及选择其中一个封装到这个对象中,有什么好的实现方法吗?这一堆函数放在类外。 编写ASP组件该用什么方法?ATL?那有这方面的好书介绍一下吗? 求助一个右键打开文件的问题。 CView消息
然后加到资源中,假如浆糊ID为:IDB_BACKGROUND,再增加如下代码即可:void CXXXView::OnDraw(CDC* pDC)
{
CSurfaceDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); DrawBackGround(pDC, IDB_BACKGROUND);
}void CXXXView::DrawBackGround(CDC *pDC, UINT nIDResource)
{
CBitmap bitmap;
if (!bitmap.LoadBitmap(IDB_BACKGROUND))
return;
CDC dcImage;
if (!dcImage.CreateCompatibleDC(pDC))
return;
BITMAP bm;
bitmap.GetBitmap(&bm);
// Paint the image.
CBitmap* pOldBitmap = dcImage.SelectObject(&bitmap);
pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcImage, 0, 0, SRCCOPY);
dcImage.SelectObject(pOldBitmap);
}
{
CBhDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
IPicture *pPic;
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
char buffer[200];
_getcwd(buffer,200);
CString str=buffer;
str.Format(_T("%s"), buffer);
str = buffer;
str=str+"\\1.jpg";//注意在串里面的就是字符,如果要输出一个字符
//“/”,就是要输出一个转义的字符
// AfxMessageBox(str);
if (file.Open(str,CFile::modeRead)
&& file.GetStatus(str, fstatus)
&& ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,
IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
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);
// (DWORD)fX,(DWORD)fY
if(FAILED(pPic->Render(*pDC,0,0,500,300,
0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
//pDC->TextOut(120,175,"这是一个JPG图像");
pPic->Release();
}
else
{
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
}
else
{
AfxMessageBox("Can't Open Image File!");
}
}
//给楼主一个我已经实现的例子,在view类中重载ondraw,要在文件头加上#include <direct.h>,因为运用了_getcwd获取当前路径库函数,str=str+"\\1.jpg"是加载jpg文件的名称。