[游戏学习28] MFC 时钟
>_<:这是一个时钟小程序
>_<:通过调用获得系统时间然后经过计算得出当前时间,然后再以3个圆环表示时分秒。
>_<:TAO_CLOCK.h
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance ();
}; class CMainWindow : public CFrameWnd
{
protected: int m_nPrevSecond;
int m_nPrevMinute;
int m_nPrevHour; void Draw(CDC* pDC, int nLength, int nDegrees,
COLORREF clrColor);//绘制针
void DrawQ(CDC* pDC, int nLength, COLORREF clrColor);//圈遮盖 public:
CMainWindow (); protected:
afx_msg int OnCreate (LPCREATESTRUCT lpcs); //设置计时器
afx_msg void OnTimer (UINT nTimerID); //当WM_TIMER消息到达后就得到当前时间....
afx_msg void OnPaint ();
afx_msg void OnClose (); //清楚计时器 DECLARE_MESSAGE_MAP ()
};
>_<:TAO_CLOCK.cpp
#include <afxwin.h>
#include <math.h>
#include "TAO_CLOCK.h" #define SQUARESIZE 20
#define ID_TIMER_CLOCK 1
#define kuan 60
#define miaoL 200
#define fenL miaoL-kuan
#define shiL fenL-kuan CMyApp myApp; /////////////////////////////////////////////////////////////////////////
// CMyApp member functions BOOL CMyApp::InitInstance ()
{
SetRegistryKey (_T ("Programming Windows with MFC"));
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
} /////////////////////////////////////////////////////////////////////////
// CMainWindow message map and member functions BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
ON_WM_CREATE ()
ON_WM_PAINT ()
ON_WM_TIMER ()
ON_WM_CLOSE ()
END_MESSAGE_MAP () CMainWindow::CMainWindow ()
{ //得到系统时间,然后初始化时分秒
CTime time = CTime::GetCurrentTime ();
m_nPrevSecond = time.GetSecond ();
m_nPrevMinute = time.GetMinute ();
m_nPrevHour = time.GetHour () % ; CString strWndClass = AfxRegisterWndClass (
CS_HREDRAW | CS_VREDRAW,
myApp.LoadStandardCursor (IDC_ARROW),
(HBRUSH) (COLOR_3DFACE + ),
NULL
); Create (strWndClass, _T ("Life_leving"));
} int CMainWindow::OnCreate (LPCREATESTRUCT lpcs)
{
if (CFrameWnd::OnCreate (lpcs) == -)
return -; //
// Set a timer to fire at 1-second intervals.
//
if (!SetTimer (ID_TIMER_CLOCK, , NULL)) {
MessageBox (_T ("SetTimer failed"), _T ("Error"),
MB_ICONSTOP | MB_OK);
return -;
} return ;
} void CMainWindow::OnClose ()
{
KillTimer (ID_TIMER_CLOCK);
CFrameWnd::OnClose ();
} //当WM_TIMER消息到达后,它就得到当前时间,
//他将时分秒分别与成员变量记录的时分秒比较
//如果相同不会执行任何操作,否则将记录新时间
//并移动Clock的指针
void CMainWindow::OnTimer (UINT nTimerID)
{
/*判断窗口当前是否最小化,最小化返回非0
可以减小CPU负担isZoomed()判断最大化
但是在任务栏鼠标靠近时不显示时钟走动效果
if (IsIconic ())
return;
*/ //获取当前时间并与记录时间比较,一样不做任何处理
CTime time = CTime::GetCurrentTime ();
int nSecond = time.GetSecond ();
int nMinute = time.GetMinute ();
int nHour = time.GetHour () % ; if ((nSecond == m_nPrevSecond) &&
(nMinute == m_nPrevMinute) &&
(nHour == m_nPrevHour))
return; //最小化时显示数字时钟
if(IsIconic()){
CString time;
time.Format(_T("%0.2d: %0.2d: %0.2d"),nHour,nMinute,nSecond);
SetWindowText(time);
return;
}
SetWindowText(_T("Life_leving")); //MM_ISOTROPIC:X轴和Y轴具有相同的逻辑单位(映射)
//设置每个方向上设置具有1000个单位
//把原点移至中心
CRect rect;
GetClientRect (&rect); CClientDC dc (this);
dc.SetMapMode (MM_ISOTROPIC);
dc.SetWindowExt (, );
dc.SetViewportExt (rect.Width (), -rect.Height ());
dc.SetViewportOrg (rect.Width () / , rect.Height () / ); //
// If minutes have changed, erase the hour and minute hands.
//
COLORREF clrColor = ::GetSysColor (COLOR_3DFACE); if (nMinute != m_nPrevMinute) {
m_nPrevMinute = nMinute;//更新时分
m_nPrevHour = nHour;
} //
// If seconds have changed, erase the second hand and redraw all hands.
//
if (nSecond != m_nPrevSecond) {
CRect rect(-,,,-);
CBrush brush(clrColor);
CBrush* pOldBrush=dc.SelectObject(&brush);
dc.Rectangle(rect);
dc.SelectObject(pOldBrush);
Draw(&dc,miaoL, nSecond * , RGB (, , ));//每秒走6度
Draw(&dc,shiL, (nHour * ) + (nMinute / ),//每小时30度+每分钟0.5度
RGB (, , ));
Draw(&dc, fenL, nMinute * , RGB (, , ));//每分钟6度
m_nPrevSecond = nSecond;//更新秒
} //if(nSecond==0)DrawQ(&dc,miaoL,clrColor);
//if(nMinute==0)DrawQ(&dc,fenL,clrColor);
//if(nHour==0)DrawQ(&dc,shiL,clrColor); } void CMainWindow::OnPaint ()
{
//重绘的时候也要重新设定窗口映射
CRect rect;
GetClientRect (&rect); CPaintDC dc (this);
dc.SetMapMode (MM_ISOTROPIC);
dc.SetWindowExt (, );
dc.SetViewportExt (rect.Width (), -rect.Height ());
dc.SetViewportOrg (rect.Width () / , rect.Height () / ); //画上钟面+时分秒针
Draw(&dc,shiL, (m_nPrevHour * ) +
(m_nPrevMinute / ), RGB (, , ));
Draw(&dc,fenL, m_nPrevMinute * , RGB (, , ));
Draw(&dc,miaoL, m_nPrevSecond * , RGB (, , )); COLORREF clrColor = ::GetSysColor (COLOR_3DFACE); } //画秒针
void CMainWindow::Draw (CDC* pDC, int nLength ,
int nDegrees, COLORREF clrColor)
{
CPoint point[];
CRect rect(-(nLength+kuan),(nLength+kuan),(nLength+kuan),-(nLength+kuan)); double nRadians = (double) nDegrees * 0.017453292;//转化为弧度制 point[].x = ;
point[].y = ;
point[].x = (int) ((nLength+) * sin (nRadians));//注意转换(坐标系变换)
point[].y = (int) ((nLength+) * cos (nRadians)); CPen pen (PS_SOLID,kuan, clrColor);
CPen* pOldPen = pDC->SelectObject (&pen); pDC->Arc(rect,point[],point[]); pDC->SelectObject (pOldPen);
} //画圈
void CMainWindow::DrawQ (CDC* pDC, int nLength, COLORREF clrColor){ CRect rect(-(nLength+kuan),(nLength+kuan),(nLength+kuan),-(nLength+kuan));
CPen pen (PS_SOLID,kuan, clrColor);
CBrush brush(clrColor);
CPen* pOldPen = pDC->SelectObject (&pen);
CBrush* pOldBrush = pDC->SelectObject (&brush);
pDC->Ellipse(rect);
Draw(pDC,shiL, (m_nPrevHour * ) + (m_nPrevMinute / ),//每小时30度+每分钟0.5度
RGB (, , ));
Draw(pDC, fenL, m_nPrevMinute * , RGB (, , ));//每分钟6度
pDC->SelectObject (pOldPen);
pDC->SelectObject (pOldBrush);
}
[游戏学习28] MFC 时钟的更多相关文章
- [游戏学习22] MFC 井字棋 双人对战
>_<:太多啦,感觉用英语说的太慢啦,没想到一年做的东西竟然这么多.....接下来要加速啦! >_<:注意这里必须用MFC和前面的Win32不一样啦! >_<:这也 ...
- [游戏学习26] MFC 时间函数 画图形
>_<:这里第一次介绍MFC的时间函数,功能和Win32里的计时器类似. >_<:这里还介绍了MFC的图形绘制函数,和Win32有一点区别 >_<:ABC.h #d ...
- [游戏学习23] MFC 画尺子
>_<:这是个简单的MFC程序,有利于了解MFC的框架结构 >_<:Ruler.h #include<afxwin.h> class CMyApp:public C ...
- [游戏学习24] MFC 各种绘图 字体学习
>_<:这里包含字体设置及各种绘图,只要稍微看一下代码就能理解,这里不多介绍 >_<:Hello.h #include<afxwin.h> class CMyApp ...
- [游戏学习27] MFC 匀速运动
>_<:理解上一个时间函数的概念和用法,本节的实现也比较简单 >_<:就是简单的绘图+时间函数 >_<:TicTac.h #define EX 1 //该点左鼠标 ...
- [游戏学习25] MFC 橡皮筋画线效果
>_<:这是给出窗口内外不同情况的处理展示的例子. >_<:MouseCap.h #include<afxwin.h> class CMyApp :public C ...
- 我的游戏学习日志3——三国志GBA
我的游戏学习日志3——三国志GBA 三国志GBA由日本光荣公司1991~1995所推出<三国志>系列游戏,该作是光荣在GBA上推出的<三国志>系列作品的第一款.本游戏登场武将总 ...
- 催希凡javaweb 学习28天
看到这样的博客,自己也在看传智播客的视频,收藏一下 催希凡javaweb 学习28天 http://www.cnblogs.com/Prozhu/category/824899.html
- Libgdx游戏学习(1)——环境配置及demo运行
原文: Libgdx游戏学习(1)--环境配置及demo运行 - Stars-One的杂货小窝 Libgdx游戏是基于Java的一款游戏引擎,可以发布Android,桌面端,Html,IOS等游戏,出 ...
随机推荐
- MySql生日闰月处理
1. 科普下润年: ①.非整百年能被4整除的为闰年.(如2004年就是闰年,2100年不是闰年) ②.整百年能被400整除的是闰年.(如2000年是闰年,1900年不是闰年) 2. 例: 例如:当 ...
- WCF第二天
消息 : 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头. 服务 : 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作. 终结点 ...
- js中的单体对象
- C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)控制 WebBrowser 控件的外观和行为
在 CSDN 上经常看到以下两个问题:1.在 MFC 应用程序中,如果创建了一个 WebBrowser 控件(包括 CHtmlView 在内),如何可以把该控件的三维边框禁止掉?2.在 MFC 应用程 ...
- struts标签,<s:textfield>嵌套<s:property>的问题
错误:org.apache.jasper.JasperException: /front/orderList.jsp(110,122) equal symbol expected <s:te ...
- 联想扬天 电脑 键盘改默认fn功能键
联想扬天电脑改键工具 windows 8 windows8.1 64位版本:http://support1.lenovo.com.cn/lenovo/wsi/Modules/DriverDetail. ...
- UIButton的常用属性
可以通过代码的方式创建UIButton 通用实例化对象方法: UIButton *button = [[UIButton alloc] initWithFrame:rect]; 快速实例化对象方法: ...
- IOS开发涉及有点概念&相关知识点
前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...
- memcache与memcached介绍及安装配置
也许大家一看到Memcache和Memcached会有点晕,这两者有什么关系又有什么区别呢,下面先给大家说下Memcached,Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应 ...
- 未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=n
这个可能是因为,缺少文件ICSharpCode.SharpZipLib.dll文件. 我从网上下载了个dll文件,放到根目录中自己好了.