// MfcKatsunari.cpp : アプリケーション用クラスの機能定義を行います。
//

#include "stdafx.h"

#define MAIN_SRC
#include "MfcKatsunari.h"

#include "MainFrm.h"
#include "MfcKatsunariDoc.h"
#include "MfcKatsunariView.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariApp

BEGIN_MESSAGE_MAP(CMfcKatsunariApp, CWinApp)
	//{{AFX_MSG_MAP(CMfcKatsunariApp)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
		// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
		//        この位置に生成されるコードを編集しないでください。
	//}}AFX_MSG_MAP
	// 標準のファイル基本ドキュメント コマンド
	ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
	ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
	// 標準の印刷セットアップ コマンド
	ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariApp クラスの構築

CMfcKatsunariApp::CMfcKatsunariApp()
{
	// TODO: この位置に構築用コードを追加してください。
	// ここに InitInstance 中の重要な初期化処理をすべて記述してください。
}

/////////////////////////////////////////////////////////////////////////////
// 唯一の CMfcKatsunariApp オブジェクト

CMfcKatsunariApp theApp;


/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariApp クラスの初期化
static HINSTANCE hLib;

static int InitComm(void)
{
	hLib = LoadLibrary("cgfcom");
	if(hLib==NULL) {
//		::MessageBox(NULL,"ERROR:not able to use cgfcom.dll","InitComm",MB_OK|MB_ICONEXCLAMATION);
		return -1;
	}
	initcom = (BOOL(*)(int))GetProcAddress(hLib,"initcom");
	if(initcom <= 0) {
		FreeLibrary(hLib);
		return -1;
	}
	closecom = (BOOL(*)(VOID))GetProcAddress(hLib,"closecom");
	if(closecom <= 0) {
		FreeLibrary(hLib);
		return -1;
	}

	sendxy = (BOOL(*)(int, int))GetProcAddress(hLib,"sendxy");
	if(sendxy <= 0) {
		FreeLibrary(hLib);
		return -1;
	}
	
	receivexy = (BOOL(*)(int *, int *))GetProcAddress(hLib,"receivexy");
	if(receivexy <= 0) {
		FreeLibrary(hLib);
		return -1;
	}
	newgame = (BOOL(*)(int))GetProcAddress(hLib,"newgame");
	if(newgame <= 0) {
		FreeLibrary(hLib);
		return -1;
	}
	return 0;
}

BOOL CMfcKatsunariApp::InitInstance()
{
	// 標準的な初期化処理
	// もしこれらの機能を使用せず、実行ファイルのサイズを小さく
	// したければ以下の特定の初期化ルーチンの中から不必要なもの
	// を削除してください。

#ifdef _AFXDLL
//	Enable3dControls();			// 共有 DLL の中で MFC を使用する場合にはここをコールしてください。 
#else
//	Enable3dControlsStatic();	// MFC と静的にリンクしている場合にはここをコールしてください。
#endif

	SetRegistryKey("YasuhiroIke\\KatsunariUI");

	LoadStdProfileSettings();  // 標準の INI ファイルのオプションをローﾄﾞします (MRU を含む)
	// アプリケーション用のドキュメント テンプレートを登録します。ドキュメント テンプレート
	// はドキュメント、フレーム ウィンドウとビューを結合するために機能します。

	CSingleDocTemplate* pDocTemplate;
	pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,
		RUNTIME_CLASS(CMfcKatsunariDoc),
		RUNTIME_CLASS(CMainFrame),       // メイン SDI フレーム ウィンドウ
		RUNTIME_CLASS(CMfcKatsunariView));
	AddDocTemplate(pDocTemplate);

	// 各Iconの読み出し
	hMarkIcon[0]=LoadIcon(IDI_MARK);
	hHoshiIcon[0]=LoadIcon(IDI_HOSHI);
	hMarkIcon[1]=LoadIcon(IDI_MARK_L);
	hHoshiIcon[1]=LoadIcon(IDI_HOSHI_L);
	hBlackStoneIcon[0]=LoadIcon(IDI_BLACKSTONE);
	hWhiteStoneIcon[0]=LoadIcon(IDI_WHITESTONE);
	hBlackStoneIcon[1]=LoadIcon(IDI_BLACKSTONE_L);
	hWhiteStoneIcon[1]=LoadIcon(IDI_WHITESTONE_L);

	hRedSquareIcon[0]=LoadIcon(IDI_REDSQUARE);
	hRedSquareIcon[1]=LoadIcon(IDI_REDSQUARE_L);

	hStoneIcon[SPACE][0]=LoadIcon(IDI_NULLICON);
	hStoneIcon[BLACK][0]=hBlackStoneIcon[0];
	hStoneIcon[WHITE][0]=hWhiteStoneIcon[0];
	hStoneIcon[3][0]=LoadIcon(IDI_BLACKSTAR);
	hStoneIcon[4][0]=LoadIcon(IDI_WHITESTAR);
	hStoneIcon[5][0]=LoadIcon(IDI_BLACKSTONE);
	hStoneIcon[6][0]=LoadIcon(IDI_WHITESTONE);
	hStoneIcon[7][0]=LoadIcon(IDI_BLACK_AREA);
	hStoneIcon[8][0]=LoadIcon(IDI_WHITE_AREA);
	hStoneIcon[9][0]=LoadIcon(IDI_BLACK_DIAMOND);
	hStoneIcon[10][0]=LoadIcon(IDI_WHITE_DIAMOND);
	hStoneIcon[11][0]=LoadIcon(IDI_BLACK_UP);
	hStoneIcon[12][0]=LoadIcon(IDI_WHITE_UP);
	hStoneIcon[13][0]=LoadIcon(IDI_BLACK_DOWN);
	hStoneIcon[14][0]=LoadIcon(IDI_WHITE_DOWN);
	hStoneIcon[15][0]=LoadIcon(IDI_BLACKSTAR);
	hStoneIcon[16][0]=LoadIcon(IDI_WHITESTAR);
	hStoneIcon[17][0]=LoadIcon(IDI_BLACK_CAPTURED);
	hStoneIcon[18][0]=LoadIcon(IDI_WHITE_CAPTURED);
	
	hStoneIcon[SPACE][1]=LoadIcon(IDI_NULLICON);
	hStoneIcon[BLACK][1]=hBlackStoneIcon[1];
	hStoneIcon[WHITE][1]=hWhiteStoneIcon[1];
	hStoneIcon[3][1]=LoadIcon(IDI_BLACKSTAR);
	hStoneIcon[4][1]=LoadIcon(IDI_WHITESTAR);
	hStoneIcon[5][1]=LoadIcon(IDI_BLACKSTONE_L);
	hStoneIcon[6][1]=LoadIcon(IDI_WHITESTONE_L);
	hStoneIcon[7][1]=LoadIcon(IDI_BLACK_AREA_L);
	hStoneIcon[8][1]=LoadIcon(IDI_WHITE_AREA_L);
	hStoneIcon[9][1]=LoadIcon(IDI_BLACK_DIAMOND_L);
	hStoneIcon[10][1]=LoadIcon(IDI_WHITE_DIAMOND_L);
	hStoneIcon[11][1]=LoadIcon(IDI_BLACK_UP);
	hStoneIcon[12][1]=LoadIcon(IDI_WHITE_UP);
	hStoneIcon[13][1]=LoadIcon(IDI_BLACK_DOWN);
	hStoneIcon[14][1]=LoadIcon(IDI_WHITE_DOWN);
	hStoneIcon[15][1]=LoadIcon(IDI_BLACKSTAR);
	hStoneIcon[16][1]=LoadIcon(IDI_WHITESTAR);
	hStoneIcon[17][1]=LoadIcon(IDI_BLACK_CAPTURED_L);
	hStoneIcon[18][1]=LoadIcon(IDI_WHITE_CAPTURED_L);
	hStoneCursor[BLACK][0]=LoadCursor(IDC_BLACK_MOVING);
	hStoneCursor[WHITE][0]=LoadCursor(IDC_WHITE_MOVING);
	hStoneCursor[BLACK][1]=LoadCursor(IDC_BLACK_MOVING_L);
	hStoneCursor[WHITE][1]=LoadCursor(IDC_WHITE_MOVING_L);

	// 通信の初期化
	if (InitComm()) {
		m_bCommUseable=false;
	} else {
		m_bCommUseable=true;
	}

	// 音を読み込む
    HGLOBAL hSound = LoadResource(NULL, FindResource(NULL, MAKEINTRESOURCE(IDR_WAVE_STONE), "WAVE"));
	if (hSound == NULL)
		return FALSE;
	lpSound = LockResource(hSound);

	// DDE、file open など標準のシェル コマンドのコマンドラインを解析します。
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);

	// コマンドラインでディスパッチ コマンドを指定します。
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// アプリケーションのバージョン情報で使われる CAboutDlg ダイアログ

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// ダイアログ データ
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

  	// ClassWizard は仮想関数を生成しオーバーライドします。
	//{{AFX_VIRTUAL(CAboutDlg)
protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV のサポート
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
		// メッセージ ハンドラはありません。
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// メッセージ ハンドラがありません。
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

// ダイアログを実行するためのアプリケーション コマンド
void CMfcKatsunariApp::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}

/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariApp コマンド

BOOL CMfcKatsunariApp::PreTranslateMessage(MSG* pMsg)
{
	return CWinApp::PreTranslateMessage(pMsg);
}

extern "C" void myprintf(char *p,...)
{
	static char Buf[1024];
	va_list ap;

	va_start(ap,p);
	vsprintf_s(Buf,sizeof(Buf),p,ap);
	va_end(ap);

	TRACE(Buf);
}

BOOL CMfcKatsunariApp::OnIdle(LONG lCount) 
{
	// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
	
	return CWinApp::OnIdle(lCount);
}
