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

📄 资源打包dlg.cpp

📁 学游戏不错的实例教程
💻 CPP
字号:
// 资源打包Dlg.cpp : implementation file
/*********************************
[学VC编游戏]
编著、程序设计:唐明理 2004.7
E-mail:  cqtml@163.com
**********************************/

#include "stdafx.h"
#include "资源打包.h"
#include "资源打包Dlg.h"
#include <vfw.h>
#pragma comment (lib,"vfw32.lib")

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CString dirna;
int shulian;
CString cc;
HDC     hMDC;
HBITMAP hmap;
HBITMAP Oldmap;
int l0,pop;
BYTE *buf;
BYTE *tmp;
int bufadd[4000];
int bufx  [4000];
int bufy  [4000];
int findfile0(CString DirName,CString ext);//
void LoadBmp(HDC hdc,CString fileName,int pop);//调图片
LPBITMAPINFOHEADER icmode(LPBITMAPINFOHEADER bi1);//压缩位图
//void SaveBmp(CString fileName,LPBITMAPINFOHEADER bi1); //存位图
WORD PaletteSize(LPBYTE lpDIB);// 计算调色板长度
void TransparentBlt2(HDC hdcDest,int nX0,int nY0,int nW0,int nH0,   // 目标
					 HDC hdcSrc,int nX1,int nY1,int nW1,int nH1,     // 
					 UINT crT  // 透明色,COLORREF类型
					 );
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMyDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMyDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
	//{{AFX_MSG_MAP(CMyDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers

BOOL CMyDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CClientDC dc(this);
	hMDC = CreateCompatibleDC(dc.m_hDC);
	hmap= CreateCompatibleBitmap(dc.m_hDC,210,200);
	Oldmap=(HBITMAP)SelectObject(hMDC,hmap);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}
void CMyDlg::OnPaint() 
{	if (IsIconic())
	{	CPaintDC dc(this); // device context for painting
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else	CDialog::OnPaint();
}

HCURSOR CMyDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
void CMyDlg::opendir() //打开目录
{	BROWSEINFO *m_pbi;
	char m_buffer[MAX_PATH];
	m_pbi = NULL;
	m_pbi = new BROWSEINFO();
	::ZeroMemory(m_pbi, sizeof(BROWSEINFO));
	m_pbi->hwndOwner = GetSafeHwnd();
	m_pbi->pszDisplayName = m_buffer;
	m_pbi->lpszTitle = "选择目录";
	m_pbi->pidlRoot=0; 
	m_pbi->ulFlags =BIF_EDITBOX ;// BIF_RETURNONLYFSDIRS;

	ITEMIDLIST *idl = SHBrowseForFolder (m_pbi);
	if (idl)
	{	SHGetPathFromIDList (idl, m_buffer);	// get path string from ITEMIDLIST
		dirna=m_buffer;
		LPMALLOC lpm;
		if (SHGetMalloc (&lpm) == NOERROR)
			lpm->Free(idl);    // free memory returned by SHBrowseForFolder
	    shulian=findfile0(dirna,"*.bmp");
	}
	delete[] m_pbi;
	SetDlgItemText(IDC_EDIT1, dirna);
	CString cc;
	cc.Format("%d",shulian);
	SetDlgItemText(IDC_EDIT2, cc);
}
int findfile0(CString DirName,CString ext)//
{	WIN32_FIND_DATA	FindFileData;
	HANDLE hFindFile;
	SetCurrentDirectory(DirName);//AfxMessageBox(DirName);
	hFindFile=FindFirstFile(ext,&FindFileData);
	CString tFile;
	int p=0;
	if (hFindFile!=INVALID_HANDLE_VALUE)
	{	do	{tFile=FindFileData.cFileName;
			 if ((tFile==".")||(tFile=="..")) continue;
			 if (!(FindFileData.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY))	
				{p++;
				}
			}
		while (FindNextFile(hFindFile,&FindFileData));
	}
	return p;
}
void CMyDlg::OnOK() 
{	opendir(); //打开目录
	SetWindowText(dirna);//在窗口上显字
}
void CMyDlg::OnButton1() //打包
{	CClientDC dc(this);
	CString na;
	na=dirna.Right(2);//取最后一级目录名,将作为包名。
	l0=0;
	buf=(BYTE *)new BYTE[15*1024*1024];
	tmp=(BYTE *)new BYTE[55000];
	bufadd[1]=0;
///////////////////////////////////////////////
	for(int i=0;i<shulian;i++)//兽2799,景96,人799
	{BitBlt(dc.m_hDC,10,10,210,200,dc.m_hDC,220,10,0xcc0020);
//	 bufx[i]=0;
//	 bufy[i]=0;
	 cc.Format("%s/c%05d.bmp",dirna,i);
	 LoadBmp(dc.m_hDC,cc,i);//调图片
	 SetWindowText(cc);
	 Sleep(3);
	}
	pop=i;
/////////////////////////////////////////////
	cc.Format("../%s.gam",na);
	CFile    file;
	if( !file.Open(cc, CFile::modeCreate|CFile::modeWrite, NULL ) ) return;
	 file.Write(buf,l0);
	file.Close();
/////////////////////////////////////////////
	cc.Format("../%s.dar",na);
	if( !file.Open(cc, CFile::modeCreate|CFile::modeWrite, NULL ) )
		{return;}
	cc.Format("%d\r\n",pop);
	file.Write(cc,lstrlen(cc));
	for (int j=0;j<=pop;j++)
	{cc.Format("%d,%d,%d\r\n",bufadd[j],bufx[j],bufy[j]);
	 file.Write(cc,lstrlen(cc));	//
	}
	file.Close();
}
void LoadBmp(HDC hdc,CString fileName,int pop)//调图片
{	//===================================================================
	LPBITMAPINFOHEADER bi1,m_lpBi;
	HANDLE m_Buf= NULL;
	LPVOID lpmem = NULL;
	CFile file;
	if( !file.Open( fileName,CFile::modeRead)) return ;
	BITMAPFILEHEADER fileinfo;
	file.Read(&fileinfo,sizeof(fileinfo));
	if(fileinfo.bfType != (('M'<<8)+'B'))	return ;
	UINT m_Off=fileinfo.bfOffBits; 
	UINT length = file.GetLength() - sizeof(BITMAPFILEHEADER);
	if(m_Buf != NULL) 
	{GlobalFree(m_Buf);	 m_Buf = NULL;	}
	m_Buf = GlobalAlloc(GMEM_MOVEABLE|GMEM_DISCARDABLE,length);
	lpmem = GlobalLock(m_Buf);//图形数据指针lpmem
	if(length != file.ReadHuge(lpmem,length))
	{	GlobalUnlock(m_Buf);
		GlobalFree(m_Buf);
		return;
	}
//--------------------------------------------------------------------------------
	bi1=(BITMAPINFOHEADER *)lpmem;
	bi1->biSize = sizeof(BITMAPINFOHEADER);
	bi1->biSizeImage=bi1->biWidth*bi1->biHeight;
	int cols=PaletteSize((LPBYTE)bi1);
	int len0=bi1->biSize+bi1->biSizeImage+cols;
	if(bi1->biSizeImage<10) return;
////////////////////////////////////////////////////////////////////////////////////
/*	unsigned char aa[42*1024];
	memcpy(aa,(LPBYTE)lpmem+40,len0);
	for(int i0=0;i0<(int)bi1->biSizeImage;i0++)
						if(aa[i0]==0xff) aa[i0]=0;
	memcpy((LPBYTE)lpmem+40,aa,len0);
	bi1=(BITMAPINFOHEADER *)lpmem;*/
////////////////////////////////////////////////////////////////////////////////////
	m_lpBi=icmode(bi1);//压缩位图 
	bi1=(BITMAPINFOHEADER *)m_lpBi;
	bi1->biSize = sizeof(BITMAPINFOHEADER);
	int len1=bi1->biSize+bi1->biSizeImage+cols;
	memcpy(buf+bufadd[pop],bi1,len1);
	l0+=len1;bufadd[pop+1]=l0;
	GlobalUnlock(m_Buf);GlobalFree(m_Buf);
///////////////////////////////////////////////////////
    CString cc;
	cc=fileName.Left(lstrlen(fileName)-3);
	cc+="txt";
	FILE *f;
    f=fopen(cc,"r");
    if(f!=NULL)
	{fscanf(f,"%d,%d",&bufx[pop],&bufy[pop]);//角色的偏移位置
	 fclose(f);
	}
////////////////////////////////////////////////////////////////////////////////////
	memcpy(tmp,buf+bufadd[pop],len1);
	bi1=(BITMAPINFOHEADER *)tmp;
	int w =bi1->biWidth;
	int h =bi1->biHeight;

	StretchDIBits(hMDC,0,0,w,h,0,0,w,h,
				  tmp+256*sizeof(RGBQUAD)+bi1->biSize,
				  (BITMAPINFO* )bi1,DIB_RGB_COLORS,SRCCOPY);
	TransparentBlt2(hdc,10,10,w,h,hMDC,0,0,w,h,RGB (255,255,255));//显示
///////////////////////////////////////////////////////////
	cc.Format("%d:%d-%d  %d",pop,len0,len1,l0);
}
LPBITMAPINFOHEADER icmode(LPBITMAPINFOHEADER bi1)//压缩位图 
{	HIC hIC;
	if(bi1==NULL){AfxMessageBox("无图形数据!");return NULL;}
	int cols=PaletteSize((LPBYTE)bi1);
	LPBITMAPINFOHEADER m_lpBi=bi1;
	if(bi1->biBitCount<=8)//是8位色
	hIC = ICOpen(mmioFOURCC('V', 'I', 'D', 'C'),
				 mmioFOURCC('m', 'r', 'l', 'e'),ICMODE_FASTCOMPRESS);
	else
	hIC = ICOpen(mmioFOURCC('V', 'I', 'D', 'C'),
				 mmioFOURCC('m', 's', 'v', 'c'),ICMODE_FASTCOMPRESS);
	HANDLE hDID = ICImageCompress(hIC,0,(LPBITMAPINFO)bi1,
                   (LPBYTE)bi1 + (WORD)bi1->biSize + cols,NULL,6500,NULL);
	LPBITMAPINFOHEADER lpBI1 = (LPBITMAPINFOHEADER)GlobalLock(hDID);
//	MoveMemory((LPBYTE)lpBI1+(WORD)lpBI1->biSize,(LPBYTE)bi1+(WORD)bi1->biSize,cols);
	memcpy((LPBYTE)m_lpBi,(LPBYTE)lpBI1,lpBI1->biSize+lpBI1->biSizeImage+PaletteSize((LPBYTE)lpBI1));
	ICClose(hIC);
	GlobalUnlock(hDID);GlobalFree(hDID);
	return m_lpBi;
}

/*void SaveBmp(CString fileName,LPBITMAPINFOHEADER bi1) //存位图
{   BITMAPFILEHEADER hdr;
    DWORD dwTmp;
	if(bi1==NULL){AfxMessageBox("无图形数据!");return;}
    HANDLE hf = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE,(DWORD) 0,NULL,
					CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); 
    hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" 
    hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +bi1->biSize + bi1->biClrUsed 
                 * sizeof(RGBQUAD) + bi1->biSizeImage); 
    hdr.bfReserved1 = 0; hdr.bfReserved2 = 0;  
    hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +bi1->biSize
						+bi1->biClrUsed * sizeof (RGBQUAD); 
    WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), 
        (LPDWORD) &dwTmp,  NULL);  
    WriteFile(hf, (LPVOID) bi1, sizeof(BITMAPINFOHEADER)-bi1->biSize
                  + bi1->biClrUsed * sizeof (RGBQUAD),(LPDWORD) &dwTmp, (NULL)); 
    DWORD dwTotal = bi1->biSizeImage;
    WriteFile(hf, (LPSTR) bi1, (int) dwTotal, (LPDWORD) &dwTmp,NULL);
	CloseHandle(hf);
}*/

WORD PaletteSize(LPBYTE lpDIB)// 计算调色板长度
{   WORD wBitCount;  
    DWORD dwClrUsed;
    dwClrUsed = ((LPBITMAPINFOHEADER)lpDIB)->biClrUsed;
    if (dwClrUsed) return (WORD)dwClrUsed*sizeof(RGBQUAD);
    wBitCount = ((LPBITMAPINFOHEADER)lpDIB)->biBitCount;
    switch (wBitCount)
    {   case 1:return 2*sizeof(RGBQUAD);
        case 4:return 16*sizeof(RGBQUAD);
        case 8:return 256*sizeof(RGBQUAD);
        default:return 0;
    }
}
void TransparentBlt2(HDC hdcDest,int nX0,int nY0,int nW0,int nH0,   // 目标
					 HDC hdcSrc,int nX1,int nY1,int nW1,int nH1,     // 
					 UINT crT  // 透明色,COLORREF类型
					 )
{
	HBITMAP hOldImg, hImg = CreateCompatibleBitmap(hdcDest, nW0, nH0);	// 创建兼容位图
	HBITMAP hOldMak, hMak = CreateBitmap(nW0, nH0, 1, 1, NULL);			// 创建单色掩码位图
	HDC		hImageDC = CreateCompatibleDC(hdcDest);
	HDC		hMaskDC = CreateCompatibleDC(hdcDest);
	hOldImg = (HBITMAP)SelectObject(hImageDC, hImg);
	hOldMak = (HBITMAP)SelectObject(hMaskDC, hMak);
	
	// 将源DC中的位图拷贝到临时DC中
	if (nW0 == nW1 && nH0 == nH1)
		BitBlt(hImageDC, 0, 0, nW0, nH0, hdcSrc, nX1, nY1, SRCCOPY);
	else
		StretchBlt(hImageDC,0,0,nW0,nH0,hdcSrc,nX1,nY1,nW1,nH1,SRCCOPY);
	
	// 设置透明色
	SetBkColor(hImageDC, crT);
	// 生成透明区域为白色,其它区域为黑色的掩码位图
	BitBlt(hMaskDC, 0, 0, nW0, nH0, hImageDC, 0, 0, SRCCOPY);
	// 生成透明区域为黑色,其它区域保持不变的位图
	SetBkColor(hImageDC, RGB(0,0,0));
	SetTextColor(hImageDC, RGB(255,255,255));
	BitBlt(hImageDC, 0, 0, nW0, nH0, hMaskDC, 0, 0, SRCAND);
	// 透明部分保持屏幕不变,其它部分变成黑色
	SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
	SetTextColor(hdcDest,RGB(0,0,0));
	BitBlt(hdcDest, nX0, nY0, nW0, nH0, hMaskDC, 0, 0, SRCAND);
	// "或"运算,生成最终效果
	BitBlt(hdcDest, nX0, nY0, nW0, nH0, hImageDC, 0, 0, SRCPAINT);
	
	SelectObject(hImageDC, hOldImg);
	DeleteDC(hImageDC);
	SelectObject(hMaskDC, hOldMak);
	DeleteDC(hMaskDC);
	DeleteObject(hImg);
	DeleteObject(hMak);
}

⌨️ 快捷键说明

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