C++ win32控制台显示月历
事情的起因是前端同事一时性♂起想自己写一个日历控件
然后研究了一下逻辑思路
我们参考一下win10系统的显示格式
从日期数据来说,这是一个6X7的矩阵
除了当月的天数以外,头尾还要补齐上月末与下月初的日期。
首先,需要确定本月显示的天数,那么第一件事,得判断当前月共有多少天,包括闰年的处理
int getdays(int year,int month)
{switch(month) { case 12: return 31; case 11: return 30; case 10: return 31; case 9: return 30; case 8: return 31; case 7: return 31; case 6: return 30; case 5: return 31; case 4: return 30; case 3: return 31; case 2: if((year%400==0)||(year%4==0)&&(year%100!=0)) return 29; else return 28; case 1: return 31; case 0: return 31; } }
注意,这里加了一个case 0,因为下文中会引用到求上月份天数,如果是1月份的上个月,即传入0,那么实际返回的应是去年的12月所以是31天。
确定好本月以后,我们推一下上个月需要的天数,首先就要确定本月的一号在矩阵的位置,也就是周几。拿上图为例,其排列是周一至周日。
那么如果是周日(7),则需要补上6天,即,需要补的天数为当前月1号的星期-1
那么求当前月1号的星期也可以通过本日的日期信息获取(week-(day-1)%7)这个应该不难理解,即计算日期的差值,如果求出的值小于1那么就再加上7
这样我们就能求出开始需要补充的天数了。
后面追加的天数更为简单,直接初始成1号往后加就好了
大体思路确定了以后,我们开始过一遍这个6*7矩阵
首先是头部分,我用一个自减变量来标记他,这样做的好处是,我可以直接用上个月的天数减去这个变量求得应该显示的日期,比如说我本月的1号是在周日
那么就需要补充上月的6天,我第一个显示的就是31(上个月天数)-(6-1)即26号,最后显示31-0=31号
if(needday-->0)
{
time_table[i][j]=Pdays-needday;
printf("%02d%c",time_table[i][j],j==6?'\n':' ');
}
然后是本月的正常日期,也可以加上后面追加的一起算,只要把超过当前天数时,天数清空就好了。即:
time_table[i][j]=day_count++;
if(day_count>days)
{
day_count=1;
}
printf("%02d%c",time_table[i][j],j==6?'\n':' ');
下面贴出完整代码:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
using namespace std;
int i,j;int time_table[6][7];int getdays(int year,int month)
{switch(month) { case 12: return 31; case 11: return 30; case 10: return 31; case 9: return 30; case 8: return 31; case 7: return 31; case 6: return 30; case 5: return 31; case 4: return 30; case 3: return 31; case 2: if((year%400==0)||(year%4==0)&&(year%100!=0)) return 29; else return 28; case 1: return 31; case 0: return 31; } }int main()
{SYSTEMTIME sys; GetLocalTime( &sys );HANDLE consolehwnd;consolehwnd=GetStdHandle(STD_OUTPUT_HANDLE);/*printf("%d\n",sys.wYear);printf("%d\n",sys.wMonth);printf("%d\n",sys.wDay);printf("%d\n",sys.wDayOfWeek); printf("%d\n",sys.wHour);printf("%d\n",sys.wMinute);printf("%d\n",sys.wSecond);printf("%d\n",sys.wMilliseconds);*/int days=getdays(sys.wYear,sys.wMonth);int Pdays=getdays(sys.wYear,sys.wMonth-1);// printf("%d\n",days);int day_count=1;int FirstDayWeekAsMonth=sys.wDayOfWeek-(sys.wDay-1)%7;if(FirstDayWeekAsMonth<1)FirstDayWeekAsMonth+=7;// printf("%d\n", FirstDayWeekAsMonth);int needday=FirstDayWeekAsMonth-1;printf("%s\n", "一 二 三 四 五 六 日");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GREEN);for(i=0;i<6;i++)for(j=0;j<7;j++){if(needday-->0){time_table[i][j]=Pdays-needday;SetConsoleTextAttribute(consolehwnd,FOREGROUND_RED);printf("%02d%c",time_table[i][j],j==6?'\n':' ');SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GREEN);}else{time_table[i][j]=day_count++;printf("%02d%c",time_table[i][j],j==6?'\n':' '); if(day_count>days){day_count=1; SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_BLUE);}}}SetConsoleTextAttribute(consolehwnd, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);// for(i=0;i<6;i++)
// for(j=0;j<7;j++)
// printf("%02d%c",time_table[i][j],j==6?'\n':' ');return 0;
}
运行截图
注:GetLocalTime实现获取当前日期信息,SetConsoleTextAttribute实现改变控制台输出颜色,为了区别月份
C++ win32控制台显示月历相关推荐
- 控制台调用win32 API 示例二则
一 控制台显示消息框 #include <stdio.h> #include <windows.h>int main(int argc, char* argv[]) {int ...
- Win32消息集合----方便查阅
// #include "AFXPRIV.H"//消息值的定义来源 #include "Dde.h"//DDE消息值的定义来源 #include "C ...
- C++ Win32程序编写入门
翻译:原文地址 一.关于Win32++ 本文档描述了Win32++9.1版的功能.若要下载Win32++的程序清单,可以点击这里. Win32++是一个用于构建windows应用程序 ...
- Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)
大龙的博客 C++博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理 Don't Use the Win32 API PostThreadMessage() to Post Me ...
- C#中使用Win32和其他库
C# 用户经常提出两个问题:"我为什么要另外编写代码来使用内置于 Windows 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?"当框架小组构建他们的 .NET 部分 ...
- 在 C# 中通过 P/Invoke 调用Win32 DLL
,.NET Framework 1.0 或 1.1 版类库中存在任何 Windows 所没有的功能限制都不足为怪.毕竟,32 位的 Windows(不管何种版本)是一个成熟的操作系统,为广大客户服务了 ...
- Win32 环境下的堆栈
原文已经找不到,作者应该是:http://blog.csdn.net/slimak 但是没有找到此文,其中丢了2幅图 简介 在Win32环境下利用调试器调试应用程序的时候经常要和堆栈(Stack) ...
- Win32.Lioten.SG病毒
病毒名称:Win32.Lioten.SG 疯狂性:低 破坏性:中 普及度:中 Win32.Lioten.SG病毒描述: Win32.Lioten.SG是一种通过网络共享传播的蠕虫,还会利用Window ...
- win32的一个售票程序,收获有非常的多
先秀一下我的收获吧! 1.在创建非模态对话框的时,需要用到createdialog函数,第二个参数需要注意是填写对话框的资源标识符(id),之后需要调用showwindow来显示对话框:或者不这么做也 ...
最新文章
- Win8兼容ARM十大意义:打破垄断拉低价格
- FPGA之道(22)VHDL基本程序框架
- SAP Spartacus B2B页面的List Component
- CoreAnimation (CALayer 动画)
- c语言getchar_二级C语言试题刷题录
- 去除input填充颜色
- Redis和Memcache区别
- 【机器学习系列】MCMC第二讲:Markov Chain Monte Carlo基本概念和核心思想
- Python的time,datetime,string相互转换
- win10 安装程序显示“为了对电脑进行保护,已经阻止此应用” 管理员已阻止你运行此应用
- c语言制作单片机人机界面,基于51单片机自制触摸屏
- 通常所说的微型计算机的主机主要包括(),微型计算机的主机主要包括
- 【转载】Ansys中的阻尼
- 如何提升原创文章排名与百度冰桶算法
- Yolov5的配置+训练(超级详细!!!)
- android app申请内存大小,Android中App可分配内存的大小
- Java 多线程学习(1)一些容易被遗忘的基础概念
- Word的样式库在 选项卡中_word排版应用:如何创建文本样式和表格样式
- 玩客云家庭媒体共享中心使用说明
- 动手学Android之六——布局初步(三)
热门文章
- 40 CO配置-控制-产品成本控制-成本对象控制-实际成本核算/物料分类帐-维护材料分类帐文档的编号范围
- python内置函数可以用来_Python内置函数——compile
- linux 如何查看进程内用户虚拟空间分布
- CUDA peer to peer多GPU间内存copy技术
- word删除分节符后之前的格式乱了_分页符分节符,你知道多少
- vue项目dist编译文件部署到服务器:页面空白、F5刷新报错404、403报错、等等bug - 总结篇
- tkinter显示mysql表_Python(Tkinter)如何只显示Mysql记录而不显示列表?
- python加密字符串小写字母循环后错两位_Python简单加密程序:如何将Z循环回
- ubuntu共享文件夹文件看不到_实验08:轻松搭建文件夹共享
- PC端动态视频背景引导页(非自适应)