frozen centuries 2018-12-08 08:18 采纳率: 0%
浏览 681

用mfc编写一个日期计算器

编写一个对话框应用程序,实现如图所示的界面,单击“计算”按钮判断用户设置的日期是否正确,并计算该天是一年中的第几天?要考虑闰年和大小月时,“日”对应的组合框中显示的天数,如2000年2月有29天,而2001年2月只有28天。
图片说明

  • 写回答

1条回答 默认 最新

  • 眉目皆昭君 2022-04-17 00:22
    关注

    // MFCApplication1Dlg.cpp: 实现文件
    //

    #include "pch.h"
    #include "framework.h"
    #include "MFCApplication1.h"
    #include "MFCApplication1Dlg.h"
    #include "afxdialogex.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif

    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框

    class CAboutDlg : public CDialogEx
    {
    public:
    CAboutDlg();

    // 对话框数据
    #ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_ABOUTBOX };
    #endif

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    

    // 实现
    protected:
    DECLARE_MESSAGE_MAP()
    };

    CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
    {
    }

    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    }

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()

    // CMFCApplication1Dlg 对话框

    CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /=nullptr/)
    : CDialogEx(IDD_MFCAPPLICATION1_DIALOG, pParent)
    , m_nOperator1(-1)
    , m_nOperator2(-1)
    , m_nOperator3(-1)
    , m_nResult(0)
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_COMBO1, m_Operator1);
    DDX_Control(pDX, IDC_COMBO2, m_Operator2);
    DDX_Control(pDX, IDC_COMBO3, m_Operator3);
    DDX_CBIndex(pDX, IDC_COMBO1, m_nOperator1);
    DDX_CBIndex(pDX, IDC_COMBO2, m_nOperator2);
    DDX_CBIndex(pDX, IDC_COMBO3, m_nOperator3);
    DDX_Text(pDX, IDC_EDIT1, m_nResult);
    }

    BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_CBN_SELCHANGE(IDC_COMBO3, &CMFCApplication1Dlg::OnCbnSelchangeCombo3)
    ON_CBN_SELCHANGE(IDC_COMBO2, &CMFCApplication1Dlg::OnCbnSelchangeCombo2)
    ON_CBN_SELCHANGE(IDC_COMBO1, &CMFCApplication1Dlg::OnCbnSelchangeCombo1)
    ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication1Dlg::OnBnClickedButton1)
    ON_EN_CHANGE(IDC_EDIT1, &CMFCApplication1Dlg::OnEnChangeEdit1)
    END_MESSAGE_MAP()

    // CMFCApplication1Dlg 消息处理程序

    BOOL CMFCApplication1Dlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。
    
    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
    
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != nullptr)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }
    
    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标
    
    // TODO: 在此添加额外的初始化代码
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    

    }

    void CMFCApplication1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialogEx::OnSysCommand(nID, lParam);
    }
    }

    // 如果向对话框添加最小化按钮,则需要下面的代码
    // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
    // 这将由框架自动完成。

    void CMFCApplication1Dlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
        // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
    
        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
    

    }

    //当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CMFCApplication1Dlg::OnQueryDragIcon()
    {
    return static_cast(m_hIcon);
    }

    void CMFCApplication1Dlg::OnCbnSelchangeCombo1()
    {
    // TODO: 在此添加控件通知处理程序代码

    }

    void CMFCApplication1Dlg::OnCbnSelchangeCombo2()
    {
    // TODO: 在此添加控件通知处理程序代码
    }

    void CMFCApplication1Dlg::OnCbnSelchangeCombo3()
    {
    // TODO: 在此添加控件通知处理程序代码
    }

    void CMFCApplication1Dlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    int sum = 0;
    if (m_nOperator1 == -1||m_nOperator2==-1||m_nOperator3==-1) {
    AfxMessageBox(_T("请选择正确时间"));
    return;
    }

    if ((m_nOperator2== 3 || m_nOperator2 == 5 || m_nOperator2 == 8 || m_nOperator2 == 10) && m_nOperator3 == 30)  // 4 6 9 11 月仅有 30天 
    {
        AfxMessageBox(_T("您选择的日期不合法"));
        return;
    }
    else if (m_nOperator2 == 1 && (m_nOperator3 == 29 || m_nOperator3 == 30))    // 2月最多29天 
    {
        AfxMessageBox(_T("您选择的日期不合法"));
        return;
    }
    else if (!(  m_nOperator1==3 || m_nOperator1  == 7) && m_nOperator2 == 1 && m_nOperator3 == 28)  //如果不是闰年 输入了 2月29号,报错 
    {
        AfxMessageBox(_T("您选择的日期不合法"));
        return;
    }
    
    
    switch (m_nOperator2)
    {
    case 0: sum = m_nOperator3+1;    break;
    case 1: sum = 31 + m_nOperator3+1;break; //29
    case 2: sum = 60 + m_nOperator3+1; break;
    case 3: sum = 91 + m_nOperator3+1; break;
    case 4: sum = 121 + m_nOperator3+1; break;
    case 5: sum = 152 + m_nOperator3+1; break;
    case 6: sum = 182 + m_nOperator3+1; break;
    case 7: sum = 213 + m_nOperator3+1; break;
    case 8: sum = 244 + m_nOperator3+1; break;
    case 9: sum = 274 + m_nOperator3+1; break;
    case 10:sum = 305 + m_nOperator3+1; break;
    case 11:sum = 335 + m_nOperator3+1; break;
    }
    if (m_nOperator2 < 2)
    {
        m_nResult = sum;
    }
    else if (m_nOperator1 ==3 || m_nOperator1 == 7) //是四的公倍数,但不是100的公倍数,或者是400的公倍数?
    {
        m_nResult = sum;
    }
    else
        m_nResult = sum-1;
    UpdateData(FALSE);
    

    }

    void CMFCApplication1Dlg::OnEnChangeEdit1()
    {
    // TODO: 如果该控件是 RICHEDIT 控件,它将不
    // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件
  • ¥15 visual studio2022中文乱码无法解决