扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
这是程序的界面
这个程序主要是为了练习画笔和画刷的使用.
做这个小程序前先说个数学知识
题目:已知圆心坐标和半径 一个圆上每隔6度取一个点.
解法如下:
圆心坐标是(x,y),半径为R.
double PI=3.1415926
角度为i的点坐标
x1=x+R*cos(i*6.0/180*PI);
y1=y+R*sin(i*6.0/180*PI);
注意 使用cos和sin函数要包含math.h头文件.
相信要是理解了上面那个数学知识 这个程序也就有个基础的模型了
现在我们开始做了 分两个步骤.
步骤一:
画如图片一所示的表盘
下面的是它的主要代码:
CDC *memdc=GetDC();
//*********画圆
CPen pen1(PS_SOLID,5,RGB(0,0,0));
CPen *pOldPen=memdc->SelectObject(&pen1);
memdc->Ellipse(25,25,225,225);
memdc->SelectObject(pOldPen);
//*********画圆
//**********画表的中点
CBrush brush(RGB(0,0,255));
CBrush *pOldbrush=memdc->SelectObject(&brush);
memdc->Ellipse(130,130,120,120);
memdc->SelectObject(pOldbrush);
//*********画表的中点
int x1[60], y1[60], x2[60], y2[60];
int x0=125, y0=125;
int r = 100;
double PI=3.1415926;
int h=3; //画出数字的基数
for(int i=0; i<60; i++)
{
x1[i] =int( x0 + r*cos(i*6.0/180*PI));
y1[i] =int( y0 + r*sin(i*6.0/180*PI));
if (i%5 == 0)
{
x2[i] =int( x0 + (r-10)*cos(i*6.0/180*PI));
y2[i] = int(y0 + (r-10)*sin(i*6.0/180*PI));
//************ 画出数字*****
if(h>12)
h=1;
CString str;
str.Format("%d",h);
memdc.TextOut(x2[i],y2[i],str);
h++;
//************ 画出数字*****
CPen pen2(PS_SOLID,4,RGB(0,255,0));
CPen *pOldPen2=memdc->SelectObject(&pen2);
CPoint p1(x1[i],y1[i]),p2(x2[i],y2[i]);
//*****画刻度
memdc->MoveTo(p1);
memdc->LineTo(p2);
memdc->SelectObject(pOldPen2);
//*****画刻度
}
画时针,分针和秒针.
我分别用三个函数来画.
这是画时针的函数
//****************画时针********
void DrawHour(CDC* pDC)
{
int x0=125, y0=125; //圆点坐标
int r = 100; //圆半径
double PI=3.1415926;
// DrawHour函数是一个类中的成员函数.hour和minute是该类里的数据成员
//hour表示当前时间的小时数值,minute表示分钟的数值
int h=hour*5+45+(int)((double)minute/60*5);
//这里判断时针的确切位置 加上(int)((double)minute/60*5)
int x =int( x0 + r*cos(h*6.0/180*PI));
int y =int( y0 + r*sin(h*6.0/180*PI));
CPen pen2(PS_SOLID,10,RGB(0,255,0));
CPen *pOldPen2=pDC->SelectObject(&pen2);
CPoint p1(x0,y0),p2(x,y);
pDC->MoveTo(p1);
pDC->LineTo(p2);
pDC->SelectObject(pOldPen2);
}
画分针函数和秒针的差不多,我就写出一个.
void DrawMinute(CDC* pDC)
{
int x0=125, y0=125;
int r = 100;
double PI=3.1415926;
// DrawMinute函数是一个类中的成员函数.minute是该类里的数据成员
//minute表示分钟的数值
int h=minute+45;
int x =int( x0 + r*cos(h*6.0/180*PI));
int y =int( y0 + r*sin(h*6.0/180*PI));
CPen pen2(PS_SOLID,8,RGB(255,0,0));
CPen *pOldPen2=pDC->SelectObject(&pen2);
CPoint p1(x0,y0),p2(x,y);
pDC->MoveTo(p1);
pDC->LineTo(p2);
pDC->SelectObject(pOldPen2);
}
文章里的代码是该程序的主要代码.
当然还有设置定时器,防止闪烁等.这些看下代码就知道了
可能表示的方法不太好,但我想我已经把它的思想写出来了.
我做这个程序主要是为了练习画笔和画刷的使用.
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者