⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setbg.cpp

📁 此上载文件包含了多个用vc开发的实例。包含了VCL控件的使用
💻 CPP
字号:
// SetBG.cpp : Implementation of CSetBG
#include "stdafx.h"
#include "WndBG.h"
#include "SetBG.h"
#include <comutil.h>
/////////////////////////////////////////////////////////////////////////////
//函数
//释放所有的图片空间
void CSetBG::ReleasePic()
{	
	//内存中的释放所以的图片空间
	if(m_IPic!=NULL)
	{  
		m_IPic->Release();
	}
	if(m_Bitmap!=NULL)
	{
		DeleteObject(m_Bitmap);
	
	}
}
//对外的接口
//作用:从自带的资源中装载图片
//ResourceID 是资源的编号 
//ResType 资源的类型,有BMP型包括 bmp图片 值取0
//					 有其它型包括 jpg,gif等 值取1
	
STDMETHODIMP CSetBG::LoadFromRes( int ResourceID,int ResType)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	//CString StrResType(ResType);

	bool Result;
	if (ResType==0)
	{
		Result=LoadBmpResource(ResourceID);
	}
	if (ResType==1)
	{
		Result=LoadPicResource(ResourceID);
	}

	if (Result==true)
		return S_OK;
	else
		return S_FALSE;
}


//对外的接口
//作用:在指定的窗口中显示图片
//hWnd  要显示图片的窗口句柄
//x 图片要显示位置的x座标
//y 图片要显示位置的y座标
//PicType 要显示图片类型,有BMP型包括 bmp图片 值取0
//						有其它型包括 jpg,gif等 值取1	

STDMETHODIMP CSetBG::ShowPicByHandle(long hWnd,int x,int y,int PicType)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())
	// TODO: Add your implementation code here
	if(x<0||y<0)
		return false;
	
	if(PicType==0) 
		if(!ShowBmpInWnd(HWND(hWnd),x,y))
			return S_FALSE;
	if(PicType==1)
		if(!ShowPicInWnd(HWND(hWnd), x, y))
			return S_FALSE;
	return S_OK;
}
//函数
//作用:从自带的资源中装载BMP类型的图片(gif,jpg)
//		
//ResourceID 资源编号
//成功返回ture 失败返回false
bool CSetBG::LoadBmpResource(UINT  ResourceID)
{

	HRSRC hPic;
	HINSTANCE hInstance=AfxGetInstanceHandle();
	char *ResID=MAKEINTRESOURCE(ResourceID);
	
	hPic=FindResource(hInstance,ResID,RT_BITMAP);

	if (hPic==NULL)
	{
		AfxMessageBox("没有找到制定的资源!");
		return false;
	}
	
	if(m_Bitmap!=NULL)
	{
		DeleteObject(m_Bitmap);
	}
	
	m_Bitmap=LoadBitmap(hInstance,ResID);
	
	if(m_Bitmap==NULL)
	{
		AfxMessageBox("装载位图资源时出错!");
		return false;
	}
	return true;
}
//函数
//作用:从自带的资源中装载其它类型的图片(gif,jpg)
//		在资源中定制一种PIC类型的资源,用它导入gif和jpg文件
//ResourceID 资源编号
//成功返回ture 失败返回false
bool CSetBG::LoadPicResource(UINT  ResourceID)
{
	HRSRC hPic;
	HINSTANCE hInstance=AfxGetInstanceHandle();
	char *ResID=MAKEINTRESOURCE(ResourceID);
	
	hPic=FindResource(hInstance,ResID,"PIC");

	if (hPic==NULL)
	{
		AfxMessageBox("没有找到制定的资源!");
		return false;
	}
	
	HGLOBAL hGlobal=LoadResource(hInstance,hPic);
	if (hGlobal==NULL)
	{
		AfxMessageBox("装载资源时出错!");
		return false;
	}
	
	LockResource(hGlobal);
	if (hGlobal==NULL)
	{
		AfxMessageBox("资源加锁时出错!");
		return false;
	}
	
	ULONG nSize;
	nSize=SizeofResource(AfxGetInstanceHandle(),hPic);
	
	if(LockResource(hPic)==NULL)
	{
		AfxMessageBox("锁定资源时出错!");
		return false;
	}

	HGLOBAL hPicGMem=GlobalAlloc(GMEM_MOVEABLE,nSize);
	if (hPicGMem==NULL)
	{
		AfxMessageBox("分配内存时出错!");
		return false;
	}

	void *pvoid=GlobalLock(hPicGMem);
	memcpy(pvoid,hGlobal,nSize);
	GlobalUnlock(hPicGMem);
	IStream *pStream=NULL;
	if (this->m_IPic!=NULL)
		m_IPic->Release();
	
	if(CreateStreamOnHGlobal(hPicGMem,TRUE,&pStream)!=S_OK)
	{
		AfxMessageBox("创建流时出错!");	
		return false;
	}
   else 
	{	
   		if (FAILED(OleLoadPicture(pStream,nSize,FALSE,IID_IPicture,(LPVOID *)&m_IPic)))
	   {	
		
			AfxMessageBox("OLE 装载流时出错!");
			return false;
	   }
		else
		{
		pStream->Release();
		pStream=NULL;
		}
	}
   GlobalFree(hPicGMem);
   UnlockResource(hGlobal);
   FreeResource(hGlobal);
   return true;
}

//函数
//作用:在指定的窗口中显示BMP型的图片
//hWnd  要显示图片的窗口句柄
//x 图片要显示位置的x座标
//y 图片要显示位置的y座标
//成功返回ture 失败返回false
bool CSetBG::ShowBmpInWnd(HWND hwnd,UINT x,UINT y)
{
	if(hwnd==NULL)
		return false;
	RECT  ClientRect;
	if(!GetClientRect(hwnd,&ClientRect))
	{
		AfxMessageBox("得不到窗口的客户区大小!");
		return false;
	}

	CDC WndDC;
	if(!WndDC.Attach(GetDC(hwnd)))
	{
		AfxMessageBox("得不到窗口的设备描述表!");
		return false;
	}

	if(m_Bitmap==NULL)
	{
		AfxMessageBox("bmp位图不在内存中,请先装载!");
		return false;
	}
 	
	CBitmap *bitmap=CBitmap::FromHandle(m_Bitmap);
	if(bitmap==NULL)
	{
		AfxMessageBox("不能创建CBitmap类!");
		return false;
	}
	//创建与目的描述表相兼容的描述表
	CDC MemDC;
	MemDC.CreateCompatibleDC(&WndDC);
	
	CBitmap *OldBitmap;
	OldBitmap=MemDC.SelectObject(bitmap);

	if(OldBitmap==NULL)
	{
		AfxMessageBox("不能将图片选入设备描述表!");
		return false;
	}
	//将内存描述中的图片传到目的描述表中
	if(BitBlt(WndDC.m_hDC,x,y,ClientRect.right,ClientRect.bottom,MemDC.m_hDC,0,0,SRCCOPY)==0)
		return false;
	MemDC.SelectObject(OldBitmap);
	return true;
}
//函数
//作用:在指定的窗口中显示其它类型的图片(jpg.gif)
//hWnd  要显示图片的窗口句柄
//x 图片要显示位置的x座标
//y 图片要显示位置的y座标
//成功返回ture 失败返回false
bool CSetBG::ShowPicInWnd(HWND hwnd,UINT x,UINT y)
{	
	if(hwnd==NULL)
		return false;
	if(m_IPic==NULL)
	{
		AfxMessageBox("图片不在内存中,请先装载!");
		return false;
	}

	CDC WndDC;
	
	if(!WndDC.Attach(GetDC(hwnd)))
	{
		AfxMessageBox("得不到窗口的设备描述表!");
		return false;
	}
	
	//获得图片的高,宽
	long hmWidth; 
	long hmHeight;
	m_IPic->get_Width(&hmWidth); 
	m_IPic->get_Height(&hmHeight); 
	double fX,fY; 
	fX = (double)WndDC.GetDeviceCaps(HORZRES)*(double)hmWidth/((double)WndDC.GetDeviceCaps(HORZSIZE)*100.0); 
	fY = (double)WndDC.GetDeviceCaps(VERTRES)*(double)hmHeight/((double)WndDC.GetDeviceCaps(VERTSIZE)*100.0); 
	if(FAILED(m_IPic->Render(WndDC,x,y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) 
	{	
		AfxMessageBox("渲染图像失败!"); 
		return false;
	}
	return true;	
}
//函数
//作用:从自带的文件中装载BMP类型的图片
//pFilePath		文件的路径
//成功返回ture 失败返回false
bool CSetBG::LoadBmpFile(char *pFilePath)
{
	if(m_Bitmap!=NULL)
	{
		DeleteObject(m_Bitmap);
	}
	//装载bmp图片
	m_Bitmap=(HBITMAP)LoadImage(NULL,pFilePath,IMAGE_BITMAP,0,0,
		LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
	
	if (m_Bitmap==NULL)
	{
		AfxMessageBox("装载BMP文件时出错!");
		return false;
	}
	return true;
}
//函数
//作用:从自带的文件中装载其它类型的图片(gif,jpg)
//pFilePath		文件的路径
//成功返回ture 失败返回false
bool CSetBG::LoadPicFile(char *pFilePath)
{
	IStream *pStream; 
	CFileStatus FileStatus; 
	CFile PicFile; 
	LONG nSize; 
	if (!PicFile.Open(pFilePath,CFile::modeRead))
	{
		AfxMessageBox("文件打开时出错!");
		return false;
	}
	if(!PicFile.GetStatus(pFilePath,FileStatus))  
	{
		AfxMessageBox("查看文件状态时出错!");
		return false;
	}

	if((nSize=FileStatus.m_size) == -1) 
	{
		AfxMessageBox("文件大小疑问!");
		return false;
	}
	
	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,nSize); 
 
	if (hGlobal == NULL) 
	{		
		AfxMessageBox("分配内存时出错!");
		return false;
	}

	LPVOID pVoid = NULL;
	pVoid = GlobalLock(hGlobal);
	if (pVoid == NULL) 
	{ 
		AfxMessageBox("锁定内存时出错!");
		return false;
	}
	PicFile.ReadHuge(pVoid, nSize); 
	GlobalUnlock(hGlobal); 
	PicFile.Close();
	if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStream)!=S_OK)
	{
		AfxMessageBox("创建流时出错!");	
		return false;
	}
 
	if (this->m_IPic!=NULL)
		m_IPic->Release();
	
	if(FAILED(OleLoadPicture(pStream,FileStatus.m_size,TRUE,IID_IPicture,(LPVOID*)&m_IPic))) 
	{ 
		AfxMessageBox("从流中装载图像失败!"); 
		return false;
	} 

	return true;
}
//对外的接口
//作用:从外部的文件中装载图片
//FilePath 是文件的路径
STDMETHODIMP CSetBG::LoadFromFile(BSTR FilePath)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())
	// TODO: Add your implementation code here
	CString s_FilePath(FilePath);
	CFileStatus FileStatus; 
	CFile PicFile; 
	if (!PicFile.Open(s_FilePath,CFile::modeRead))
	{
		AfxMessageBox("文件打开时出错!");
		return S_FALSE;
	}
	//取出文件的后缀名称,判断它的类型,用相应的函数装载
	CString FileType=PicFile.GetFileName().Right(3);
	PicFile.Close();
	FileType.MakeUpper();
	if (FileType=="BMP")
		LoadBmpFile((LPSTR)(LPCTSTR)s_FilePath);
	else
		LoadPicFile((LPSTR)(LPCTSTR)s_FilePath);
	return S_OK;
}
//对外的接口
//作用:释放所有的图片空间

STDMETHODIMP CSetBG::ReleaseAll()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())
	// TODO: Add your implementation code here
	ReleasePic();
	return S_OK;
}
//对外的接口
//作用:在指定的窗口中显示图片
//ClassName  要显示图片的窗口的类型名称
//WndTitle   要显示图片的窗口的标题名称
//x 图片要显示位置的x座标
//y 图片要显示位置的y座标
//PicType 要显示图片类型,有BMP型包括 bmp图片 值取0
//						有其它型包括 jpg,gif等 值取1
STDMETHODIMP CSetBG::ShowPicByTitle(BSTR ClassName, BSTR WndTitle, int x, int y, int PicType)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	if(x<0||y<0)
		return S_FALSE;
	//寻找指定的窗口句柄
	CString s_ClassName(ClassName),s_WndTitle(WndTitle);
	HWND hWnd;

	hWnd=FindWindow((LPSTR)(LPCTSTR)s_ClassName,(LPSTR)(LPCTSTR)s_WndTitle);
	if(hWnd==NULL)
	{
		AfxMessageBox("找不到制定的窗口!");
		return S_FALSE;
	}
	if(PicType==0) 
		if(!ShowBmpInWnd(HWND(hWnd),x,y))
			return S_FALSE;
	if(PicType==1)
		if(!ShowPicInWnd(HWND(hWnd),x,y))
			return S_FALSE;	
	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -