显示图片汇总

显示图片汇总

上一章总结了加载图片的几种方法,这章我总结一下显示图片的几种常用方法,希望对各位有所帮助

1、用Picture控件显示图片

1、首先添加Picture控件,ID为IDC_IMG_BTM
2、定义 CBitmap* m_pBitmap;
3、导入图片,并定义ID为IDB_TEST_IMG
4、动态加载代码如下:
 CStatic* pImage = (CStatic*)GetDlgItem(IDC_IMG_BTM);
m_pBitmap = new CBitmap;
m_pBitmap->LoadBitmap(IDB_TEST_IMG);    
pImage->SetBitmap(HBITMAP(*m_pBitmap));
5、最后别忘了delete m_pBitmap指针。
示例(可更改图片大小):
CStatic *mPicture = (CStatic *)GetDlgItem(pictureGroup1[i]); 
HICON hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_CHK), IMAGE_ICON, 16, 16, 0);    
mPicture->ModifyStyle(0x0,SS_ICON|SS_CENTERIMAGE);   
mPicture->SetIcon(hIcon); 

2、用DC显示图片

//创建DC    
CClientDC dc(GetDlgItem(资源ID));    
//获取图片内容    
BITMAP bm; 
CBitmap* hbmp = CBitmap::FromHandle(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1)));
hbmp->GetBitmap(&bm);
CDC dcMem;     
//创建兼容DC    
dcMem.CreateCompatibleDC(&dc); 
CBitmap *pOldBitmap=dcMem.SelectObject(hbmp);  
CRect lRect;   
//获取Static控件的大小范围  
m_bt_1.GetClientRect(&lRect);    
//在Static控件上显示位图       
//判断是否需要调整到适合画布   
dc.StretchBlt(lRect.left, lRect.top, lRect.Width()+100, lRect.Height()+100,
&dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);   
dc.SelectObject(pOldBitmap);

3、控件上显示图片

 HBITMAP hbitmap;
 //将pStatic指向要显示的地方
 CStatic *pStatic = NULL;
 //根据ID获取Static控件
 pStatic=(CStatic*)GetDlgItem(IDC_BUTTON1);
 //装载资源*.bmp
 hbitmap=(HBITMAP)::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
 CBitmap hbmp;
 hbmp.Attach(hbitmap);
 //获取图片内容
 BITMAP bm;
 hbmp.GetBitmap(&bm);
 CDC dcMem;
 //创建兼容DC
 dcMem.CreateCompatibleDC(GetDC());
 CBitmap *pOldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);
 CRect lRect;
 //获取Static控件的大小范围
 pStatic->GetClientRect(&lRect);
 //在Static控件上显示位图
 pStatic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),
  &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
 dcMem.SelectObject(&pOldBitmap);

用这种方法可以在按钮上绘制图片

4、用com显示图片

#include<ocidl.h>
#include<olectl.h>

// lpstrFile:文件名(最好是包含路径在内) 
// hWnd 
// nScrWidth:输出图片的宽度 
// nScrHeight:输出图片的高度 
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸 

HRESULT ShowPic(TCHAR *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight)
{
	HDC hDC_Temp=GetDC(hWnd);
	
	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)
			return E_FAIL ;
	}
	else 
	{
		return E_FAIL ;
	}
	
	
	//分配全局存储空间 
	HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);
	LPVOID pvData=NULL ;
	
	if(hGlobal==NULL)
		return E_FAIL ;
	
	//锁定分配内存块 
	if((pvData=GlobalLock(hGlobal))==NULL)return E_FAIL ;
	
	ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);
	//把文件读入内存缓冲区 
	
	GlobalUnlock(hGlobal);
	
	CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
	
	//装入图形文件 
	bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
	
	if(FAILED(bResult))
		return E_FAIL ;
	
	OLE_XSIZE_HIMETRIC hmWidth ;
	//图片的真实宽度 
	OLE_YSIZE_HIMETRIC hmHeight ;
	//图片的真实高度 
	pPic->get_Width(&hmWidth);
	pPic->get_Height(&hmHeight);
	
	if(hmWidth!=0) nScrHeight=(int)((long double)nScrWidth*hmHeight/hmWidth);
	//将图形输出到屏幕上(有点像BitBlt) 
	bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
		0,hmHeight,hmWidth,-hmHeight,NULL);
	
	pPic->Release();
	
	CloseHandle(hFile);
	//关闭打开的文件 
	
	if(SUCCEEDED(bResult))
	{
		return S_OK ;
	}
	else 
	{
		return E_FAIL ;
	}
}
这种方法有一个现成的封装类,下载地址: http://download.csdn.net/detail/windows_nt/5567871
加载图片汇总

你可能感兴趣的:(显示图片汇总)