从0开始c++,但是重置版,第0篇(下载编辑器)

前言

各位好,我是初夏(~ ̄▽ ̄)~
我忽然发现之前我写得太烂了,才61质量分
所以我又开始写了,重置了
以及我不想写Markdown的教程
有兴趣可以看我之前写得教程
这才是真正的0基础教程虽然只是从0学到入门,精通是不可能的
再讲一下B站上的**教程吧
很多教程都是有头无尾,我比较看好的是黑马程序员的教程
其他的教程都是什么:
【整整528集】这绝对是2025年B站最全最细的C/C++零基础全套教程,小白逼自己一个月学完,编程技术猛涨!拿走不谢,全程通俗易懂,学不会我退出IT界!
看吐了

下载c++环境编辑器

虽说我之前教大家下载的是devc++,但这样是因为我电脑window7
所以这次还教其他编辑器

devc++

伟大无需多言
https://wwyf.lanzoul.com/iKeVy39e9hxg
密码:1234
依旧该网址下载,但这不是最新(总之我用的是这个版本)
大家可以去官网下载,也可以在站内找教程

1.选语言

在这里插入图片描述
先选英文,后面再改,因为这里没有中文选项

2.安装

在这里插入图片描述
点击画起来的按钮
在这里插入图片描述
在这里插入图片描述
还有这里提一嘴,我是装E盘的,你们内存大可以装C盘
在这里插入图片描述
开始下载…

3.选语言(这里才选中文)

在这里插入图片描述
先选择中文再确认

4.选主题

你们爱选啥选啥,我不管
在这里插入图片描述

5.缓存头文件

你们选推荐推荐,选全部全部,总之我是选推荐(因为做文章做累了,语气随便的me)在这里插入图片描述

6.下载成功

在这里插入图片描述

7.检查是否成功(废话文学)

在这里插入图片描述
这样就行了

8.创造文档

首先直接Ctrl+n就行了
在这里插入图片描述
Ctrl+Alt+S就可以把文档另存为其他地方
在这里插入图片描述

VS

说实话,我的window7装不了,所以这里我不教,
我给几个网址给大家:
bilibili大佬教程

在线Web编辑器

当然这是我找到的一些比较好用的
菜鸟教程
.
.
.
.
.
.
.
完结撒花!✿ヽ(°▽°)ノ✿
第1篇会在今天赶出来,别催!

<think>我们使用MFC(Microsoft Foundation Classes)来实现一个秒表程序。主要步骤包括: 1. 创建一个对话框应用程序,添加一个静态文本控件(用于显示时间)和一个按钮控件。 2. 设置一个定时器,每隔50毫秒触发一次,用于更新静态文本的显示。 3. 按钮点击事件处理函数,根据点击次数(或状态)切换开始、暂停、重置功能。 状态管理: - 初始状态:未开始(状态0),按钮显示“开始” - 第一次点击:开始计时(状态1),按钮显示“暂停” - 第二次点击:暂停计时(状态2),按钮显示“重置” - 第三次点击:重置计时(状态0),按钮显示“开始” 实现细节: - 使用`SetTimer`设置定时器,定时器ID为1,时间间隔为50毫秒。 - 在定时器消息处理函数`OnTimer`中更新显示的时间。 - 使用成员变量记录状态、开始时间、暂停时的时间等。 步骤: 1. 创建MFC对话框项目。 2. 在对话框资源编辑器中,添加一个静态文本控件(IDC_STATIC_TIME)和一个按钮(IDC_BUTTON_CONTROL)。 3. 为按钮添加点击事件处理函数。 4. 在对话框类中添加成员变量: int m_state; // 0:未开始, 1:运行中, 2:暂停 CTime m_startTime; // 记录开始时间 CTimeSpan m_pausedTime; // 暂停时已经过的时间(从开始到暂停) CTimeSpan m_elapsedTime; // 当前经过的时间(用于显示) bool m_bTimerRunning; // 定时器是否在运行(用于控制定时器) 5. 在初始化函数(OnInitDialog)中初始化变量。 6. 实现定时器处理函数,更新静态文本控件的显示。 7. 按钮点击时,根据状态进行切换。 注意:由于MFC的CTime精度只到秒,我们需要更高精度(毫秒)可以使用GetTickCount或high-resolution计数器。这里我们使用GetTickCount来获取毫秒数。 我们改用DWORD来记录时间(毫秒): DWORD m_dwStart; // 开始时的系统时间(毫秒) DWORD m_dwPaused; // 暂停时已经经过的毫秒数(从开始到暂停的累计时间) DWORD m_dwElapsed; // 当前经过的毫秒数(用于显示) 每次定时器触发,我们计算当前时间与开始时间的差值(如果正在运行)加上暂停时累计的时间,然后更新显示。 具体代码实现: 头文件(StopwatchDlg.h)中添加成员变量: ```cpp class CStopwatchDlg : public CDialogEx { // ... 其他代码 private: int m_state; // 0:未开始, 1:运行中, 2:暂停 DWORD m_dwStart; // 开始时的系统时间(GetTickCount值) DWORD m_dwPaused; // 暂停时已经经过的毫秒数(累计) DWORD m_dwElapsed; // 当前经过的毫秒数(用于显示) bool m_bTimerRunning; // 定时器是否在运行 }; ``` 实现文件(StopwatchDlg.cpp): 在OnInitDialog中初始化: ```cpp BOOL CStopwatchDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // ... 其他初始化 m_state = 0; // 初始状态:未开始 m_dwStart = 0; m_dwPaused = 0; m_dwElapsed = 0; m_bTimerRunning = false; // 设置按钮文本 GetDlgItem(IDC_BUTTON_CONTROL)->SetWindowText(_T("开始")); return TRUE; } ``` 按钮点击事件处理函数: ```cpp void CStopwatchDlg::OnBnClickedButtonControl() { if (m_state == 0) // 未开始 -> 开始 { // 记录开始时间(当前TickCount减去暂停时的时间,以实现恢复) m_dwStart = GetTickCount() - m_dwPaused; m_state = 1; // 状态:运行中 SetDlgItemText(IDC_BUTTON_CONTROL, _T("暂停")); // 启动定时器,间隔50毫秒 SetTimer(1, 50, NULL); m_bTimerRunning = true; } else if (m_state == 1) // 运行中 -> 暂停 { m_state = 2; SetDlgItemText(IDC_BUTTON_CONTROL, _T("重置")); // 停止定时器 KillTimer(1); m_bTimerRunning = false; // 更新暂停时已经过的时间 m_dwPaused = GetTickCount() - m_dwStart; } else if (m_state == 2) // 暂停 -> 重置 { m_state = 0; SetDlgItemText(IDC_BUTTON_CONTROL, _T("开始")); // 重置时间 m_dwPaused = 0; m_dwElapsed = 0; // 更新显示为00:00:00.000 SetDlgItemText(IDC_STATIC_TIME, _T("00:00:00.000")); } } ``` 定时器处理函数(OnTimer): ```cpp void CStopwatchDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 1) { if (m_state == 1) // 只有在运行中状态更新 { // 计算经过的时间(毫秒) m_dwElapsed = GetTickCount() - m_dwStart; // 将毫秒转换为时:分:秒.毫秒 DWORD milliseconds = m_dwElapsed % 1000; DWORD total_seconds = m_dwElapsed / 1000; DWORD seconds = total_seconds % 60; DWORD minutes = (total_seconds / 60) % 60; DWORD hours = total_seconds / 3600; // 格式化时间字符串 CString strTime; strTime.Format(_T("%02d:%02d:%02d.%03d"), hours, minutes, seconds, milliseconds); SetDlgItemText(IDC_STATIC_TIME, strTime); } } CDialogEx::OnTimer(nIDEvent); } ``` 注意:GetTickCount可能会因为系统时间调整而受到影响,但对于秒表应用通常可以接受。另外,GetTickCount返回的是自系统启动以来的毫秒数,大约每49.7天会回绕,但秒表应用通常不会持续那么久。 此外,我们需要在对话框类中映射定时器消息: 在消息映射中添加: ```cpp BEGIN_MESSAGE_MAP(CStopwatchDlg, CDialogEx) ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON_CONTROL, &CStopwatchDlg::OnBnClickedButtonControl) END_MESSAGE_MAP() ``` 以上代码实现了在MFC中创建秒表的基本功能。 注意:由于定时器精度问题,实际间隔可能不会精确到50毫秒,但这是Windows定时器的正常行为。 另外,为了确保每次点击按钮状态正确切换,我们使用m_state变量来记录状态。 完整步骤如下: 1. 创建MFC对话框项目。 2. 添加静态文本控件(ID设为IDC_STATIC_TIME)和按钮(ID设为IDC_BUTTON_CONTROL)。 3. 使用类向导为按钮添加点击事件处理函数(OnBnClickedButtonControl)。 4. 在对话框类中手动添加OnTimer函数,并确保消息映射正确。 这样,程序就可以按照要求工作了。 §§相关问题§§ 1. 在MFC中,如果定时器精度不够高,如何实现更高精度的计时(如使用多媒体定时器)? 2. 如何修改代码以实现多个圈速记录(lap times)功能? 3. 在MFC中,如何将秒表数据显示在列表控件(如CListCtrl)中以记录每次圈速? 4. 如何保存和加载秒表的历史记录数据? 5. 在MFC对话框中,如何调整控件布局以适应不同分辨率? </think>### 在 MFC 中实现 50 毫秒定时器和秒表控件 在 MFC 中实现此功能需要使用定时器机制 (`SetTimer`) 和按钮状态管理。下面是完整的实现步骤和代码示例: #### 核心步骤: 1. **定时器设置**:使用 `SetTimer()` 创建 50 毫秒精度的定时器 2. **状态管理**:使用按钮点击计数器(或状态变量)控制开始/暂停/重置 3. **时间计算**:通过 `GetTickCount()` 获取高精度时间差 4. **文本更新**:使用 `CStatic` 控件显示格式化时间 #### 完整代码实现: ```cpp // StopwatchDlg.h 头文件 class CStopwatchDlg : public CDialogEx { DECLARE_DYNAMIC(CStopwatchDlg) public: CStopwatchDlg(CWnd* pParent = nullptr); virtual ~CStopwatchDlg(); enum { IDD = IDD_STOPWATCH_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); // 消息处理 afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnBnClickedControlButton(); // 控件变量 CStatic m_staticTime; // 时间显示控件 CButton m_btnControl; // 控制按钮 // 状态变量 int m_clickCount; // 按钮点击计数 (0,1,2) DWORD m_startTime; // 开始时间戳 (毫秒) DWORD m_pausedTime; // 暂停时累计时间 bool m_isRunning; // 运行状态标志 DECLARE_MESSAGE_MAP() }; ``` ```cpp // StopwatchDlg.cpp 实现文件 #include "stdafx.h" #include "Stopwatch.h" #include "StopwatchDlg.h" BEGIN_MESSAGE_MAP(CStopwatchDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_TIMER() ON_BN_CLICKED(IDC_CONTROL_BUTTON, &CStopwatchDlg::OnBnClickedControlButton) END_MESSAGE_MAP() BOOL CStopwatchDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化变量 m_clickCount = 0; // 初始点击次数 m_startTime = 0; // 初始开始时间 m_pausedTime = 0; // 暂停时间为0 m_isRunning = false; // 初始不在运行状态 // 设置控件文本 m_staticTime.SetWindowTextW(_T("00:00:00.000")); m_btnControl.SetWindowTextW(_T("开始")); return TRUE; } void CStopwatchDlg::OnBnClickedControlButton() { // 按钮点击处理(三次循环) if (m_clickCount == 0) { // 初始状态 → 开始 m_startTime = ::GetTickCount(); // 记录开始时间 SetTimer(1, 50, NULL); // 启动50ms定时器 m_btnControl.SetWindowTextW(_T("暂停")); m_isRunning = true; m_clickCount = 1; } else if (m_clickCount == 1) { // 运行中 → 暂停 KillTimer(1); // 停止定时器 m_pausedTime += ::GetTickCount() - m_startTime; // 累计暂停时间 m_btnControl.SetWindowTextW(_T("重置")); m_isRunning = false; m_clickCount = 2; } else if (m_clickCount == 2) { // 暂停 → 重置 m_pausedTime = 0; // 重置累计时间 m_staticTime.SetWindowTextW(_T("00:00:00.000")); // 清零显示 m_btnControl.SetWindowTextW(_T("开始")); m_clickCount = 0; // 重置点击计数 } } void CStopwatchDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 1 && m_isRunning) { // 计算经过时间(精确到毫秒) DWORD elapsed = (::GetTickCount() - m_startTime) + m_pausedTime; // 格式化时间 HH:MM:SS.mmm DWORD ms = elapsed % 1000; DWORD secs = elapsed / 1000; DWORD mins = secs / 60; DWORD hours = mins / 60; CString timeStr; timeStr.Format(_T("%02d:%02d:%02d.%03d"), hours % 24, mins % 60, secs % 60, ms); // 更新静态文本显示 m_staticTime.SetWindowTextW(timeStr); } CDialogEx::OnTimer(nIDEvent); } ``` #### 关键实现细节: 1. **定时器精度**: - 使用 `SetTimer(1, 50, NULL)` 设置 50 毫秒定时器 - 在 `OnTimer` 处理函数中更新显示 - 暂停时使用 `KillTimer(1)` 停止定时器 2. **时间计算**: - `GetTickCount()` 获取毫秒级系统时间戳 - 计算经过时间:`当前时间 - 开始时间 + 暂停累计时间` 3. **按钮状态循环**: - 状态0:初始 → 点击开始计时 - 状态1:运行中 → 点击暂停 - 状态2:暂停中 → 点击重置 4. **时间格式化**: - 格式化为 `小时:分钟:秒.毫秒` - 使用 `CString::Format` 格式化字符串 #### 使用注意事项: 1. 在资源编辑器中创建: - 添加 `CStatic` 控件(IDC_STATIC_TIME) - 添加按钮(IDC_CONTROL_BUTTON) - 使用类向导关联控件变量 2. 定时器限制: - Windows 定时器最小精度约 15-30ms - 50ms 定时器实际间隔可能有 ±10ms 波动 - 更高精度需使用多媒体定时器 (timeSetEvent) 3. 长时间运行: - `GetTickCount()` 约 49.7 天会回绕 - 需要处理时间回绕情况(添加回绕检测) 此实现满足每 50 毫秒更新显示的要求,并通过按钮三次点击实现完整的开始/暂停/重置循环。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值