MFC-实现计算机完善(+-*/%的完善)
2017-12-14 08:56
155 查看
经过几天的努力,总算把之前遗留的问题给解决了,长话短说代码奉上
这个是主要代码,是对于控件的定义。接下来就要实现菜单的实现。先上一波资源视图。
// MyWindowDlg.cpp : 实现文件 // #include "stdafx.h" #include "MyWindow.h" #include "MyWindowDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CMyWindowDlg 对话框 CMyWindowDlg::CMyWindowDlg(CWnd* pParent /*=NULL*/) : CDialog(CMyWindowDlg::IDD, pParent) , m_edt_cs(_T("")) , m_nPlanNum(0) , m_nowNum(0) , m_nPreOperator(ONull) , LastPressIsOperater(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); //MessageBox(L"CMyWindowDlg 类的构造函数"); } void CMyWindowDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_edt_cs); DDX_Control(pDX, IDC_EDIT1, m_edt1_ctl); } BEGIN_MESSAGE_MAP(CMyWindowDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP //ON_BN_CLICKED(IDOK, &CMyWindowDlg::OnBnClickedOk) ON_WM_CHAR() // ON_WM_LBUTTONDOWN() ON_WM_CREATE() ON_BN_CLICKED(IDC_BUTTON_07, &CMyWindowDlg::OnBnClickedButton07) ON_BN_CLICKED(IDC_BUTTON_08, &CMyWindowDlg::OnBnClickedButton08) ON_BN_CLICKED(IDC_BUTTON_04, &CMyWindowDlg::OnBnClickedButton04) ON_BN_CLICKED(IDC_BUTTON_01, &CMyWindowDlg::OnBnClickedButton01) ON_BN_CLICKED(IDC_BUTTON_00, &CMyWindowDlg::OnBnClickedButton00) ON_BN_CLICKED(IDC_BUTTON26, &CMyWindowDlg::OnBnClickedButton26) ON_BN_CLICKED(IDC_BUTTON_02, &CMyWindowDlg::OnBnClickedButton02) ON_BN_CLICKED(IDC_BUTTON_05, &CMyWindowDlg::OnBnClickedButton05) ON_BN_CLICKED(IDC_BUTTON_09, &CMyWindowDlg::OnBnClickedButton09) ON_BN_CLICKED(IDC_BUTTON_06, &CMyWindowDlg::OnBnClickedButton06) ON_BN_CLICKED(IDC_BUTTON_03, &CMyWindowDlg::OnBnClickedButton03) ON_BN_CLICKED(IDC_BTN_BS, &CMyWindowDlg::OnBnClickedBtnBs) ON_BN_CLICKED(IDC_BUTTON_C, &CMyWindowDlg::OnBnClickedButtonC) ON_BN_CLICKED(IDC_BUTTON_ADD_SUB, &CMyWindowDlg::OnBnClickedButtonAddSub) ON_EN_CHANGE(IDC_EDIT1, &CMyWindowDlg::OnEnChangeEdit1) ON_BN_CLICKED(IDC_BUTTON_ADD, &CMyWindowDlg::OnBnClickedButtonAdd) ON_BN_CLICKED(IDC_BUTTON14, &CMyWindowDlg::OnBnClickedButton14) ON_BN_CLICKED(IDC_BUTTON_SUB, &CMyWindowDlg::OnBnClickedButtonSub) ON_BN_CLICKED(IDC_BUTTON_MUL, &CMyWindowDlg::OnBnClickedButtonMul) ON_BN_CLICKED(IDC_BUTTON_DIV, &CMyWindowDlg::OnBnClickedButtonDiv) ON_BN_CLICKED(IDC_BUTTON_CE, &CMyWindowDlg::OnBnClickedButtonCe) ON_BN_CLICKED(IDC_BUTTON_QM, &CMyWindowDlg::OnBnClickedButtonQm) ON_COMMAND(ID_32777, &CMyWindowDlg::On32777) ON_COMMAND(ID_32771, &CMyWindowDlg::OnMenuCopy) ON_COMMAND(ID_32772, &CMyWindowDlg::OnMenuPaste) END_MESSAGE_MAP() // CMyWindowDlg 消息处理程序 BOOL CMyWindowDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 //MessageBox(L"OnInitDialog "); /*HWND h=::GetDlgItem(m_hWnd,IDC_EDIT1); ::SetWindowText(h,L"0.");*/ //GetDlgItem(IDC_EDIT1)->SetWindowText(L"0."); m_edt_cs=L""; UpdateData(FALSE);//表示把关联变量数值更新到窗口 m_edt1_ctl.SetWindowText(L"");//省略了参数 m_edt1_ctl.m_hWnd return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMyWindowDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMyWindowDlg::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 { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CMyWindowDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } //void CMyWindowDlg::OnBnClickedOk() //{ // // TODO: 在此添加控件通知处理程序代码 // //printf("dd"); // MessageBox(L"我的程序"); // //OnOK(); 退出程序 //} void CMyWindowDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDialog::OnChar(nChar, nRepCnt, nFlags); } void CMyWindowDlg::OnLButtonDown(UINT nFlags, CPoint point) { // (static_cast< void (AFX_MSG_CALL CWnd::*)(UINT, CPoint) > ( &ThisClass :: OnLButtonDown)) }, // TODO: 在此添加消息处理程序代码和/或调用默认值 //MessageBox(L"鼠标左键按下了"); CDialog::OnLButtonDown(nFlags, point); } int CMyWindowDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 //MessageBox(L"OnCreate 窗口创建"); return 0; } void CMyWindowDlg::OnBnClickedButton07() { PressNum(7); } void CMyWindowDlg::OnBnClickedButton08() { PressNum(8); } void CMyWindowD c494 lg::OnBnClickedButton04() { PressNum(4); } void CMyWindowDlg::OnBnClickedButton01() { PressNum(1); } void CMyWindowDlg::OnBnClickedButton00() { PressNum(0); } void CMyWindowDlg::OnBnClickedButton26() { // TODO: 在此添加控件通知处理程序代码 } void CMyWindowDlg::OnBnClickedButton02() { PressNum(2); } void CMyWindowDlg::OnBnClickedButton05() { PressNum(5); } void CMyWindowDlg::OnBnClickedButton09() { PressNum(9); } void CMyWindowDlg::OnBnClickedButton06() { PressNum(6); } void CMyWindowDlg::OnBnClickedButton03() { PressNum(3); } void CMyWindowDlg::OnBnClickedBtnBs() { // TODO: 在此添加控件通知处理程序代码 m_edt_cs.GetBuffer() [ m_edt_cs.GetLength() - 1] = 0;//WCHAR* WCHAR // char a[255]; // char *p=a; // p[3] a[3] m_edt_cs.ReleaseBuffer();//释放缓冲区 UpdateData(false); } void CMyWindowDlg::OnBnClickedButtonC() { // TODO: 在此添加控件通知处理程序代码 OnBnClickedButtonCe(); //清零代码 LastPressIsOperater = 0; //表示未按下运算符 m_nowNum = 0; m_nPlanNum = 0; //累计数值为0 m_nPreOperator = ONull; } void CMyWindowDlg::OnBnClickedButtonAddSub() { // TODO: 在此添加控件通知处理程序代码 const TCHAR *ps = m_edt_cs.GetBuffer(); if (ps[0] == '-') { ps++; m_edt_cs = ps; //去掉减号 } else { CString s; s = _T("-"); s += m_edt_cs; //加上-号 m_edt_cs = s; } m_edt_cs.ReleaseBuffer(); UpdateData(FALSE); } void CMyWindowDlg::OnEnChangeEdit1() { // TODO: 如果该控件是 RICHEDIT 控件,则它将不会 // 发送该通知,除非重写 CDialog::OnInitDialog() // 函数并调用 CRichEditCtrl().SetEventMask(), // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 // TODO: 在此添加控件通知处理程序代码 UpdateData(true);//更新窗口数据至变量 } // 用于计算四则运算 int CMyWindowDlg::plan(OperatorNum nOperator) { //如果上次按下的是运算符,则更新m_nPreOperator的值,退出此函数 if (LastPressIsOperater) { m_nPreOperator = nOperator; return 1; } m_nowNum = _wtoi(m_edt_cs); switch(m_nPreOperator) { case ONull: //空运算 m_nPlanNum = m_nowNum; break; case OAdd: //加 m_nPlanNum += m_nowNum; break; case OSub: //减 m_nPlanNum = m_nPlanNum - m_nowNum; break; case OMul: //乘 m_nPlanNum = m_nPlanNum * m_nowNum; break; case ODiv: //除 m_nPlanNum = m_nPlanNum / m_nowNum; break; case OMod: //取模 m_nPlanNum = m_nPlanNum % m_nowNum; break; } m_nPreOperator = nOperator; LastPressIsOperater = 1; m_edt_cs.Format(L"%d",m_nPlanNum); //printf UpdateData(false); return 0; } void CMyWindowDlg::OnBnClickedButtonAdd() { // TODO: 在此添加控件通知处理程序代码 plan(OAdd); } void CMyWindowDlg::OnBnClickedButton14() { // TODO: 在此添加控件通知处理程序代码 plan(m_nPreOperator); } // 表示按下0-9中某个键 int CMyWindowDlg::PressNum(int nNum) { CString ts; ts.Format(_T("%d"),nNum); if (LastPressIsOperater) { m_edt_cs = ts; //上次按下的是运算符,重新赋值 } else { m_edt_cs += ts; //上次按下的是数字,追加 } m_edt_cs+=L""; //CString LastPressIsOperater = 0; UpdateData(false); return 0; } void CMyWindowDlg::OnBnClickedButtonSub() { // TODO: 在此添加控件通知处理程序代码 plan(OSub); } void CMyWindowDlg::OnBnClickedButtonMul() { // TODO: 在此添加控件通知处理程序代码 plan(OMul); } void CMyWindowDlg::OnBnClickedButtonDiv() { // TODO: 在此添加控件通知处理程序代码 plan(ODiv); } void CMyWindowDlg::OnBnClickedButtonCe() { // TODO: 在此添加控件通知处理程序代码 m_edt_cs = L""; UpdateData(false); } void CMyWindowDlg::OnBnClickedButtonQm() { // TODO: 在此添加控件通知处理程序代码 plan(OMod); }
这个是主要代码,是对于控件的定义。接下来就要实现菜单的实现。先上一波资源视图。
相关文章推荐
- MFC-实现计算机完善(+-*/%的完善)
- MFC-实现计算机编程初始(实现“+”的功能)
- MFC-实现计算机编程初始(实现“+”的功能)
- 计算机图形学——MFC和OpenGL两种方法实现光照模型
- 计算机图形学-在VS2013下利用MFC实现OpenGL
- 打开文件对话框和文件夹对话框之MFC和API实现
- php实现用手机关闭计算机(电脑)的方法
- mfc实现哈希Hash算法(MD5和SHA1)加密
- AI狂想曲:关于计算机实现“智能”的初步探讨——黑盒理论
- MFC学习笔记之Invalidate的用处及对话框数据交换及实现文字背景色为透明
- MFC中通过按钮实现选择图片
- 归纳程序综合计算机实现自我编程,真的可以实现吗?
- 短信猫软件的实现(C#)<十>类库(API)完善
- MFC 中 Tooltip 实现的几种方式
- 计算机程序的思维逻辑 (17) - 继承实现的基本原理
- 四位计算机的原理及其实现
- MFC的浏览器初实现 之 vs2008
- MFC 自定义消息实现与响应
- MFC Split(字符串截取)函数的实现
- MFC 实现类似QQ自动靠边功能