c++控制檯寫一個計時器

你好,Albret發表於2020-07-07

示意圖

在這裡插入圖片描述

新建類Timer

Timer.h


#pragma once
#include <stdio.h>
#include <tchar.h>
#include <time.h>
#include <iostream>
#include <iomanip>
#include <windows.h> 
class Timer
{
public:
	Timer();
	~Timer();

private:
	long start_time;//開始的時間
	long pause_time;//暫停的時間
	bool is_pause;//記錄計時器的狀態(是否暫停)
	bool is_stop;//計時器是否停止

public:
	bool isPause();//讓外界獲取計時器是否處於暫停狀態
	bool isStop();//讓外界獲取計時器是否處於停滯狀態
	void Start();//開始
	void Pause();//暫停
	void Stop();//停止
	void show();//顯示時間
	void gotoxy(int x, int y);
	void HideCursor();
};

Timer.cpp

#include "Timer.h"



Timer::Timer()
{
	is_pause = false;//初始化計時器狀態
	is_stop = true;
}


Timer::~Timer()
{
	

}

bool Timer::isPause()
{
	if (is_pause)
	{
		return true;
	}
	else
		return false;
}

bool Timer::isStop()
{
	if (is_stop)
		return true;
	else
		return false;
}

void Timer::Start()
{
	if (is_stop)
	{
		start_time = (long)time(0);
		is_stop = false;
	}
	else if (is_pause)
	{
		is_pause = false;
		start_time += time(0) - pause_time;
	}
}

void Timer::Pause()
{
	if (is_stop||is_pause)//如果處於停止/暫停狀態,此動作不做任何處理,直接返回
	{
		return;
	}
	else
	{
		is_pause = true;
		pause_time = (long)time(0);//獲取暫停時間
	}
}

void Timer::Stop()
{
	if (is_stop)
	{
		return;
	}
	else if (is_pause)
	{
		is_pause = false;
		is_stop = true;
	}
	else 
	{
		is_stop = true;
	}
}

void Timer::show()
{
	long t = time(0) - start_time;
	gotoxy(35, 12);
	std::cout << std::setw(2) << std::setfill('0') << t / 60 / 60 << ":" \
		<< std::setw(2) << std::setfill('0') << t / 60 << ":"\
		<< std::setw(2) << std::setfill('0') << t % 60 << std::endl;

}

void Timer::gotoxy(int x, int y)//定位到下x,y位置
{
	
		int xx = 0x0b;
		HANDLE hOutput;
		COORD loc;
		loc.X = x;
		loc.Y = y;
		hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleCursorPosition(hOutput, loc);
		return;
}

void Timer::HideCursor()
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(handle, &CursorInfo);//獲取控制檯游標資訊
	CursorInfo.bVisible = false;//隱藏控制檯游標
	SetConsoleCursorInfo(handle, &CursorInfo);//設定控制檯游標狀態

}

主函式

main.cpp


#include "Timer.h"
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
	Timer t;
	char ch;
	t.HideCursor();//隱藏游標
	system("color 02");
	t.gotoxy(20, 18);
	std::cout << "按a開始,按空格暫停,按s停止";
	while (1)
	{
		if (_kbhit())//是否有按鍵
		{
			ch = _getch();//獲取按鍵資訊
			switch (ch)
			{
			case 'a':
				t.Start();
				break;
			case 's':
				t.Stop();
				break;
			case ' ':
				t.Pause();
				break;
			default:
				break;
			}
		}
		if ((!t.isStop())&&(!t.isPause()))
		{
			t.show();
		}
	}


	return 0;
}


相關文章