📄 wndmain.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 + -