📄 资源打包dlg.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 + -