www.gusucode.com > VC++三子棋游戏源码(类似五子棋)-源码程序 > VC++三子棋游戏源码(类似五子棋)-源码程序\code\Client\FaceList.cpp

    //Download by http://www.NewXing.com
// FaceList.cpp: implementation of the CFaceList class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SanQi.h"
#include "FaceList.h"
#include "Global.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFaceList::CFaceList()
{

}

CFaceList::~CFaceList()
{
	if(m_ImgList1.GetSafeHandle() && 
		0 != m_ImgList1.GetImageCount())
	{
		m_ImgList1.DeleteImageList();
	}

	if(m_ImgList2.GetSafeHandle() && 
		0 != m_ImgList2.GetImageCount())
	{
		m_ImgList2.DeleteImageList();
	}

	if(m_ImgList3.GetSafeHandle() && 
		0 != m_ImgList3.GetImageCount())
	{
		m_ImgList3.DeleteImageList();
	}
	
	if(m_ImgBkList.GetSafeHandle() && 
		0 != m_ImgBkList.GetImageCount())
	{
		m_ImgBkList.DeleteImageList();
	}
}

BOOL CFaceList::Init()
{
	char CurPath[MAX_PATH];
	memset(CurPath, 0, sizeof(char) * MAX_PATH);
	GetCurrentPath(CurPath);
	COLORREF	clrTransparent	=RGB(0, 128, 128);

	CString strPathName = (CString)CurPath;	
	int nFound = -1;
	if(    ((nFound = strPathName.Find("Debug\\")) != -1)
		|| ((nFound = strPathName.Find("Release\\")) != -1)
	)
	{
		strPathName = strPathName.Left(nFound);		
	}

	strPathName += (CString)"Faces\\";	

	m_ImgList1.Create(LARGEICON_SIZE, LARGEICON_SIZE, ILC_COLORDDB | ILC_MASK , 0, MAX_FACE);
	m_ImgList1.SetBkColor(clrTransparent);

	for(int i=0; i<IMG_COUNT; i++)
	{
		char buffer[20];
		memset(buffer, 0, sizeof(char) * 20);
		wsprintf(buffer, "%d-1.bmp", i + 1);

		CString	file	= strPathName;		
		file			+=(CString)buffer;
		
		HBITMAP	hBmp	=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(), file,
			IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		if(hBmp)
		{
			CBitmap*	pBitmap	=NULL;
			pBitmap	=pBitmap->FromHandle(hBmp);
			if(pBitmap && pBitmap->GetSafeHandle())
			{
				int nret	=m_ImgList1.Add(pBitmap, clrTransparent);
			}
			pBitmap->DeleteObject();
			hBmp	=NULL;
		}
	}

	m_ImgList2.Create(LARGEICON_SIZE, LARGEICON_SIZE, ILC_COLORDDB | ILC_MASK , 0, MAX_FACE);
	m_ImgList2.SetBkColor(clrTransparent);
	
	for(i=0; i<IMG_COUNT; i++)
	{
		char buffer[20];
		memset(buffer, 0, sizeof(char) * 20);
		wsprintf(buffer, "%d-2.bmp", i + 1);
		
		CString	file	= strPathName;		
		file			+=(CString)buffer;
		
		HBITMAP	hBmp	=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(), file,
			IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		if(hBmp)
		{
			CBitmap*	pBitmap	=NULL;
			pBitmap	=pBitmap->FromHandle(hBmp);
			if(pBitmap && pBitmap->GetSafeHandle())
			{
				int nret	=m_ImgList2.Add(pBitmap, clrTransparent);
			}
			pBitmap->DeleteObject();
			hBmp	=NULL;
		}
	}

	m_ImgList3.Create(LARGEICON_SIZE, LARGEICON_SIZE, ILC_COLORDDB | ILC_MASK , 0, MAX_FACE);
	m_ImgList3.SetBkColor(clrTransparent);
	
	for(i=0; i<IMG_COUNT; i++)
	{
		char buffer[20];
		memset(buffer, 0, sizeof(char) * 20);
		wsprintf(buffer, "%d-3.bmp", i + 1);
		
		CString	file	= strPathName;		
		file			+=(CString)buffer;
		
		HBITMAP	hBmp	=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(), file,
			IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		if(hBmp)
		{
			CBitmap*	pBitmap	=NULL;
			pBitmap	=pBitmap->FromHandle(hBmp);
			if(pBitmap && pBitmap->GetSafeHandle())
			{
				int nret	=m_ImgList3.Add(pBitmap, clrTransparent);
			}
			pBitmap->DeleteObject();
			hBmp	=NULL;
		}
	}
	
	//背景图片
	memset(CurPath, 0, sizeof(char) * MAX_PATH);
	GetCurrentPath(CurPath);
	clrTransparent	=RGB(255, 0, 0);
	
	strPathName = (CString)CurPath;	
	nFound = -1;
	if(    ((nFound = strPathName.Find("Debug\\")) != -1)
		|| ((nFound = strPathName.Find("Release\\")) != -1)
	)
	{
			strPathName = strPathName.Left(nFound);
	}

	strPathName += (CString)"Tables\\";
	
	m_ImgBkList.Create(BKICON_SIZE, BKICON_SIZE, ILC_COLORDDB | ILC_MASK , 0, BKIMG_COUNT);
	m_ImgBkList.SetBkColor(clrTransparent);
	for(i=0; i<BKIMG_COUNT; i++)
	{
		char buffer[20];
		memset(buffer, 0, sizeof(char) * 20);
		wsprintf(buffer, "%d.bmp", i + 1);
		
		CString	file	= strPathName;		
		file			+=(CString)buffer;
		
		HBITMAP	hBmp	=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(), file,
			IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		if(hBmp)
		{
			CBitmap*	pBitmap	=NULL;
			pBitmap	=pBitmap->FromHandle(hBmp);
			if(pBitmap && pBitmap->GetSafeHandle())
			{
				int nret	=m_ImgBkList.Add(pBitmap, clrTransparent);
			}
			pBitmap->DeleteObject();
			hBmp	=NULL;
		}
	}

	//16 * 16的图像
	m_ImgList4.Create(SMALLICON_SIZE, SMALLICON_SIZE, ILC_COLORDDB | ILC_MASK , 0, MAX_FACE);
	m_ImgList4.SetBkColor(clrTransparent);
	for(i=0; i<IMG_COUNT; i++)
	{
		HICON	hIcon	=m_ImgList1.ExtractIcon(i);
		SAFE_CHECKPOINTER(hIcon)
		{
			CBitmap*	pBmp	=MakeIcon2Bmp(hIcon, 
				SMALLICON_SIZE, SMALLICON_SIZE,  clrTransparent);
			if(NULL != pBmp && 
				NULL != pBmp->GetSafeHandle())
			{
				m_ImgList4.Add(pBmp, clrTransparent);

				pBmp->DeleteObject();
				delete	pBmp;
				pBmp	=NULL;
			}
			::DestroyIcon(hIcon);
			hIcon	=NULL;
		}
	}

	memset(CurPath, 0, sizeof(char) * MAX_PATH);
	GetCurrentPath(CurPath);
	clrTransparent	=RGB(255, 0, 0);
	
	strPathName = (CString)CurPath;	
	nFound = -1;
	if(    ((nFound = strPathName.Find("Debug\\")) != -1)
		|| ((nFound = strPathName.Find("Release\\")) != -1)
	)
	{
			strPathName = strPathName.Left(nFound);
	}

	strPathName += (CString)"Hand\\";
	
	m_ImgHandList.Create(SMALLICON_SIZE, SMALLICON_SIZE, ILC_COLORDDB | ILC_MASK , 0, BKIMG_COUNT);
	m_ImgHandList.SetBkColor(clrTransparent);
	for(i=0; i<BKIMG_COUNT; i++)
	{
		char buffer[20];
		memset(buffer, 0, sizeof(char) * 20);
		wsprintf(buffer, "%d.bmp", i + 1);
		
		CString	file	= strPathName;		
		file			+=(CString)buffer;
		
		HBITMAP	hBmp	=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(), file,
			IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		if(hBmp)
		{
			CBitmap*	pBitmap	=NULL;
			pBitmap	=pBitmap->FromHandle(hBmp);
			if(pBitmap && pBitmap->GetSafeHandle())
			{
				int nret	=m_ImgHandList.Add(pBitmap, clrTransparent);
			}
			pBitmap->DeleteObject();
			hBmp	=NULL;
		}
	}

	return TRUE;
}

CImageList* CFaceList::GetImageList1()
{
	return &m_ImgList1;
}

CImageList* CFaceList::GetImageList2()
{
	return &m_ImgList2;
}

CImageList* CFaceList::GetImageList3()
{
	return &m_ImgList3;
}

CImageList* CFaceList::GetImageList4()
{
	return &m_ImgList4;
}

CImageList* CFaceList::GetBkImgList()
{
	return &m_ImgBkList;
}

CImageList* CFaceList::GetHandImgList()
{
	return &m_ImgHandList;
}

CBitmap* CFaceList::MakeIcon2Bmp(HICON hIcon, int ncx, int ncy, COLORREF clrBk)
{
	ASSERT(hIcon);
	if(NULL == hIcon)
		return NULL;
	CBitmap *newBitmap = new CBitmap;
	
	int	ncolordepth		=24;
	HWND	hWnd	=::GetDesktopWindow();
	if(::IsWindow(hWnd))
	{
		HDC	hDC	=::GetDC(hWnd);
		if(NULL != hDC)
		{
			ncolordepth	=::GetDeviceCaps(hDC, BITSPIXEL);
		}
		::ReleaseDC(hWnd, hDC);
	}
	
	newBitmap->CreateBitmap(ncx, ncy, 1, ncolordepth, NULL);
	CBrush	m_Brush;
	m_Brush.CreateSolidBrush(clrBk);

	CDC memDC;
	memDC.CreateCompatibleDC(NULL);

	RECT	rect;
	memset(&rect, 0, sizeof(RECT));
	rect.right	=ncx;
	rect.bottom	=ncy;
	memDC.FillRect(&rect, &m_Brush);
	m_Brush.DeleteObject();
	
	CBitmap *oldBitmap = memDC.SelectObject(newBitmap);
	
	::DrawIconEx(memDC.GetSafeHdc(), 0, 0, hIcon, ncx, ncy, 0, 0, DI_NORMAL);
	memDC.SelectObject(oldBitmap);
	return newBitmap;
}