MFC框架实现时钟程序改善

xiao_song_shu 2017-05-14 11:46:29
刚学MFC,然后自己写了个时钟程序,发现当窗口不断变小时,时钟就不成形了。
最好实现:随着窗口的变大或变小,时钟形状一直不变,请各位帮忙看下这个程序,哪里需要改进。
贴主要代码:
void CClockView::OnDraw(CDC* pDC)
{
CClockDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//获取客户区,客户区为矩形
RECT Rect;
GetClientRect(&Rect);
//计算圆的中心位置
//right 矩形右下角坐标
//bottom 矩形左下角坐标
int CenterX = Rect.right/2;
int CenterY = Rect.bottom/2;
//取当前时间
//GetCurrentTime 创建一个代表当前时间的CTime对象(静态成员函数)
CTime Time = CTime::GetCurrentTime();
//定义可变长度的字符串
CString str;
int i,x,y;
CSize size;
//定义画笔,参数分别为画线是实线,虚线或点线等,线的像素大小,线的颜色
CPen Pen(PS_SOLID,1,RGB(0,255,255));
//将旧画笔保存起来
//选入设备描述笔(SelectObject())
CPen *OldPen = pDC->SelectObject(&Pen);
//绘制钟面圆
/*if(CenterX<CenterY)
{
int temp;
temp=CenterY;
CenterY=CenterX;
CenterX=temp;
}*/
//想象成在正方形画圆,取左上方的点的坐标和右下方点的坐标
pDC->Ellipse(CenterX-CenterY,0,CenterX+CenterY,CenterY*2);
//定义弧度
double Radians;
//设置字体颜色为红色
pDC->SetTextColor(RGB(30,144,255));
for(i = 1;i <= 12;i++){
//格式化钟点值,类似sprintf
str.Format("%d",i);
//第一个参数为字符串指针,第二个为字符串个数,返回文本的高度和宽度
size = pDC->GetTextExtent(str,str.GetLength());
//计算弧度(弧度A2转换角度A1: A1=A2*180/PI),PI取3.14,最后i=12时,角度为360度。
Radians = (double)i*6.28/12.0;
x = CenterX - (size.cx/2) + (int)((double)(CenterY - 15)*
sin(Radians));
y = CenterY - (size.cy/2) - (int)((double)(CenterY - 15)*
cos(Radians));
//绘制钟点
//str为要绘制的字符串的指针
pDC->TextOut(x,y,str);
}
//计算时钟指针的弧度,原理同上
Radians = (double)Time.GetHour() + (double)Time.GetMinute()/60.0 +
(double)Time.GetSecond()/3600.0;
Radians *= 6.28/12.0;
//创建时钟指针画笔
CPen HourPen(PS_SOLID,2,RGB(100,179,237));
pDC->SelectObject(&HourPen);
//绘制时钟指针
pDC->MoveTo(CenterX,CenterY);
pDC->LineTo(CenterX + (int)((double)(CenterY-95)*sin(Radians)),
CenterY - (int)((double)(CenterY-95)*cos(Radians)));
Radians = (double)Time.GetMinute()+(double)Time.GetSecond()/60.0;
Radians *= 6.28/60.0;
//创建分钟指针画笔
CPen MinutePen(PS_SOLID,2,RGB(70,130,180));
pDC->SelectObject(&MinutePen);
//绘制分钟指针
pDC->MoveTo(CenterX,CenterY);
pDC->LineTo(CenterX + (int)((double)(CenterY-50)*sin(Radians)),
CenterY - (int)((double)(CenterY-50)*cos(Radians)));
Radians = (double)Time.GetSecond();
Radians *= 6.28/60.0;
//创建秒钟指针画笔
CPen SecondPen(PS_SOLID,1,RGB(135,206,250));
pDC->SelectObject(&SecondPen);
//绘制秒钟指针
pDC->MoveTo(CenterX,CenterY);
pDC->LineTo(CenterX + (int)((double)(CenterY-20)*sin(Radians)),
CenterY - (int)((double)(CenterY-20)*cos(Radians)));
pDC->SelectObject(OldPen);
}
//设置定时器
int CClockView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//参数1:非0数字标志的定时器,参数2:毫秒级时间间隔,参数3一般为NULL)
SetTimer(1,1000,NULL);
// TODO: Add your specialized creation code here

return 0;
}
//更新窗口
void CClockView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
//NULL表示更新客户区所在窗体,true表示矩形代表
InvalidateRect(NULL,true);
UpdateWindow();
CView::OnTimer(nIDEvent);
}
...全文
298 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiao_song_shu 2017-05-14
  • 打赏
  • 举报
回复
感谢兄台,可以了。
ooolinux 2017-05-14
  • 打赏
  • 举报
回复
把窗口大小固定且不可最大化。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧