📄 main.c
字号:
case WM_KEYDOWN:
switch (wParam)
{
case VK_CANCEL:
flag.timeout=true;
break;
case 13:
if (flag.replay) command=1;
break;
case VK_F2:
if (player==opponent || flag.editing || flag.force)
{
lpfnDlgProc = MakeProcInstance ( TypeMoveDlgProc, hInst);
if (DialogBox ( hInst, MAKEINTRESOURCE(NUMDLG), hWnd,
lpfnDlgProc))
{
command=1;
if (flag.bothsides && !flag.editing)
{
flag.bothsides=false;
flag.abort=flag.timeout=true;
}
}
FreeProcInstance ( lpfnDlgProc);
}
else ShowMessage(CP[62]);
break;
default: if (flag.editing && wParam>='0' && wParam<='9')
{
wParam-='0';
if (!wParam)wParam=10;
PostMessage(hBtnWnd,WM_LBUTTONDOWN,0,--wParam*(bmsize+5)+pawn);
}
else return 1;
}
return 0;
#ifdef WIN32
case WM_CTLCOLORSTATIC:
SetTextColor((HDC)wParam,clrText);
SetBkMode((HDC)wParam,TRANSPARENT);
return hBrushBackGround;
#else
case WM_CTLCOLOR:
switch(HIWORD(lParam))
{
case CTLCOLOR_STATIC:
SetTextColor((HDC)wParam,clrText);
SetBkMode((HDC)wParam,TRANSPARENT);
return hBrushBackGround;
}
return 0;
#endif
case WM_LBUTTONDOWN:
if (player==opponent || flag.force)
{
UINT xsq,ysq,width,margin;
SHORT x,y;
HRGN hRgn;
if (flag.replay) {command=1;return 0;}
x=LOWORD(lParam);
y=HIWORD(lParam);
if (y<BACKMARGIN || y>BACKMARGIN+sqdepth*8)return 0;/*is y o the board?*/
width=sqwidthB*8+deltaX*(y-BACKMARGIN)/(sqdepth*8);
margin=((sqwidthF*8-width)>>1)+LEFTMARGIN;
if (x<margin || x>=width+margin) return 0; /*is x on the board?*/
xsq=8*(x-margin)/width;
ysq=7-(y-BACKMARGIN)/sqdepth;
if (!selected && !button)
{
selected=1;
selectX=xsq;
selectY=ysq;
hRgn=CreatePolygonRgn(&squares[xsq][ysq][0],4, ALTERNATE);
hDC=GetDC(hWnd);
InvertRgn(hDC,hRgn);
ReleaseDC(hWnd,hDC);
DeleteObject(hRgn);
}
else
{
if (!button) /*no squares are highlighted if a button is down*/
{
hRgn=CreatePolygonRgn(&squares[selectX][selectY][0],
4, ALTERNATE);
hDC=GetDC(hWnd);
InvertRgn(hDC,hRgn); /*restore square to normal*/
ReleaseDC(hWnd,hDC);
DeleteObject(hRgn);
}
selected=0;
if (xsq==selectX && ysq==selectY && !flag.editing)return 0;
if (flag.reverse)
{
selectX = 7-selectX;
xsq = 7-xsq;
selectY = 7-selectY;
ysq = 7-ysq;
}
move[0]=(char)selectX+'a';
move[2]=(char)xsq+'a';
move[1]='1'+(char)selectY;
move[3]='1'+(char)ysq;
move[4]=0;
if (!flag.editing
&& ((ysq==0 && selectY==1)||(ysq==7 && selectY==6))
&& abs(selectX-xsq)<=1
&& (player==white ? ysq>selectY : ysq<selectY) )
{
SHORT *brdptr,*colptr;
if (flag.searching) {brdptr=&origbrd; colptr=&origcol;}
else {brdptr=&board; colptr=&color;}
if (*(brdptr+selectX+selectY*8)==pawn
&& *(colptr+selectX+selectY*8)==player
&& ( abs(selectX-xsq)==0 ? *(brdptr+xsq+ysq*8)==no_piece
: *(colptr+xsq+ysq*8)==!player ) )
{
lpfnDlgProc = MakeProcInstance(PromoteDlgProc, hInst);
move[4] = CP[1][DialogBox(hInst, MAKEINTRESOURCE(PROMOTE),
hWnd, lpfnDlgProc)]; /*promotion*/
FreeProcInstance(lpfnDlgProc);
move[5]=0;
}
}
if (button) move[0]=0; /*editing - allow delete with right button
while a piece button is down*/
if (!flag.editing)
{
if ((!flag.easy || flag.bothsides) && player==opponent)
flag.timeout = true;
if (flag.bothsides) {flag.abort=true; flag.bothsides = false; }
}
command=1;
}
}
return 0;
case WM_RBUTTONDOWN:
if (flag.replay) {command=1; return 0;}
if (flag.editing)
{
SHORT x,y;
UINT width,margin;
x=LOWORD(lParam);
y=HIWORD(lParam);
if (y<BACKMARGIN || y>BACKMARGIN+sqdepth*8)return 0;
width=sqwidthB*8+deltaX*(y-BACKMARGIN)/(sqdepth*8);
margin=((sqwidthF*8-width)>>1)+LEFTMARGIN;
if (x<margin || x>=width+margin) return 0;
if (flag.reverse)
{
move[0]='h'-8*(x-margin)/width;
move[1]='1'+(y-BACKMARGIN)/sqdepth;
}
else
{
move[0]='a'+8*(x-margin)/width;
move[1]='8'-(y-BACKMARGIN)/sqdepth;
}
move[2]=move[0];
move[3]=move[1];
move[4]=0;
command=1;
}
return 0;
case WM_ERASEBKGND:
{
RECT rect;
UnrealizeObject ( hBrushBackGround);
GetClientRect ( hWnd, &rect);
FillRect ( (HDC)wParam, &rect, hBrushBackGround);
return 1;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_QUIT:
flag.quit=true;
GetWindowRect(hWnd,&wr);
maximized=IsZoomed(hWnd);
if (IsIconic(hWnd)) wr.right = 0;
WinHelp(hWnd,szHelpFile,HELP_QUIT,0L);
case IDM_GET:
case IDM_NEW:
case IDM_LIST:
case IDM_EDIT:
case IDM_REVIEW:
case IDM_REMOVE:
case IDM_UNDO:
case IDM_FORCE:
case IDM_SWITCH:
case IDM_SWITCHDM:
case IDM_WHITE:
case IDM_BLACK:
case IDM_COMPILE:
flag.timeout=flag.abort=true;
flag.bothsides=false;
command=LOWORD(wParam);
break;
case IDM_SAVE:
flag.timeout=true;
flag.bothsides=false;
command=LOWORD(wParam);
break;
case IDM_BOTH:
if (!flag.searching)
{
command=LOWORD(wParam);
break;
}
if (flag.bothsides)
{
flag.bothsides=false;
if (player==opponent) /*computer is making opponents move*/
flag.abort=flag.timeout=true; /*so abort it*/
}
else
if (player==opponent) /*computer is thinking on opponent's time*/
{
flag.timeout=true;
command=LOWORD(wParam);
}
else flag.bothsides=true;
break;
case IDM_WTM:
case IDM_BTM:
if (player==(LOWORD(wParam)==IDM_WTM)? white : black) break;
flag.timeout=flag.abort=true;
flag.bothsides=false;
command=LOWORD(wParam);
break;
case IDM_BEEP:
flag.beep=!flag.beep;
break;
case IDM_COORD:
flag.coords=!flag.coords;
InvalidateRect(hWnd,0,true);
break;
case IDM_POST:
if ( flag.post )
{
SendMessage ( hStats, WM_COMMAND, IDOK, 0 );
flag.post = false;
}
else
{
lpfnDlgProc = MakeProcInstance(StatDlgProc, hInst);
hStats = CreateDialog (hInst, MAKEINTRESOURCE(STATS),
hWnd, lpfnDlgProc);
flag.post = true;
}
break;
case IDM_ANIMATE:
flag.animate=!flag.animate;
if (!flag.animate)
{
UpdateDisplay(0,0,1,0,0);
Znodes<<=4;
}
else Znodes>>=4;
break;
case IDM_HASH:
flag.hash=!flag.hash;
break;
case IDM_BOOK:
flag.usebook=!flag.usebook;
Book = flag.usebook ? BOOKFAIL : 0;
break;
case IDM_HDEPTH:
lpfnDlgProc = MakeProcInstance ( HashDepthDlgProc, hInst);
if (DialogBox ( hInst, MAKEINTRESOURCE(HASHDEPTHDLG), hWnd,
lpfnDlgProc))
{
HashDepth=DlgInt1;
HashMoveLimit=DlgInt2;
}
FreeProcInstance ( lpfnDlgProc);
break;
case IDM_HFILE:
lpfnDlgProc = MakeProcInstance ( CreateHashDlgProc, hInst);
if (DialogBox ( hInst, MAKEINTRESOURCE(CREATEHASH), hWnd,
lpfnDlgProc))
{
if (size < 24)
size = (1 << size);
if (size>0) CreateHashFile(size);
}
FreeProcInstance ( lpfnDlgProc);
break;
case IDM_WIN:
lpfnDlgProc = MakeProcInstance ( ChangeWinDlgProc, hInst);
if (DialogBox ( hInst, MAKEINTRESOURCE(CHANGEWINDOW), hWnd,
lpfnDlgProc))
{
WAwindow=DlgInt1;
WBwindow=DlgInt2;
WXwindow=DlgInt3;
BAwindow=DlgInt4;
BBwindow=DlgInt5;
BXwindow=DlgInt6;
xwndw = (computer == white) ? WXwindow : BXwindow;
}
FreeProcInstance ( lpfnDlgProc);
break;
case IDM_CONTEMP:
lpszTitle=CP[64];
DlgInt1=contempt;
lpfnDlgProc = MakeProcInstance ( GetNumDlgProc, hInst);
if (DialogBoxParam ( hInst, MAKEINTRESOURCE(NUMDLG), hWnd,
lpfnDlgProc,46L)) contempt=DlgInt1;
FreeProcInstance ( lpfnDlgProc);
break;
case IDM_MATERIAL:
flag.material=!flag.material;
break;
case IDM_RCPTR:
flag.rcptr=!flag.rcptr;
break;
case IDM_THREAT:
flag.threat=!flag.threat;
break;
case IDM_PVS:
flag.pvs=!flag.pvs;
break;
case IDM_NEWEVAL:
flag.neweval=!flag.neweval;
break;
case IDM_GAMEIN:
flag.gamein=!flag.gamein;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -