📄 cgrap.cpp
字号:
#include "../GameH.h"
#include <math.h>
//位图函数
//小飞侠 制作
//一部分来自 金点时空
//============================================================
//函数:LoadBitmapS(IDirectDrawSurface7 *pdds, LPCSTR szBitmap,
// RECT FanWei,RECT KaoH)
//功能:将位图文件缩放到页面(GDI)
//参数:窗口句柄,位图文件名,拷贝的范围,拷贝后的位置大小
//============================================================
HRESULT LoadBitmapSG(IDirectDrawSurface7 *pdds, LPCSTR szBitmap,LPRECT FanWei,LPRECT KaoH)
{
HBITMAP hbm;
HRESULT hr;
HDC hdcImage;
HDC hdc;
BITMAP bm;
DDSURFACEDESC2 ddsd;
int x,y,dx,dy,x1,y1,sx,sy; //各种临时变量
if (FanWei!=NULL) {x=FanWei->left;y=FanWei->top; dx=FanWei->right; dy=FanWei->bottom;} //拷贝的范围
else {x=0;y=0; LoadBitmapFileInfo(szBitmap,dx,dy);}
if (KaoH!=NULL){x1=KaoH->left; y1=KaoH->top; sx=KaoH->right; sy=KaoH->bottom;} //拷贝后的位置大小
else {x1=0; y1=0;sx=dx; sy=dy;}
hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, sx,sy, LR_CREATEDIBSECTION); //从资源文件
if (hbm == NULL) hbm = (HBITMAP) LoadImage(NULL, szBitmap, IMAGE_BITMAP, sx,sy,LR_LOADFROMFILE | LR_CREATEDIBSECTION); //从位图文件
if (hbm == NULL)
{
char Temp[MAX_LOADSTRING];
sprintf(Temp,"%s\nError:%s","BMP Image load ERROR!",szBitmap);
_ERROR_OK(Temp); //返回错误
return E_FAIL;
}
if (hbm == NULL || pdds == NULL) return E_FAIL;
hdcImage = CreateCompatibleDC(NULL); //设定一个DC
if (!hdcImage)
{
char Temp[MAX_LOADSTRING];
sprintf(Temp,"%s\nError:%s","BMP Image load ERROR!",szBitmap);
_ERROR_OK(Temp); //返回错误
return E_FAIL;
}
SelectObject(hdcImage, hbm);
GetObject(hbm, sizeof(bm), &bm); //获取文件大小
dx = dx == 0 ? bm.bmWidth : dx; //缺省使用键入的大小, 默认为0
dy = dy == 0 ? bm.bmHeight : dy;
ddsd.dwSize = sizeof(ddsd); //获取一个表面
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
pdds->GetSurfaceDesc(&ddsd);
if ((hr = pdds->GetDC(&hdc)) == DD_OK)
{
StretchBlt(hdc, x1, y1, sx, sy, hdcImage, x, y,
dx, dy, SRCCOPY); //Copy位图
pdds->ReleaseDC(hdc);
}
DeleteDC(hdcImage); //删除DC
if (hr != DD_OK)
{
char Temp[MAX_LOADSTRING];
sprintf(Temp,"%s\nError:%s","BMP Image Show ERROR!",szBitmap);
_ERROR_OK(Temp); //返回错误
return E_FAIL;
}
DeleteObject(hbm);
return hr;
}
//============================================================
//函数:LoadBitmapFileInfo(HWND hwnd, LPCTSTR filename
// , int &dx, int &dy)
//功能:获得位图文件的尺寸大小
//参数:窗口句柄,位图文件名,返回位图宽度,返回位图高度(引用参数)
//============================================================
BOOL LoadBitmapFileInfo(LPCTSTR filename, int &dx, int &dy)
{
FILE *fp;
if( (fp=fopen(filename, "rb"))==NULL ){ return FALSE;}
//读入文件头
BITMAPFILEHEADER bmpFileHeader;
fread(&bmpFileHeader, sizeof(bmpFileHeader), 1, fp);
//检查BM标志
char *ptr=(char*)&bmpFileHeader.bfType;
if(*ptr!='B' || *++ptr!='M'){return FALSE;}
//信息头
BITMAPINFOHEADER bmpInfoHeader;
fread(&bmpInfoHeader, sizeof(bmpInfoHeader), 1, fp);
fclose(fp);
//宽度,高度
dx=bmpInfoHeader.biWidth;
dy=bmpInfoHeader.biHeight;
return TRUE;
}
//***********************
//* Load JPEG *
//* 使用IJL库读取JPG *
//* Intel CopyRight *
//**********************
bool LoadJPEG(bool DZ,LPDIRECTDRAWSURFACE7 Surface,LPCTSTR FileName)
{
IJLERR jerr;
JPEG_CORE_PROPERTIES jcprops;
//Initialize the JPEG object
jerr = ijlInit(&jcprops);
if (jerr != IJL_OK) return false;
jcprops.JPGFile = FileName;
jerr = ijlRead(&jcprops, IJL_JFILE_READPARAMS);
if (jerr != IJL_OK) return false;
//Prepare a 24Bit buffer to receive image data
BYTE *buffer24;
//Determine the required size
long szbuff24 = ((jcprops.JPGWidth *24 + 7) * jcprops.JPGHeight)>>3;
//Resize the buffer and check for null
switch(jcprops.JPGChannels)
{
case 1:
jcprops.JPGColor = IJL_G;
jcprops.DIBChannels = 3;
jcprops.DIBColor = IJL_BGR;
break;
case 3:
jcprops.JPGColor = IJL_YCBCR;
jcprops.DIBChannels = 3;
jcprops.DIBColor = IJL_BGR;
break;
case 4:
jcprops.JPGColor = IJL_YCBCRA_FPX;
jcprops.DIBChannels = 4;
jcprops.DIBColor = IJL_RGBA_FPX;
break;
default:
jcprops.DIBColor = (IJL_COLOR)IJL_OTHER;
jcprops.JPGColor = (IJL_COLOR)IJL_OTHER;
jcprops.DIBChannels = jcprops.JPGChannels;
break;
}
buffer24 = new BYTE [szbuff24];
if (buffer24 == NULL) return false;
jcprops.DIBWidth = jcprops.JPGWidth;
DZ==true?jcprops.DIBHeight = -jcprops.JPGHeight:jcprops.DIBHeight = jcprops.JPGHeight; //Implies a bottom-up DIB.
jcprops.DIBPadBytes = IJL_DIB_PAD_BYTES(jcprops.JPGWidth,jcprops.DIBChannels);
jcprops.DIBBytes = reinterpret_cast<BYTE*>(buffer24);
jerr = ijlRead(&jcprops, IJL_JFILE_READWHOLEIMAGE);
if (jerr != IJL_OK) return false;
WORD *buffer16;
long szbuff16;
//determine the size of our buffer
szbuff16 = ((jcprops.JPGWidth *16 + 7) >>3)* jcprops.JPGHeight;
//resize the buffer and make sure resize works
buffer16 = new WORD [szbuff16];
if (buffer16 == NULL) return false;
//Start at the beginning of the buffer
long j = 0;
//Step through the 24bit buffer
//Retrieve 3 channels at a time and convert their values to 16bit
for (long i = 0; i < szbuff24; i += 3)
{
//Check the pixel format and write the color data
//to the 16bit buffer. After the write, advance the
//16bit buffer by one.
buffer16[j++]=RGB16(buffer24[i],buffer24[i+1],buffer24[i+2]);
}
BeginDraw(Surface);
BYTE *pSrc=(BYTE *)GraphBuffer; //源页面
int srcPitch=GraphPitch <<1;
Qmemcpy(pSrc,buffer16,szbuff16); //拷贝内存
EndDraw(Surface);
_DELETE_ARRAY(buffer16);
_DELETE_ARRAY(buffer24);
//Create the bitmap using the new 16bit buffer
// hbm = CreateBitmap (jcprops.JPGWidth, jcprops.JPGHeight, 1,16, buffer16);
// if(hbm == NULL) return false;
// DDCopyBitmap(*Surface, hbm, 0, 0, 0, 0);
ijlFree(&jcprops);
return true;
}
bool LoadFMhPic(LPDIRECTDRAWSURFACE7 Surface,LPCTSTR FileName)
{
MHPICHEADER mhsjh;
RGBP *rp;
FILE *fp=NULL;
RGBD *Rgbd;
int BitSize;
fopen(FileName,"rb");//以二进制方式打开
char Hd[sizeof(MhPicH)];
fread(&Hd,sizeof(Hd),1,fp);
if (Hd==MhPicH)
{
fread(&mhsjh,sizeof(MHPICHEADER),1,fp);
BitSize=mhsjh.bcWidth*mhsjh.bcHeight;
rp=new RGBP[mhsjh.PaletteL];
fread(&rp,sizeof(RGBP),mhsjh.PaletteL,fp);
Rgbd=new RGBD[BitSize];//分配内存
if (mhsjh.RLES==1)
{
RLED *rd;
rd=new RLED[mhsjh.RLElength];
fread(&rd,sizeof(RLED),mhsjh.RLElength,fp); //全部数据读入
for(int i=0;i<mhsjh.RLElength;i++)
{
int T=0;
for (int d=0;i<rd[i].length;d++)
{
Rgbd[T].rgbRed=rp[rd[i].is_solid].rgbRed;
Rgbd[T].rgbGreen=rp[rd[i].is_solid].rgbGreen;
Rgbd[T].rgbBlue=rp[rd[i].is_solid].rgbBlue;
T++;
}
}
_DELETE_ARRAY(rd);
}
else fread(&Rgbd,sizeof(RGBD),BitSize,fp); //全部数据读入
WORD *buffer16;
buffer16=new WORD[BitSize];
for (int p=0;p<BitSize;p++)
{
buffer16[p]=RGB16(Rgbd[p].rgbRed,Rgbd[p].rgbGreen,Rgbd[p].rgbBlue);
}
BeginDraw(Surface);
BYTE *pSrc=(BYTE *)GraphBuffer; //源页面
int srcPitch=GraphPitch <<1;
Qmemcpy(pSrc,buffer16,BitSize); //拷贝内存
EndDraw(Surface);
_DELETE_ARRAY(rp);
_DELETE_ARRAY(Rgbd);
}
else return false;
fclose(fp);
return true;
}
bool LoadJPEGFInfo(LPCTSTR FileName,int &dx, int &dy)
{
IJLERR jerr;
JPEG_CORE_PROPERTIES jcprops;
//Initialize the JPEG object
jerr = ijlInit(&jcprops);
if (jerr != IJL_OK) return false;
jcprops.JPGFile = FileName;
jerr = ijlRead(&jcprops, IJL_JFILE_READPARAMS);
if (jerr != IJL_OK) return false;
dx=jcprops.JPGWidth;
dy=jcprops.JPGHeight;
return true;
}
BOOL LoadFMhPicInfo(LPCTSTR filename, int &dx, int &dy)
{
MHPICHEADER mhsjh;
FILE *fp=NULL;
fopen(filename,"rb");//以二进制方式打开
char Hd[sizeof(MhPicH)];
fread(&Hd,sizeof(Hd),1,fp);
if (Hd==MhPicH)
{
fread(&mhsjh,sizeof(MHPICHEADER),1,fp);
dx=mhsjh.bcWidth;
dy=mhsjh.bcHeight;
}
else return FALSE;
fclose(fp);
return TRUE;
}
//图片的判断,用来选择函数的
void LoadPic(bool DZ,LPDIRECTDRAWSURFACE7 Surface,LPCSTR FileName)
{
if (stricmp(FileName+(strlen(FileName)-3),"bmp")==0) LoadBitmapSG(Surface,FileName,NULL,NULL);
else if (stricmp(FileName+(strlen(FileName)-3),"jpg")==0) LoadJPEG(DZ,Surface,FileName);
else if (stricmp(FileName+(strlen(FileName)-4),"jpeg")==0) LoadJPEG(DZ,Surface,FileName);
else if (stricmp(FileName+(strlen(FileName)-3),"mhp")==0) LoadFMhPic(Surface,FileName);
//hdm的方法[已经不用]
/*
char* FI=strchr(FileName,'.');
FI++;
if (strcmp(FI,"bmp")==0) LoadBitmapS(Surface,FileName,NULL,NULL);
else if (strcmp(FI,"jpg")==0) LoadJPEG(DZ,Surface,FileName);
else if (strcmp(FI,"jpeg")==0) LoadJPEG(DZ,Surface,FileName);
else if (strcmp(FI,"mhp")==0) LoadFMhPic(Surface,FileName);
*/
}
//图片信息读取的判断,用来选择函数的
bool LoadPicInfo(LPCSTR FileName,int &dx,int &dy)
{
if (stricmp(FileName+(strlen(FileName)-3),"bmp")==0) if (LoadBitmapFileInfo(FileName,dx,dy)==TRUE) return true;
else if (stricmp(FileName+(strlen(FileName)-3),"jpg")==0) if (LoadJPEGFInfo(FileName,dx,dy)==TRUE) return true;
else if (stricmp(FileName+(strlen(FileName)-4),"jpeg")==0) if (LoadJPEGFInfo(FileName,dx,dy)==TRUE) return true;
else if (stricmp(FileName+(strlen(FileName)-3),"mhp")==0) if (LoadFMhPicInfo(FileName,dx,dy)==TRUE) return true;
//hdm的方法[已经不用]
/*
char* FI=strchr(FileName,'.');
FI++;
if (strcmp(FI,"bmp")==0)if (LoadBitmapFileInfo(FileName,dx,dy)==TRUE) return true;
else if (strcmp(FI,"jpg")==0) if (LoadJPEGFInfo(FileName,dx,dy)==TRUE) return true;
else if (strcmp(FI,"jpeg")==0) if (LoadJPEGFInfo(FileName,dx,dy)==TRUE) return true;
else if (strcmp(FI,"mhp")==0) if (LoadFMhPicInfo(FileName,dx,dy)==TRUE) return true;
*/
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -