事情的起因是前端同事一时性♂起想自己写一个日历控件

然后研究了一下逻辑思路

我们参考一下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控制台显示月历相关推荐

  1. 控制台调用win32 API 示例二则

    一 控制台显示消息框 #include <stdio.h> #include <windows.h>int main(int argc, char* argv[]) {int ...

  2. Win32消息集合----方便查阅

    // #include "AFXPRIV.H"//消息值的定义来源 #include "Dde.h"//DDE消息值的定义来源 #include "C ...

  3. C++ Win32程序编写入门

    翻译:原文地址 一.关于Win32++ ​        本文档描述了Win32++9.1版的功能.若要下载Win32++的程序清单,可以点击这里. Win32++是一个用于构建windows应用程序 ...

  4. Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)

    大龙的博客 C++博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理 Don't Use the Win32 API PostThreadMessage() to Post Me ...

  5. C#中使用Win32和其他库

    C# 用户经常提出两个问题:"我为什么要另外编写代码来使用内置于 Windows 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?"当框架小组构建他们的 .NET 部分 ...

  6. 在 C# 中通过 P/Invoke 调用Win32 DLL

    ,.NET Framework 1.0 或 1.1 版类库中存在任何 Windows 所没有的功能限制都不足为怪.毕竟,32 位的 Windows(不管何种版本)是一个成熟的操作系统,为广大客户服务了 ...

  7. Win32 环境下的堆栈

    原文已经找不到,作者应该是:http://blog.csdn.net/slimak   但是没有找到此文,其中丢了2幅图 简介 在Win32环境下利用调试器调试应用程序的时候经常要和堆栈(Stack) ...

  8. Win32.Lioten.SG病毒

    病毒名称:Win32.Lioten.SG 疯狂性:低 破坏性:中 普及度:中 Win32.Lioten.SG病毒描述: Win32.Lioten.SG是一种通过网络共享传播的蠕虫,还会利用Window ...

  9. win32的一个售票程序,收获有非常的多

    先秀一下我的收获吧! 1.在创建非模态对话框的时,需要用到createdialog函数,第二个参数需要注意是填写对话框的资源标识符(id),之后需要调用showwindow来显示对话框:或者不这么做也 ...

最新文章

  1. Win8兼容ARM十大意义:打破垄断拉低价格
  2. FPGA之道(22)VHDL基本程序框架
  3. SAP Spartacus B2B页面的List Component
  4. CoreAnimation (CALayer 动画)
  5. c语言getchar_二级C语言试题刷题录
  6. 去除input填充颜色
  7. Redis和Memcache区别
  8. 【机器学习系列】MCMC第二讲:Markov Chain Monte Carlo基本概念和核心思想
  9. Python的time,datetime,string相互转换
  10. win10 安装程序显示“为了对电脑进行保护,已经阻止此应用” 管理员已阻止你运行此应用
  11. c语言制作单片机人机界面,基于51单片机自制触摸屏
  12. 通常所说的微型计算机的主机主要包括(),微型计算机的主机主要包括
  13. 【转载】Ansys中的阻尼
  14. 如何提升原创文章排名与百度冰桶算法
  15. Yolov5的配置+训练(超级详细!!!)
  16. android app申请内存大小,Android中App可分配内存的大小
  17. Java 多线程学习(1)一些容易被遗忘的基础概念
  18. Word的样式库在 选项卡中_word排版应用:如何创建文本样式和表格样式
  19. 玩客云家庭媒体共享中心使用说明
  20. 动手学Android之六——布局初步(三)

热门文章

  1. 40 CO配置-控制-产品成本控制-成本对象控制-实际成本核算/物料分类帐-维护材料分类帐文档的编号范围
  2. python内置函数可以用来_Python内置函数——compile
  3. linux 如何查看进程内用户虚拟空间分布
  4. CUDA peer to peer多GPU间内存copy技术
  5. word删除分节符后之前的格式乱了_分页符分节符,你知道多少
  6. vue项目dist编译文件部署到服务器:页面空白、F5刷新报错404、403报错、等等bug - 总结篇
  7. tkinter显示mysql表_Python(Tkinter)如何只显示Mysql记录而不显示列表?
  8. python加密字符串小写字母循环后错两位_Python简单加密程序:如何将Z循环回
  9. ubuntu共享文件夹文件看不到_实验08:轻松搭建文件夹共享
  10. PC端动态视频背景引导页(非自适应)