在vs2019中创建新项目,选择Windows桌面应用程序模板(C++)

要求设计一个程序完成对时钟的模拟,时针、分针、秒针,秒针走完一圈后分针走一格,从0点0分0秒开始计时

#include <windows.h>
#include <tchar.h>
#include <math.h>
typedef struct Time
{int hour;int min;int sec;
}TimeStructure;BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);void AdjustTime(TimeStructure* x);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{MSG msg;if (!InitWindowClass(hInstance, nCmdShow)){MessageBox(NULL, L"创建窗口失败!", _T("创建窗口"), NULL);return 1;}while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hDC;PAINTSTRUCT ps;HBRUSH hBrush;HPEN hPen;RECT clientRect;static TimeStructure x;double sita = 0;int xOrg, yOrg, rSec, rMin, rHour, rClock, xBegin, xEnd, yBegin, yEnd;switch (message){case WM_CREATE://创建窗口时,响应的消息SetTimer(hWnd, 9999, 1000, NULL);//设置定时器break;case WM_PAINT:x.sec++;AdjustTime(&x);hDC = BeginPaint(hWnd, &ps);GetClientRect(hWnd, &clientRect); // 获取用户区的尺寸hPen = (HPEN)GetStockObject(BLACK_PEN);//设置画笔为系统预定定义的黑色画笔hBrush = CreateSolidBrush(RGB(255, 220, 220));//创建粉红色的单色画刷SelectObject(hDC, hPen);//选择画笔SelectObject(hDC, hBrush);//选择画刷xOrg = (clientRect.left + clientRect.right) / 2;yOrg = (clientRect.top + clientRect.bottom) / 2;//计算屏幕中心的坐标,它也是钟表的中心rClock = min(xOrg, yOrg) - 50;//钟表的半径rSec = rClock * 6 / 7;//秒针的半径rMin = rClock * 5 / 6;//分针的半径rHour = rClock * 2 / 3;//时针的半径Ellipse(hDC, xOrg - rClock, yOrg - rClock, xOrg + rClock, yOrg + rClock);//绘制表面圆for (int i = 0; i < 60; i++)//绘制表面的刻度{if (i % 5)// 绘制表面表面的整点刻度{hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));SelectObject(hDC, hPen);xBegin = (int)(xOrg + rClock * sin(2 * 3.1415926 * i / 60));yBegin = (int)(yOrg + rClock * cos(2 * 3.1415926 * i / 60));MoveToEx(hDC, xBegin, yBegin, NULL);xEnd = (int)(xOrg + (rClock - 20) * sin(2 * 3.1415926 * i / 60));yEnd = (int)(yOrg + (rClock - 20) * cos(2 * 3.1415926 * i / 60));}else {//绘制表面表面的非整点刻度hPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));SelectObject(hDC, hPen);xBegin = (int)(xOrg + rClock * sin(2 * 3.1415926 * i / 60));yBegin = (int)(yOrg + rClock * cos(2 * 3.1415926 * i / 60));MoveToEx(hDC, xBegin, yBegin, NULL);xEnd = (int)(xOrg + (rClock - 25) * sin(2 * 3.1415926 * i / 60));yEnd = (int)(yOrg + (rClock - 25) * cos(2 * 3.1415926 * i / 60));}LineTo(hDC, xEnd, yEnd);DeleteObject(hPen);}hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));SelectObject(hDC, hPen);sita = 2 * 3.1415926 * x.sec / 60;//下面求秒针的起点坐标,它的位置在秒针的最末端xBegin = xOrg + (int)(rSec * sin(sita));yBegin = yOrg - (int)(rSec * cos(sita));//下面求秒针的终点坐标,它的位置在秒针的反方向的长度为秒针的/8xEnd = xOrg + (int)(rClock * sin(sita + 3.1415926) / 8);yEnd = yOrg - (int)(rClock * cos(sita + 3.1415926) / 8);MoveToEx(hDC, xBegin, yBegin, NULL);LineTo(hDC, xEnd, yEnd);//绘制秒针hPen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));SelectObject(hDC, hPen);sita = 2 * 3.1415926 * x.min / 60;xBegin = xOrg + (int)(rMin * sin(sita));yBegin = yOrg - (int)(rMin * cos(sita));//分针的起点xEnd = xOrg + (int)(rClock * sin(sita + 3.1415926) / 8);yEnd = yOrg - (int)(rClock * cos(sita + 3.1415926) / 8);// 分针的终点MoveToEx(hDC, xBegin, yBegin, NULL);LineTo(hDC, xEnd, yEnd);//绘制分针hPen = CreatePen(PS_SOLID, 10, RGB(0, 0, 0));SelectObject(hDC, hPen);sita = 2 * 3.1415926 * x.hour / 12;xBegin = xOrg + (int)(rHour * sin(sita));yBegin = yOrg - (int)(rHour * cos(sita));xEnd = xOrg + (int)(rClock * sin(sita + 3.1415926) / 8);yEnd = yOrg - (int)(rClock * cos(sita + 3.1415926) / 8);MoveToEx(hDC, xBegin, yBegin, NULL);LineTo(hDC, xEnd, yEnd);//绘制时针DeleteObject(hPen);DeleteObject(hBrush);EndPaint(hWnd, &ps);//结束绘图break;case WM_TIMER://响应定时器发出的定时消息if (wParam == 9999)//判断是否是设置的定时器发出的消息InvalidateRect(hWnd, NULL, true); //刷新屏幕break;case WM_SIZE://窗口尺寸改变时,刷新窗口InvalidateRect(hWnd, NULL, true);break;case WM_DESTROY:PostQuitMessage(0); // 调用PostQuitMessage发出WM_ QUIT 消息break;default:return DefWindowProc(hWnd, message, wParam, lParam);break;}return 0;
}void AdjustTime(TimeStructure* x)
{if (x->sec == 60){x->sec = 0;x->min++;if (x->min == 60){x->min = 0;x->hour++;if (x->hour == 12)x->hour = 0;}}
}BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow)
{WNDCLASSEX wcex;HWND hWnd;TCHAR szWindowClass[] = L"窗口示例";TCHAR szTit1e[] = L"模拟时钟";wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = 0;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wcex.lpszMenuName = NULL;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));if (!RegisterClassEx(&wcex))return FALSE;hWnd = CreateWindow(szWindowClass,szTit1e,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL,NULL,hInstance,NULL);if (!hWnd)return FALSE;ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}

【Windows程序设计】模拟时钟相关推荐

  1. Windows下编程--模拟时钟的实现

    windows下编程--模拟时钟的实现: 主要可以分为几个步骤: (1)   编写按键事件处理(启动和停止时钟) (2)   编写时钟事件处理,调用显示时钟函数 (3)   编写显示时钟函数,要调用显 ...

  2. MFC Windows 程序设计[九十四]之精美的时钟(附源码)

    MFC Windows 程序设计[九十四]之精美的时钟 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 MFC是微软公司提供的一个类库(class libraries),以 ...

  3. c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序

    C语言课程设计报告模拟时钟转动程序 课程设计报告题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 导 教 师 ...

  4. java模拟时钟课程设计_java课程设计-时钟图形模拟

    java课程设计-时钟图形模拟 计算机与信息工程系 <高级语言程序设计>课程设计报告课 程 设 计 任 务 书专 业 通信工程 班 级 13 级四班 姓 名 张凯铭设 计 起 止 日 期设 ...

  5. c语言编程模拟机械钟表行走,C语言课程设计报告-模拟时钟转动程序

    1. 课程设计报告题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 导 教 师 金陵科技学院教务处制 程序设 ...

  6. java 模拟时钟_java模拟时钟

    本次课程设计采用时间片轮转调度算法来实现模拟进程调度任务的执行过 程. 用 Java 模拟进程调度过程,可以方便地将运行结果直观地表示出来.Java 语言 独有的多...... 本次课程设计采用时间片 ...

  7. c语言画图 钟表模拟程序,图形模拟时钟C语言课程设计

    图形模拟时钟C语言课程设计 更新时间:2017/2/2 9:03:00  浏览量:640  手机版 学号13082101182014-2015学年第二学期 <高级语言程序设计> 课程设计报 ...

  8. [渝粤教育] 中国地质大学 Windows程序设计 复习题 (2)

    <Windows程序设计>模拟题 一单选题 1.所有的Windows应用程序都是由()驱动的. A.事件 B.消息 C.命令 D.菜单 2.一般应用程序不会派生自己的()类. A.主框架 ...

  9. c语言程序设计移动字母,C语言程序设计模拟试题二(含答案)

    C语言程序设计模拟试题二(含答案) 1.下列电子邮件地址中正确的是(其中□表示空格) A) Malin&http://www.doczj.com/doc/2969157fa26925c52cc ...

最新文章

  1. 企业级Nginx服务基础到架构优化详解--25条
  2. CodeCraft-20 (Div. 2) D. Nash Matrix 构造 + dfs
  3. Django 【认证系统】auth
  4. 软件测试 学习之路 MYSQL安装
  5. 点阵字体显示系列之三:使用ncurses显示汉字
  6. PCB SQL SERVER 枚举分割函数(枚举值分解函数)
  7. 五个Metro UI 风格的网页设计
  8. find命令日常用法和文件名后缀
  9. mysql修改表分界符号_mysql---触发器
  10. 关于能力模型的思考总结
  11. git中如何获取远程仓库的最新代码?
  12. 将一串整数转化为一串字符
  13. 王的机器第一本书「快乐机器学习」飨你
  14. 磁盘最优存储问题---Python
  15. java不完全教程附编码示例
  16. spark配置elasticsearch属性汇总(基于es7)
  17. Putty登陆root输入密码被拒绝(没开启ssh)
  18. 高效理解pytorch的backward需要scalar outputs
  19. 山东大学软件质量保证与测试技术复习纲要
  20. 科研诚信与学术规范_Mooc_2018_期末考试答案

热门文章

  1. 设置QTableView的内容自动换行(2)
  2. C语言:用and、or、not表示逻辑运算符
  3. NVDLA学习笔记(2)
  4. 传奇服务器包裹元宝数量显示,GOM引擎怎么设置包裹上显示元宝信息 传奇背包元宝信息坐标调整方法...
  5. 物联网专题22:STA模式
  6. mybatis由浅入深day02_4多对多查询_多对多查询总结
  7. python彼岸图网爬取1200像素预览图
  8. 英语语法最终珍藏版笔记-9非谓语动词
  9. 网易云网络部署参考方案-网易云网络服务研发实践|网易云
  10. 用KNN分类器进行猫狗分类