📄 mantischessdraw.cpp
字号:
/***************************************************************
MantisChessDraw.cpp : MantisChess 界面绘制函数
版权所有(C) 共创软件联盟 CChessUG 项目开发小组成员 陈成涛
这一程序是自由软件,你可以遵照自由软件基金会出版的GNU通用公共
许可证条款来修改和重新发布这一程序。或者用许可证的第二版,或者
(根据你的选择)用任何更新的版本。
发布这一程序的目的是希望它有用,但没有任何担保。甚至没有适合特
定目的的隐含的担保。更详细的情况请参阅GNU通用公共许可证。
你应该已经和程序一起收到一份GNU通用公共许可证的副本。
如果还没有,写信给:
The Free Software Foundation,Inc,,675 Mass Ave, Cambridge,
MAO2139,USA
如果你在使用本软件时有什么问题或建议,用以下地址可以与我取得联
系:
http://thecct.51.net
http://cosoft.org.com
或发Email到:
stove@eyou.com
******************************************************************/
#include "StdAfx.h"
#include "math.h"
#include "MantisChessDef.h"
#include "MantisChessDraw.h"
const float PAI=(float)3.1415927;
const int XC[2]={BWA/2,BWA/2-1}; //XC,YC-棋子宽的一半
const int YC[2]={BWA/2,BWA/2-2}; //[0].[1]分别为阴影和明线的偏移量
/******************************************************************
DrawStar: 画兵、卒原始位置的标志(叫什么来着?)
参数:
hdc: 设备描述表的句柄
x,y: 坐标
i: 0/1表示浅色/深色,两种颜色线条形成立体感
返回值: 无
******************************************************************/
void DrawStar(HDC hdc,int x,int y,int i)
{
if(x!=0)
{
MoveToEx(hdc,XC[i]+BWA*x-3,YC[i]+BWA*y-3,NULL);
LineTo(hdc,XC[i]+BWA*x-6,YC[i]+BWA*y-3);
MoveToEx(hdc,XC[i]+BWA*x-3,YC[i]+BWA*y-3,NULL);
LineTo(hdc,XC[i]+BWA*x-3,YC[i]+BWA*y-6);
MoveToEx(hdc,XC[i]+BWA*x-3,YC[i]+BWA*y+3,NULL);
LineTo(hdc,XC[i]+BWA*x-6,YC[i]+BWA*y+3);
MoveToEx(hdc,XC[i]+BWA*x-3,YC[i]+BWA*y+3,NULL);
LineTo(hdc,XC[i]+BWA*x-3,YC[i]+BWA*y+6);
}
if(x!=8)
{
MoveToEx(hdc,XC[i]+BWA*x+3,YC[i]+BWA*y-3,NULL);
LineTo(hdc,XC[i]+BWA*x+6,YC[i]+BWA*y-3);
MoveToEx(hdc,XC[i]+BWA*x+3,YC[i]+BWA*y-3,NULL);
LineTo(hdc,XC[i]+BWA*x+3,YC[i]+BWA*y-6);
MoveToEx(hdc,XC[i]+BWA*x+3,YC[i]+BWA*y+3,NULL);
LineTo(hdc,XC[i]+BWA*x+6,YC[i]+BWA*y+3);
MoveToEx(hdc,XC[i]+BWA*x+3,YC[i]+BWA*y+3,NULL);
LineTo(hdc,XC[i]+BWA*x+3,YC[i]+BWA*y+6);
}
}
/******************************************************************
MakeWood: 绘制木纹
参数:
hdc: 设备描述表的句柄
cx,cy: 宽,高
color: 颜色
x0,y0,z0: 切割平面的原点在三维空间的位置
angle0: 切割角度(弧度)
dark: 深色条纹与浅色条纹的单色差值
返回值: 无
******************************************************************/
void MakeWood(HDC hdc, int cx, int cy, COLORREF color, int x0, int y0, int z0, float angle0,int dark)
{
int i,j;
FLOAT r,angle,u,v,w;
for( j=0;j<cy;j++)
for( i=0;i<cx;i++)
{
w=0;
u=(FLOAT)j*2;
v=(FLOAT)i;
r=(FLOAT)sqrt(v*v+w*w);
if(v==0)
angle=PAI/2;
else
angle=(FLOAT)atan2(v,w);
angle+=angle0;
w=FLOAT(r*cos(angle));
v=FLOAT(r*sin(angle));
u+=x0;
v+=y0;
w+=z0;
SetPixel(hdc,i,j,WoodGrain(u,v,w,color,dark));
}
}
/******************************************************************
WoodGrain: 假设木纹充满整个空间,求某点的颜色
参数:
u,v,w 坐标
color 原始颜色
dark: 深色条纹与浅色条纹的单色差值
返回值: 无
******************************************************************/
COLORREF WoodGrain(FLOAT u, FLOAT v, FLOAT w,COLORREF color,int dark)
{
int r,g,b;
FLOAT radius,angle;
int grain;
radius = (FLOAT)sqrt(u*u+w*w);
if(w==0)
angle = PAI/2;
else
angle =(FLOAT) atan2(u,w);
radius = FLOAT(radius+1.1*sin(20*angle+v/150));
grain =int(radius)%10;
r=GetRValue(color);
g=GetGValue(color);
b=GetBValue(color);
switch(grain)
{
case 0:
r=max(0,r-dark/2);
g=max(0,g-dark/2);
b=max(0,b-dark/2);
color=RGB(r,g,b);
break;
case 1:
case 2:
case 3:
r=max(0,r-dark);
g=max(0,g-dark);
b=max(0,b-dark);
color=RGB(r,g,b);
break;
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
default:
break;
}
return color;
}
/******************************************************************
MakeBoard: 绘制棋盘
参数:
hdc: 设备描述表的句柄
cr: 棋盘的颜色
返回值: 无
******************************************************************/
void MakeBoard(HDC hdc,COLORREF cr)
{
//填充
int nCurTime=(int)::GetTickCount();
MakeWood(hdc,XBW,YBW,cr,-nCurTime%XBW,nCurTime%YBW,nCurTime%1000+500,FLOAT(nCurTime%20/1000.1+0.01),20);
//画棋盘
HPEN pen[2],oldpen;
int r,g,b;
COLORREF cr1,cr2;
r=GetRValue(cr);
g=GetGValue(cr);
b=GetBValue(cr);
cr1=RGB(min(255,r+40),min(255,g+40),min(255,b+40));
cr2=RGB(max(0,r-40),max(0,g-40),max(0,b-40));
pen[0]=CreatePen(PS_SOLID,0,cr1);
pen[1]=CreatePen(PS_SOLID,0,cr2);
oldpen=(HPEN)SelectObject(hdc,pen[0]);
for(int i=0;i<=1;i++)
{
SelectObject(hdc,pen[i]);
//画边框(双线)
MoveToEx(hdc,XC[i]-3,YC[i]-3,NULL);
LineTo(hdc,XC[i]-3,YC[i]+3+BWA*9);
LineTo(hdc,XC[i]+3+BWA*8,YC[i]+3+BWA*9);
LineTo(hdc,XC[i]+3+BWA*8,YC[i]-3);
LineTo(hdc,XC[i]-3,YC[i]-3);
MoveToEx(hdc,XC[i],YC[i],NULL);
LineTo(hdc,XC[i],YC[i]+BWA*9);
LineTo(hdc,XC[i]+BWA*8,YC[i]+BWA*9);
LineTo(hdc,XC[i]+BWA*8,YC[i]);
LineTo(hdc,XC[i],YC[i]);
//画竖线
int n;
for( n=1;n<=8;n++)
{
MoveToEx(hdc,XC[i],YC[i]+BWA*n,NULL);
LineTo(hdc,XC[i]+BWA*8,YC[i]+BWA*n);
}
for( n=1;n<=7;n++)
{
MoveToEx(hdc,XC[i]+BWA*n,YC[i],NULL);
LineTo(hdc,XC[i]+BWA*n,YC[i]+BWA*4);
MoveToEx(hdc,XC[i]+BWA*n,YC[i]+BWA*5,NULL);
LineTo(hdc,XC[i]+BWA*n,YC[i]+BWA*9);
}
//画宫
MoveToEx(hdc,XC[i]+BWA*3,YC[i]+BWA*0,NULL);
LineTo(hdc,XC[i]+BWA*5,YC[i]+BWA*2); //上捺
MoveToEx(hdc,XC[i]+BWA*5,YC[i]+BWA*0,NULL);
LineTo(hdc,XC[i]+BWA*3,YC[i]+BWA*2); //上撇
MoveToEx(hdc,XC[i]+BWA*3,YC[i]+BWA*7,NULL);
LineTo(hdc,XC[i]+BWA*5,YC[i]+BWA*9); //下捺
MoveToEx(hdc,XC[i]+BWA*5,YC[i]+BWA*7,NULL);
LineTo(hdc,XC[i]+BWA*3,YC[i]+BWA*9); //下撇
//画星
DrawStar(hdc,7,2,i);
DrawStar(hdc,1,2,i);
DrawStar(hdc,0,3,i);
DrawStar(hdc,2,3,i);
DrawStar(hdc,4,3,i);
DrawStar(hdc,6,3,i);
DrawStar(hdc,8,3,i);
DrawStar(hdc,7,7,i);
DrawStar(hdc,1,7,i);
DrawStar(hdc,0,6,i);
DrawStar(hdc,2,6,i);
DrawStar(hdc,4,6,i);
DrawStar(hdc,6,6,i);
DrawStar(hdc,8,6,i);
}
SelectObject(hdc,oldpen);
DeleteObject(pen[0]);
DeleteObject(pen[1]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -