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

📄 wndmain.h

📁 caro program is written by VC++ and AI
💻 H
字号:
/****************************************************************************/
//
// ~~~~~~~~~~~~~~~~ Window Main's Functions I  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//							WndMain.h
//
//***************************************************************************/



////////////////////////////////////////////////////////////////////////////
// WndMain Create Message
void Main_Create()
{
	/************************************/
	// Default Variable

	// Get Banner
	ec.hBanner = LoadBitmap (ec.hInst , MAKEINTRESOURCE(IDB_BANNER)) ;
    GetObject (ec.hBanner, sizeof (BITMAP), &ec.bmBanner) ;

	// Default Main Value
	ec.iTab				= ID_PLAY;
	ec.fChooseFile		= 0;
	ec.fDrag			= 0;
	ec.poDrag.x			= -1;
	ec.poDrag.y			= -1;

	// Default Play Value
	play.iPBar			= 1;
	play.iTimePlay		= 0;
	play.fComPlay		= 0;
	play.iUndo			= 0;
	play.iMaxUndo		= 0;
	play.iChecked		= 0;
	play.fKey			= 0;
	play.fWin			= 0;
	play.fWarning		= 0;

	GetCurrentDirectory(MAX_PATH,ec.szAppDir);

	// Default Rule Value

	/*Vietnam Caro*/
	rule[0].iMinPoint	= 4;
	rule[0].iMinBlock	= 5;
	rule[0].iBlock		= 0;

	/*Classic Caro*/
	rule[1].iMinPoint	= 4;
	rule[1].iMinBlock	= 0;
	rule[1].iBlock		= 0;
	
	/*Gomoku*/
	rule[2].iMinPoint	= 0;
	rule[2].iMinBlock	= 5;
	rule[2].iBlock		= 0;

	/*TicTacToe*/
	rule[3].iMinPoint	= 0;
	rule[3].iMinBlock	= 3;
	rule[3].iBlock		= 3;

	rule[MAX_RULE-1].iMinPoint = 4;
	rule[MAX_RULE-1].iMinBlock = 5;

	// Default Skin Value
	skin.crBlock			= RGB(100,100,100);
	skin.crBlockBorder		= RGB(130,130,130);
	skin.crMouse			= RGB(140,140,140);
	skin.crPColor[0]		= RGB(0,170,250);
	skin.crPColor[1]		= RGB(255,125,100);

	/************************************/
	// Load Setting
	LoadSetting();

	/************************************/
	// Set Memory for cMatrix
	pMatrix = (char*) malloc( setting.iBlock * setting.iBlock * sizeof(char));
	if ( pMatrix == NULL )
		MessageBox(NULL,"Init fail. Not enough menory",APPNAME,MB_OK | MB_ICONERROR );
}

////////////////////////////////////////////////////////////////////////////
// WndMain Init Menu Message
void Main_InitMenu()
{
HMENU hMenu;
int i;

	hMenu = GetMenu(WndMain.hWnd);
	/**********************************************************/
	// Menu Settings
	CheckMenuItem(hMenu,IDM_EC_PLAYING + ec.iTab - 1, MF_CHECKED );
	CheckMenuItem(hMenu,IDM_SETTINGS_WARNING, setting.fWarning?MF_CHECKED:MF_UNCHECKED );
	CheckMenuItem(hMenu,IDM_SETTINGS_SOUNDON, setting.fSound?MF_CHECKED:MF_UNCHECKED );
	CheckMenuItem(hMenu,IDM_SETTINGS_TIMELIMIT, setting.fTime?MF_CHECKED:MF_UNCHECKED );
	CheckMenuItem(hMenu,setting.iRule + IDM_SETTINGS_RULE_VIETNAM1,MF_CHECKED);
	CheckMenuItem(hMenu,setting.iLang + IDM_SETTINGS_LANG_EN,MF_CHECKED);

	/**********************************************************/
	// Menu Players

	for(i=0;i<MAX_PLAYER;i++)
		CheckMenuItem(hMenu,IDM_PLAYERS_H1 + (IDM_PLAYERS_H2 - IDM_PLAYERS_H1)*i + player[i].fPlay ,MF_CHECKED);

	EnableMenuItem(hMenu, IDM_PLAYING_NEWGAME, ec.iTab == ID_PLAY ? MF_ENABLED : MF_GRAYED );
	EnableMenuItem(hMenu, IDM_PLAYING_LOADGAME, ec.iTab == ID_PLAY ? MF_ENABLED : MF_GRAYED );
	EnableMenuItem(hMenu, IDM_PLAYING_SAVEGAME, ec.iTab == ID_PLAY ? MF_ENABLED : MF_GRAYED );
	EnableMenuItem(hMenu, IDM_PLAYING_UNDO, ec.iTab == ID_PLAY ? MF_ENABLED : MF_GRAYED );
	EnableMenuItem(hMenu, IDM_PLAYING_REDO, ec.iTab == ID_PLAY ? MF_ENABLED : MF_GRAYED );

	for(i=0;i<10;i++)
	{
		EnableMenuItem(hMenu, IDM_PLAYING_LOADSTATE0 + i, ec.iTab == ID_PLAY ? MF_ENABLED : MF_GRAYED );
		EnableMenuItem(hMenu, IDM_PLAYING_SAVESTATE0 + i, ec.iTab == ID_PLAY ? MF_ENABLED : MF_GRAYED );
	}
}

////////////////////////////////////////////////////////////////////////////
// WndMain Sizing Message
void Main_Sizing(WPARAM wParam, LPARAM lParam)
{
LPRECT lprect;
RECT rect;
char szBuffer[100];

	// Fix window size to min is 610x450
	lprect=(LPRECT)lParam;
	if(wParam==WMSZ_TOP || wParam==WMSZ_TOPLEFT || wParam==WMSZ_TOPRIGHT)
		lprect->top=min(lprect->top,lprect->bottom-450);
	if(wParam==WMSZ_LEFT || wParam==WMSZ_TOPLEFT || wParam==WMSZ_BOTTOMLEFT)
		lprect->left=min(lprect->left,lprect->right-610);

	lprect->bottom=max(lprect->bottom,lprect->top+450);
	lprect->right=max(lprect->right,lprect->left+610);

	GetWindowRect(WndMain.hWnd , &rect);
	wsprintf(szBuffer,"(%d , %d) (%d , %d) : %d x %d",rect.left , rect.top , rect.right , rect.bottom, rect.right - rect.left , rect.bottom - rect.top );
	ShowStatus(szBuffer);
}

////////////////////////////////////////////////////////////////////////////
// WndMain Size Message
void Main_Size()
{
RECT rect;

	// Get Window Main's size
	GetWindowSize(&WndMain);

	// Resize the Matrix Window
	MoveWindow( WndChild.hWnd , XLEFT , YHEADER , WndMain.xClient - XRIGHT - XLEFT , WndMain.yClient - YHEADER - YFOOTER , TRUE );
	MoveWindow( WndBtn[ID_STATUS].hWnd , 10 , WndMain.yClient - 20 , WndMain.xClient - 150 , 20 , TRUE);

	// Don't eraser background of WndMain.
	POINT pBtn;
	int i;
	HDC hDC, hDCMem;

	SetRect(&rect, 0, 0, ec.bmBanner.bmWidth , ec.bmBanner.bmHeight );
	ValidateRect(WndMain.hWnd, &rect);

	hDC = GetDC(WndMain.hWnd);
	hDCMem = CreateCompatibleDC (hDC) ;
	SelectObject (hDCMem, ec.hBanner ) ;
    BitBlt (hDC, 0, 0, ec.bmBanner.bmWidth , ec.bmBanner.bmHeight , hDCMem, 0, 0, SRCCOPY) ;
	DeleteDC(hDCMem);
	ReleaseDC(WndMain.hWnd, hDC );

	for ( i = ID_PLAY ; i < MAX_BUTTON ; i++ )
	{
		GetWindowRect(WndBtn[i].hWnd, &rect);
		rect.right = rect.right - rect.left ;
		rect.bottom = rect.bottom - rect.top ;
		pBtn.x = rect.left ;
		pBtn.y = rect.top ;

		ScreenToClient(WndMain.hWnd, &pBtn);

		rect.left = pBtn.x ;
		rect.top = pBtn.y;

		SetRect(&rect, rect.left , rect.top , rect.left + rect.right , rect.top + rect.bottom );
		ValidateRect(WndMain.hWnd, &rect);
		SetRect(&rect, 0,0, rect.right  , rect.bottom  );
		InvalidateRect(WndBtn[i].hWnd, &rect, FALSE);
	}

	for ( i = 0 ; i < (ec.iTab == ID_PLAY ? CBTN_PLAYING : ec.iTab == ID_SETTING ? CBTN_SETTING : CBTN_CREDIT); i++ )
	{
		GetWindowRect(GetDlgItem(WndMain.hWnd , MAX_BUTTON+i), &rect);
		rect.right = rect.right - rect.left ;
		rect.bottom = rect.bottom - rect.top ;
		pBtn.x = rect.left ;
		pBtn.y = rect.top ;

		ScreenToClient(WndMain.hWnd, &pBtn);

		rect.left = pBtn.x ;
		rect.top = pBtn.y;

		SetRect(&rect, rect.left , rect.top , rect.left + rect.right , rect.top + rect.bottom );
		ValidateRect(WndMain.hWnd, &rect);
		SetRect(&rect, 0,0, rect.right  , rect.bottom  );
		InvalidateRect(GetDlgItem(WndMain.hWnd , MAX_BUTTON+i), &rect, FALSE);
	}
}

////////////////////////////////////////////////////////////////////////////
// WndMain Paint Message
void Main_Paint()
{  
HDC hDC, hDCMem;
PAINTSTRUCT ps;
TCHAR szBuffer[50];

	hDC=BeginPaint(WndMain.hWnd,&ps);
	SetBkMode(hDC,TRANSPARENT); 
	// Fill background for header
	MyRectangle(hDC,0,0,WndMain.xClient ,YHEADER,CR_WNDMAIN,CR_WNDMAIN);
	// Fill background for footer
	MyRectangle(hDC,0,WndMain.yClient-YFOOTER,WndMain.xClient,WndMain.yClient ,CR_WNDMAIN,CR_WNDMAIN);
	// Fill background for leftbar
	MyRectangle(hDC,0,YHEADER,XLEFT,WndMain.yClient -YFOOTER,CR_WNDMAIN,CR_WNDMAIN);
	// Fill background for rightbar
	MyRectangle(hDC,WndMain.xClient-XRIGHT,0,WndMain.xClient,WndMain.yClient -YFOOTER,CR_WNDMAIN,CR_WNDMAIN);

	MyFrame(hDC, XLEFT -1, YHEADER -1, WndMain.xClient - XRIGHT +1, WndMain.yClient - YFOOTER + 1, RGB(230,230,230));

	hDCMem = CreateCompatibleDC (hDC) ;
	SelectObject (hDCMem, ec.hBanner ) ;
    BitBlt (hDC, 0, 0, ec.bmBanner.bmWidth , ec.bmBanner.bmHeight , hDCMem, 0, 0, SRCCOPY) ;
	DeleteDC(hDCMem);

	DrawTimePlay(FALSE);
	// Draw Player Bar
	DrawPlayerBar();
	DrawTimeLimit(FALSE);

	DrawLightBar(FALSE);

	SetTextAlign(hDC, TA_CENTER | TA_CENTER );
	SetTextColor(hDC, RGB(100,100,100) );
	SetBkMode(hDC, TRANSPARENT );
	
	TextOut(hDC, WndMain.xClient - 50 , 60 , player[play.iTurn].szName, strlen(player[play.iTurn].szName));

	/////////////////////////////////////////////////////////////
	// MAIN STATUS
	strcpy(szBuffer,"");
	
	// WARNNING
	if(play.fWarning && setting.fWarning)
	{
		SetTextColor(hDC, RGB(255,125,100));
		strcpy(szBuffer,"! W A R N I N G !");
	}
	// DRAW
	if(play.fWin == 2)
	{
		SetTextColor(hDC, RGB(250,220,190));
		strcpy(szBuffer,"D R A W");
	}
	// WIN
	if(play.fWin == 1)
	{
		SetTextColor(hDC, RGB(100,255,100));
		strcpy(szBuffer,player[play.iWinner].szName );
		strcat(szBuffer," is Victorious");
	}

	TextOut(hDC, XLEFT + (WndMain.xClient - XLEFT )/2 , YHEADER -20, szBuffer, strlen(szBuffer) );
	//////////////////////////////////////////////////////////////

	EndPaint(WndMain.hWnd,&ps);
}

////////////////////////////////////////////////////////////////////////////
// WndMain Draw Item Message
void Main_DrawItem(LPDRAWITEMSTRUCT pdis)
{
RECT rect;
int i;
TCHAR szBuffer[50]="";
HGDIOBJ hFont;

	GetClientRect(pdis->hwndItem,&rect);

	if((char)pdis->CtlID >= MAX_BUTTON)
	{
		MyRectangle(pdis->hDC,rect.left,rect.top,rect.right,rect.bottom,RGB(200,200,200),RGB(150,150,150));
		SetTextColor(pdis->hDC,RGB(90,90,90));

		if(pdis->itemState & ODS_SELECTED)
		{
			MyRectangle(pdis->hDC,rect.left,rect.top,rect.right,rect.bottom,RGB(190,190,190),RGB(130,130,130));
			SetTextColor(pdis->hDC,RGB(200,200,200));
		}
		
	}
	else //elseif((char)pdis->CtlID >= MAX_BUTTON)
	{
		if((char)pdis->CtlID==ec.iTab)
		{
			MyRectangle(pdis->hDC,rect.left,rect.top,rect.right,rect.bottom,RGB(200,200,200),RGB(120,120,120));
			SetTextColor(pdis->hDC,RGB(230,230,230));
		}
		else
		{
			MyRectangle(pdis->hDC,rect.left,rect.top,rect.right,rect.bottom,RGB(120,120,120),RGB(180,180,180));
			SetTextColor(pdis->hDC,RGB(50,50,50));
		}

		if(pdis->itemState & ODS_SELECTED)
		{
			MyRectangle(pdis->hDC,rect.left,rect.top,rect.right,rect.bottom,RGB(170,170,170),RGB(120,120,120));
			SetTextColor(pdis->hDC,RGB(230,230,230));
		}
	} //end elseif((char)pdis->CtlID >= MAX_BUTTON)
		
	SetBkMode(pdis->hDC,TRANSPARENT);
	SetTextAlign(pdis->hDC,TA_CENTER|TA_TOP);

	
	switch((char)pdis->CtlID)
	{
	case ID_PLAY:
		strcpy(szBuffer, setting.iLang == LANG_EN ? "Playing" : "Choi");
		break;

	case ID_SETTING:
		strcpy(szBuffer, setting.iLang == LANG_EN ? "Settings" : "Thiet lap");
		break;

	case ID_CREDIT:
		strcpy(szBuffer, setting.iLang == LANG_EN ? "Credit" : "Tac gia");
		break;
	}


	// More Context Button
	i= (char)pdis->CtlID - MAX_BUTTON;
	if(i>=0)
	{
		hFont = GetStockObject(ANSI_FIXED_FONT);
		SelectObject(pdis->hDC , hFont);
		DeleteObject(hFont);

		/////////////////////////
		// Playing Context
		if(ec.iTab == ID_PLAY)
		{
			if(i==0)
				strcpy(szBuffer, setting.iLang == LANG_EN ? "New Game" : "Van moi");

			if(i==1)
				strcpy(szBuffer, setting.iLang == LANG_EN ? "Load Game" : "Mo van cu");

			if(i==2)
				strcpy(szBuffer, setting.iLang == LANG_EN ? "Save Game" : "Luu van nay");

			if(i==3)
				strcpy(szBuffer, setting.iLang == LANG_EN ? "Undo" : "Quay lai");

			if(i==4)
				strcpy(szBuffer, setting.iLang == LANG_EN ? "Redo" : "Lam lai");
		}

		/////////////////////////
		// Setting Context
		if(ec.iTab == ID_SETTING)
		{
			if(i==0)
				strcpy(szBuffer, setting.iLang == LANG_EN ? "Default Settings" : "Mac dinh");
		}

		/////////////////////////
		// Credit Context
		if(ec.iTab == ID_CREDIT)
		{
			if(i==0)
				strcpy(szBuffer, setting.iLang == LANG_EN ? "Home page" : "Trang chu");
			
			if(i==1)
				strcpy(szBuffer, setting.iLang == LANG_EN ? "About" : "Tac gia");
		}
	}
	
	TextOut(pdis->hDC,(rect.right-rect.left)/2,(rect.bottom-rect.top)/5,szBuffer,strlen(szBuffer));
}

////////////////////////////////////////////////////////////////////////////
// WndMain Command Message
void Main_Command(WPARAM wParam, LPARAM lParam)
{
	/******************************************************************/
	// Menu Message
	if(!lParam)
	{
		Menu_Command(wParam);

	} // endif (!lParam)

	/******************************************************************/
	// Command Message
	else // else if (lParam)
	{
		Button_Command(wParam);
	}

} // End of Main_Command

////////////////////////////////////////////////////////////////////////////
// WndMain Timer Message
void Main_Timer()
{
HDC hDC;
static int iTime;
TCHAR szBuffer[50];
HFONT hFont;

	DrawTimePlay(TRUE);
	play.iPBar = play.iPBar >= 10 ? 1 : play.iPBar + 1;
	DrawPlayerBar();
	DrawTimeLimit( TRUE );

	iTime = iTime == 10 ? 1 : iTime + 1;

	////////////////////////////////////////////
	// Computer Play
	if( iTime % 2 && ec.fChooseFile == FALSE && !play.fWin && ec.iTab == ID_PLAY && play.fComPlay )
	{
		ec.pMouse.x = play.pComPlay.x;
		ec.pMouse.y = play.pComPlay.y;
		ec.pOld.x = ec.pMouse.x;
		ec.pOld.y = ec.pMouse.y;

		play.fComPlay = FALSE;
		ClickBlock( ec.pMouse.x , ec.pMouse.y );
		if(play.fComPlay) InvalidateRect(WndPlay.hWnd, NULL, FALSE);
	}
	
	////////////////////////////////////////////
	// Draw Warning
	if(!play.fWin && setting.fWarning && play.fWarning)
	{
		hDC = GetDC(WndMain.hWnd);
		SetBkMode(hDC, TRANSPARENT);
		SetTextAlign(hDC, TA_CENTER | TA_CENTER );
	
		SetTextColor(hDC, iTime % 5 ? RGB(250,85,60) : CR_WNDMAIN) ;
		TextOut(hDC, XLEFT + (WndMain.xClient - XLEFT )/2 + 1 , YHEADER -20 + 1, "! W A R N I N G !", strlen("! W A R N I N G !") );
		SetTextColor(hDC, iTime % 5 ? RGB(255,125,100) : CR_WNDMAIN) ;
		TextOut(hDC, XLEFT + (WndMain.xClient - XLEFT )/2 , YHEADER -20, "! W A R N I N G !", strlen("! W A R N I N G !") );
		
		ReleaseDC(WndMain.hWnd, hDC);
	}

	////////////////////////////////////////////
	// Draw Status Light
	DrawLightBar(TRUE);

	////////////////////////////////////////////
	// Credit
	if(ec.iTab == ID_CREDIT)
	{
		ec.iCreditPos++;
		MoveWindow(WndCredit.hWnd, ( WndChild.xClient - WndCredit.xClient ) / 2 , WndChild.yClient - ec.iCreditPos * CREDIT_STEP , WndCredit.xClient , WndCredit.yClient, TRUE);

		if ( ec.iCreditPos * CREDIT_STEP > WndCredit.yClient + WndChild.yClient && ec.iCreditPos * CREDIT_STEP <= WndCredit.yClient + WndChild.yClient + 200)
		{
			hDC= GetDC(WndChild.hWnd);

			SetTextColor(hDC, RGB( 255, 190, 130));
			SetTextAlign(hDC, TA_CENTER | TA_CENTER );
			SetBkMode(hDC, TRANSPARENT);

			strcpy(szBuffer,"A N I T S O F T");
			TextOut(hDC, WndChild.xClient / 2, WndChild.yClient/2 -10, szBuffer, strlen(szBuffer) );

			hFont = (HFONT)GetStockObject(ANSI_FIXED_FONT);
			SelectObject(hDC , hFont);
			DeleteObject(hFont);
			strcpy(szBuffer,"2/2007");
			TextOut(hDC, WndChild.xClient / 2, WndChild.yClient/2 +10, szBuffer, strlen(szBuffer) );
			ReleaseDC(WndChild.hWnd, hDC );
		}

		if ( ec.iCreditPos * CREDIT_STEP > WndCredit.yClient + WndChild.yClient + 200)
		{
			InvalidateRect(WndChild.hWnd, NULL, FALSE );
			ec.iCreditPos = 0;
		}
	}
}	

⌨️ 快捷键说明

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