当前位置: 代码迷 >> VC/MFC >> MFC 如何在指定位置显示指定路径的图片
  详细解决方案

MFC 如何在指定位置显示指定路径的图片

热度:98   发布时间:2016-05-02 03:48:12.0
MFC 怎么在指定位置显示指定路径的图片?
RT,MFC,编程环境是VC6.0,没法用CImage,请问用什么函数可以在窗口制定位置显示图片?
------解决思路----------------------
给你个显示BMP例子自己推敲
1、设置成员变量

// BITMAPINFO结构指针
BITMAPINFO *m_pBMI;
// DIB图像数据指针
byte *m_pDIBData;

2、从文件中读出图片

// 取位图文件
void CComHelpDlg::ShowBmp(CString name)
{
CFile f1;
BITMAPFILEHEADER bfh; // 位图头结构
BITMAPINFO binfo; // 位图信息结构
int len;

// 打开图像文件
if(!f1.Open(name,CFile::modeRead 
------解决思路----------------------
 CFile::typeBinary)) // 打开位图文件
return;
if(f1.Read(&bfh,sizeof(bfh))!=sizeof(bfh)) // 读信息头
return;
if(bfh.bfType!=19778) // 判定是否为BMP文件
return;
if(f1.Read(&binfo,sizeof(BITMAPINFO))!=sizeof(BITMAPINFO)) // 读位图信息
{
return;
}
len=binfo.bmiHeader.biSizeImage; // 数据文件长
// 位图信息
BITMAPINFO *pBMI=(BITMAPINFO *)new byte[sizeof(BITMAPINFOHEADER)]; // 信息转存
memcpy(pBMI,&binfo,sizeof(BITMAPINFOHEADER));
// 位图数据
byte *pDIBData=new byte[len];

// 读入位图数据
f1.Seek(bfh.bfOffBits,CFile::begin);
if(f1.Read(pDIBData,len)!=len)
return;
f1.Close(); // 关闭文件
if(m_pBMI!=NULL)
delete m_pBMI;
m_pBMI=pBMI;
if(m_pDIBData!=NULL)
delete m_pDIBData;
m_pDIBData=pDIBData;
m_fBitBk=true; // 已经设置了背景
}

3、显示图片

// 显示位图
void CComHelpDlg::Show(CDC * pDC, int nLeft, int nTop, int nWidth, int nHeight)
{
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),
nLeft,
nTop,
nWidth,
nHeight,
0,
0,
m_pBMI->bmiHeader.biWidth,
m_pBMI->bmiHeader.biHeight,
m_pDIBData,
m_pBMI,
DIB_RGB_COLORS,
SRCCOPY);
}

使用完成后注意释放用new分配的内存!
以上是我程序中的片段,仅供分析和参考!
------解决思路----------------------
可以显示JPG,BMP的函数,如果显示GIF,只可以显示第一帧
你可以把该函数添加成你的类的成员函数也可以
在画图函数里调用就可以了
比如:
void     xxx::OnPaint()
{
       CPaintDC dc(this);
      ShowPic(&dc,"C:\\A.jpg",0,0,100,200);
}
BOOL  ShowPic(CDC *pDC,CString lpstrFile,int sx,int sy,int nScrWidth, int nScrHeight)
{
IPicture  *pPic;  
IStream   *pStm;  
BOOL      bResult;  

HANDLE    hFile=NULL;  
DWORD     dwFileSize,dwByteRead;  
//打开硬盘中的图形文件  
hFile=CreateFile(lpstrFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  
if (hFile!=INVALID_HANDLE_VALUE)  
{  
dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数  
if(dwFileSize==0xFFFFFFFF)  
{
CloseHandle(hFile);
return FALSE;  
}
}  
else  
{  
return FALSE;  
}  

//分配全局存储空间  
  HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);  
if(hGlobal==NULL)   return FALSE;  

  LPVOID  pvData =GlobalLock(hGlobal);  
if(pvData==NULL)//锁定分配内存块  
  {
GlobalFree(hGlobal);
return FALSE;  
    }
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区  
  CloseHandle(hFile);//关闭打开的文件  

  GlobalUnlock(hGlobal);  
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);  

  //装入图形文件  
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);  
  GlobalFree(hGlobal);

if(FAILED(bResult))  return FALSE;  

  long   hmWidth;//图片的真实宽度  
  long   hmHeight;//图片的真实高度  
  pPic->get_Width(&hmWidth);  
pPic->get_Height(&hmHeight);  

//将图形输出到屏幕上(有点像BitBlt)  
bResult=pPic->Render(pDC->m_hDC,sx,sy,nScrWidth,nScrHeight,0,hmHeight,hmWidth,-hmHeight,NULL);  
pPic->Release();  

return   TRUE;  
}
  相关解决方案