📄 setbg.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 + -