?? mirminimap.cpp
字號:
// MirMiniMap.cpp: implementation of the CMirMiniMap class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MirMiniMap.h"
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMirMiniMap::CMirMiniMap()
{
m_fpWilFile = NULL;
m_ImageData = NULL;
m_dwImageWidth = 0;
m_dwImageHeight = 0;
m_dwMapIndex = 0;
m_xpos = 0;
m_ypos = 0;
}
CMirMiniMap::~CMirMiniMap()
{
}
BOOL CMirMiniMap::InitMiniMap(char *wixfile, char *wilfile)
{
m_fpWilFile = fopen( wilfile, "rb" );
if( m_fpWilFile == NULL )
return FALSE;
m_dwCntMMap = LoadOfs( wixfile, &m_pResOfs );
if( m_dwCntMMap == 0 || m_pResOfs == NULL )
return FALSE;
if( !LoadPal( m_BitmapHeader.pals ))
return FALSE;
return TRUE;
}
DWORD CMirMiniMap::LoadOfs( char * szWixFile, DWORD ** ofsbuf )
{
FILE * fp = NULL;
DWORD dwcnt = 0;
fp = fopen( szWixFile, "rb" );
if( fp == NULL )
return 0;
fseek( fp, 0x2c, SEEK_SET );
fread( &dwcnt, 4, 1, fp );
if( dwcnt == 0 )
{
fclose( fp );
return 0;
}
*ofsbuf = new DWORD[dwcnt];
fread( (void*)(*ofsbuf), dwcnt* 4, 1, fp );
fclose( fp );
return dwcnt;
}
char * CMirMiniMap::LoadBuf( DWORD idx, DWORD & width, DWORD & height )
{
char * pData = NULL;
WORD w,h;
DWORD dwSize;
if( m_fpWilFile == NULL )
return NULL;
fseek( m_fpWilFile, m_pResOfs[idx], SEEK_SET );
fread( &w, 2, 1, m_fpWilFile );
if( w == 0 )
{
return NULL;
}
fread( &h, 2, 1, m_fpWilFile );
if( h == 0 )
{
return NULL;
}
width = w;
height = h;
dwSize = width * height;
pData = new char[dwSize];
if( pData == NULL )
return NULL;
fseek( m_fpWilFile, 4, SEEK_CUR );
fread( (void*)pData, dwSize, 1, m_fpWilFile );
return pData;
}
BOOL CMirMiniMap::LoadPal( char * ppal)
{
if( ppal == NULL )
return FALSE;
fseek( m_fpWilFile, 0x38, SEEK_SET );
if( ftell( m_fpWilFile ) != 0x38 )
return FALSE;
fread( (void*)ppal, 1024, 1, m_fpWilFile);
return TRUE;
}
BOOL CMirMiniMap::SetMMap(DWORD index)
{
// BITMAP bm;
if( m_ImageData != NULL )
delete []m_ImageData;
m_ImageData = LoadBuf( index-1, m_dwImageWidth, m_dwImageHeight );
if( m_ImageData == NULL )
return FALSE;
if( m_dwImageWidth == 0 || m_dwImageHeight == 0 )
return FALSE;
BITMAPFILEHEADER bfheader;
MakeBitmapHeader( &bfheader, &m_BitmapHeader.header , m_dwImageWidth, m_dwImageHeight, 8 );
return TRUE;
}
int CMirMiniMap::MakeBitmapHeader( BITMAPFILEHEADER * pBfHeader, BITMAPINFOHEADER * pBiHeader, int width, int height, int bits )
{
int imagesize = width * height * (bits/ 8 );
int headersize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER );
memset( (void*)pBfHeader, 0, sizeof( BITMAPFILEHEADER ) );
memset( (void*)pBiHeader, 0, sizeof( BITMAPINFOHEADER ) );
if( bits == 8 )
{
headersize += sizeof( DWORD) * 256;
pBiHeader->biClrImportant = 0x100;
pBiHeader->biClrUsed = 0x100;
}
/*
if( (balian % 4) )
{
imagesize = width * height * ( bits/8 );
}
*/
pBfHeader->bfSize = headersize + imagesize;
pBfHeader->bfType = 0x4d42;
pBfHeader->bfOffBits = headersize;
pBiHeader->biWidth = width;
pBiHeader->biHeight = height;
pBiHeader->biBitCount = bits;
pBiHeader->biPlanes = 1;
pBiHeader->biCompression = 0;
pBiHeader->biSize = 40;
pBiHeader->biSizeImage = imagesize;
return 1;
}
void CMirMiniMap::Draw(HDC dc, int x, int y, int w, int h )
{
if( m_ImageData == NULL )
return;
SetDIBitsToDevice( dc, x, y, w, h, (m_xpos + m_xpos/2 ) - (w/2), (m_dwImageHeight - m_ypos - (h/2)), 0, m_dwImageHeight,(void*)m_ImageData, (BITMAPINFO*)&m_BitmapHeader, DIB_RGB_COLORS );
SetPixel( dc, x + w/2,y + h/2, RGB( 255,255,255));
}
void CMirMiniMap::SetCurPos(int x, int y)
{
m_xpos = x;
m_ypos = y;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -