c++的可视化计算器

学生党的一个课程设计,希望可以对有些人有些帮助大笑大笑大笑,第一次发,不好的话请多多原谅


c++:

一.题目要求:

 

设计一个可视化的计算器,可以执行+,-,*,/,.,%,()等操作。要求使用API来编写程序。(我的计算器输入的时候是以#号开始)。

 

二.需求分析:

 

1.问题描述:

①——用api来编写一个可视化的计算器程序,首先我们要用界面来实现它,所以我们要设计一个计算器的可执行的界面,我使用了2个界面(具体请见第四条的测试),第一个是菜单界面,这个界面是可有可无的,我使用它是为了给用户一个选择,从file退出或从start开始进入,这个不是很重要;第二个界面是计算器的执行界面,这是本次实践的主要目的,我们需要在dialog中添加一个输入与输出列表框,许多button(数字的,运算符的,clear,cancel等),首先在纸上画出理想图,列出个数;因此我们要设计好界面,要注意界面之间,button之间的关系。

②——其次我们需要考虑的是之前的c++计算器代码与api界面代码之间的融合,这是没有做过的,要想好它们之间的关系,比如点击什么按钮的时候执行什么操作,会出来啥界面,啥提示,都要在程序中注意;还要把整个程序做成多文件的形式,不能都弄在一起,要便于编译与改错。

 

三.详细设计(由于c++计算器运算部分不是本次实践的主要目的,在此主要讨论界面实现部分的详细设计):

 

1.resource.h头文件(只是一部分,重复部分省略):

//{{NO_DEPENDENCIES}}

// Microsoft Visual C++ 生成的包含文件。

// 供 Resource.rc使用

//

#define IDR_MYMENU                      101  //菜单的定义

#define IDD_START                       102  //START的定义

#define IDC_BUTTON1                     1000  //BUTTON1的定义

#define IDC_BUTTON2                     1001  //BUTTON2的定义

#define IDC_BUTTON3                     1002  //BUTTON3的定义

#define IDC_BUTTON4                     1003  //BUTTON4的定义

#define IDC_BUTTON5                     1004  //BUTTON5的定义

#define IDC_LIST1                       1018  //列表框的定义

#define ID_FILE_EXIT                    40001  //File中Exit的编译

#define ID_START_START                  40002  //Start中Start中Start的定义

 

// Next default values for newobjects

// 以下是生成资源文件时自生成的,都是一些定义

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE        103

#define _APS_NEXT_COMMAND_VALUE         40003

#define _APS_NEXT_CONTROL_VALUE         1021

#define _APS_NEXT_SYMED_VALUE           101

#endif

#endif

 

2.Resource.rc头文件(部分重要):

IDR_MYMENU MENU      //定义标识符MENU

BEGIN

   POPUP "&File"     //点File

   BEGIN

        MENUITEM "E&xit",                       ID_FILE_EXIT      //点Exit

   END

   POPUP "&START"     //点START

   BEGIN

        MENUITEM"&START...",                  ID_START_START      //点START中的START

   END

END

// Dialog

//

 

IDD_START DIALOGEX 0, 0, 339, 182//IDD_START为资源的标识.DIALOG是资源的类型

 

//以STYLE开头然后在后面跟上用来创建此对话框的窗口风格

STYLE DS_SETFONT | DS_MODALFRAME |WS_POPUP | WS_CAPTION | WS_SYSMENU

 

//dialog的名字

CAPTION "My Calculator"

 

//创建此对话框的字体的大小和名字

FONT 8, "MS Sans Serif", 0,0, 0x1

BEGIN

 

//代表cancel按钮(定义,位置,大小)

PUSHBUTTON     "Cancel",IDCANCEL,261,135,63,28

 

//代表BUTTON0-9按钮(定义,位置,大小)

   PUSHBUTTON     "1",IDC_BUTTON1,7,47,50,39

   PUSHBUTTON     "2",IDC_BUTTON2,7,84,50,39

   PUSHBUTTON     "3",IDC_BUTTON3,7,122,50,43

   PUSHBUTTON     "4",IDC_BUTTON4,57,48,50,37

   PUSHBUTTON     "5",IDC_BUTTON5,57,86,50,36

   PUSHBUTTON     "6",IDC_BUTTON6,58,123,50,42

   PUSHBUTTON     "7",IDC_BUTTON7,108,49,50,35

   PUSHBUTTON     "8",IDC_BUTTON8,108,85,50,37

   PUSHBUTTON     "9",IDC_BUTTON9,108,124,50,41

   PUSHBUTTON     "0",IDC_BUTTON10,159,49,50,35

  

 //代表操作符按钮(定义,位置,大小)

   PUSHBUTTON     ".",IDC_BUTTON11,159,86,50,38

   PUSHBUTTON     "=",IDC_BUTTON12,159,124,50,41

   PUSHBUTTON      "+",IDC_BUTTON13,210,49,50,30

   PUSHBUTTON     "-",IDC_BUTTON14,210,79,50,28

   PUSHBUTTON     "*",IDC_BUTTON15,210,108,50,26

   PUSHBUTTON     "/",IDC_BUTTON16,209,135,50,29

   PUSHBUTTON     "(",IDC_BUTTON17,260,50,32,28

PUSHBUTTON     ")",IDC_BUTTON18,293,51,32,27

   PUSHBUTTON     "%",IDC_BUTTON19,261,80,63,28

 

//列表框

   LISTBOX        IDC_LIST1,8,0,316,49,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL| WS_TABSTOP

  

//代表Clear按钮(定义,位置,大小)

   PUSHBUTTON     "Clear",IDC_BUTTON20,262,108,62,27

END

 

// DESIGNINFO

//dialog的风格

#ifdef APSTUDIO_INVOKED

GUIDELINES DESIGNINFO

BEGIN

   IDD_ABOUT, DIALOG

   BEGIN

        LEFTMARGIN, 7

        RIGHTMARGIN, 332

        TOPMARGIN, 7

        BOTTOMMARGIN, 175

   END

END

#endif    // APSTUDIO_INVOKED

 

3.Win.cpp文件:

#include <windows.h>

#include "resource.h"      //包含资源文件

 

char buf1[20];      //类外定义

//将double转换成string

string DoubleToString(double d){

    stringstr;

    stringstreamss;

    ss<< d;

    ss>> str;

    returnstr;

}

char buf[100];      //类外定义

int i = 1;      //类外定义

核心部分为(dialog的实现):

BOOL CALLBACK AboutDlgProc(HWND hwnd,UINT Message, WPARAM wParam, LPARAM lParam)

{

    buf[0]='#';      //以#开始

    switch(Message)      //接收消息

    {

    caseWM_INITDIALOG:

        return TRUE;

    caseWM_COMMAND:

        switch (LOWORD(wParam))

        {

//当点击BUTTON1(1)的时候:

        case IDC_BUTTON1:{

//清空,相当于刷新输出到界面

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '1';

            buf[++i]= '\0';

//显示

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);      }

            break;

......

//当点击BUTTON12(=)时,要执行c++计算器的计算工作,在背后执行,不再界面显示

        case IDC_BUTTON12:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '=';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

            CalculatorCalcul;      //定义类对象

           Calcul.Cal(buf);      //使用类函数成员

            stringstr1 = DoubleToString(Calcul.a);

//将string转换成char类型的数组(buf1[]用于输出)

            for(inti=0;i<str1.size();i++){

                buf1[i]=str1[i];

            }

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf1);

        }

            break;

//clear按钮,清空buf[],重新开始一次计算,但不退出当前界面

        case IDC_BUTTON20:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            i=1;

            for(inti=1;buf[i]!='\0';i++){

                buf[i]='\0';

            }

        }

            break;

 

四.测试:

1.菜单选择界面(START开始):

 

2.计算器主界面:

 

3.一个复杂的运算,输出结果:


4.使用clear,清空后继续(可以任意多次):



5.用cancel,退出当前界面:


五.结论:

通过本次的api可视化开发,让我初步了解了api编程的基本步骤和windows编程,我花了很长时间才弄懂怎么添加一些东西,怎么显示一些东西,怎样让它做一些事情,刚开始的时候很困惑。

我认为这个程序的优点在于比较易于操作,让人比较容易看的懂,基本按照标准的方法来做,如果要修改某一部分的话,从源代码中很容易自己修改,另外此程序实现了连续计算,而不用退出重来;

在缺点方面,一是主界面没有个性化,按钮什么的不是很整齐,手工调整的时候没有对齐,我会在.rc中直接修改将其改正过来;二是以前的计算器程序设计的还是不太好,在整合到可视化的时候还要对部分进行修改与调整才能匹配恰当,我课后会再将程序进行改进,以便可以方便的整合到api中去。

这次的收获很大,也让我对可视化产生了极大的兴趣,有技术又有用,我相信我会在这条路上走得更远。

 

六.源代码:

#ifndef STACK_H

#define STACK_H

 

#include<cassert>

#include<iostream>

using namespace std;

 

template<typename T>classStack;//类声明

 

template<typename T>class Node{

private:

    Tinfo;

    Node<T>*link;

public:

    Node(Tdata = 0, Node<T>*next = NULL){

        info = data;

        link = next;

    }

    friendclass Stack<T>;

};

 

//链栈类模板,无头结点链表

template<typename T>classStack{

private:

    Node<T>*top;//栈顶指针

public:

    Stack(){top = NULL; }

    ~Stack();

    voidPush(const T&data);//压栈

    TPop();//弹出

    TGetTop();//取栈顶元素

    voidMakeEmpty();//清空栈

    boolIsEmpty(){ return top == NULL; }

};

 

template<typename T>Stack<T>::~Stack(){MakeEmpty(); }

 

template<typename T>voidStack<T>::Push(const T&data){

    top= new Node<T>(data, top);

}

 

template<typename T>voidStack<T>::MakeEmpty(){

    Node<T>*temp;

    while(top != NULL){

        temp = top;

        top = top->link;

        delete temp;

    }

}

 

template<typename T>TStack<T>::Pop(){

    assert(!IsEmpty());

    Node<T>*temp= top;

    Tdata = temp->info;

    top= top->link;//丢弃栈顶结点

    deletetemp;//释放栈顶结点

    returndata;//返回栈顶数据

}

 

template<typename T>TStack<T>::GetTop(){

    assert(!IsEmpty());

    returntop->info;

}

#endif

//保存在Stack.h

 

#ifndef CALCULATOR_H

#define CALCULATOR_H

 

#include"Stack.h"

#include<iostream>

#include<string>

 

using namespace std;

 

class Calculator{

private:

    Stack<double>Nstack;

    Stack<char>Ostack;

public:

    doublea;

    Calculator():a(0){};

    ~Calculator(){};

    voidClear();

    voidCompute(char Opr);

    voidGetTwoNumDouble(double &Num1,double &Num2);

    voidGetTwoNumInt(int &Num1,int &Num2);

    voidCal(string);//计算器运算程序

};

 

#endif

//保存在Calculator.h

 

//{{NO_DEPENDENCIES}}

// Microsoft Visual C++ 生成的包含文件。

// 供 Resource.rc使用

//

#define IDR_MYMENU                      101

#define IDD_START                       102

#define IDC_BUTTON1                     1000

#define IDC_BUTTON2                     1001

#define IDC_BUTTON3                     1002

#define IDC_BUTTON4                     1003

#define IDC_BUTTON5                     1004

#define IDC_BUTTON6                     1005

#define IDC_BUTTON7                     1006

#define IDC_BUTTON8                     1007

#define IDC_BUTTON9                     1008

#define IDC_BUTTON10                    1009

#define IDC_BUTTON11                    1010

#define IDC_BUTTON12                    1011

#define IDC_BUTTON13                    1012

#define IDC_BUTTON14                    1013

#define IDC_BUTTON15                    1014

#define IDC_BUTTON16                    1015

#define IDC_BUTTON17                    1016

#define IDC_BUTTON18                    1017

#define IDC_LIST1                       1018

#define IDC_BUTTON19                    1019

#define IDC_BUTTON20                    1020

#define ID_FILE_EXIT                    40001

#define ID_START_START                  40002

 

// Next default values for newobjects

//

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE        103

#define _APS_NEXT_COMMAND_VALUE         40003

#define _APS_NEXT_CONTROL_VALUE         1021

#define _APS_NEXT_SYMED_VALUE           101

#endif

#endif

//保存在resource.h

 

// Microsoft Visual C++ generatedresource script.

//

#include "resource.h"

 

#define APSTUDIO_READONLY_SYMBOLS

/

//

// Generated from the TEXTINCLUDE 2resource.

//

#ifndef __BORLANDC__

#include "winres.h"

#endif

 

/

#undef APSTUDIO_READONLY_SYMBOLS

 

/

// 英语(美国) resources

 

#if !defined(AFX_RESOURCE_DLL) ||defined(AFX_TARG_ENU)

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

 

#ifdef APSTUDIO_INVOKED

/

//

// TEXTINCLUDE

//

 

1 TEXTINCLUDE

BEGIN

   "resource.h\0"

END

 

2 TEXTINCLUDE

BEGIN

   "#ifndef __BORLANDC__\r\n"

   "#include ""winres.h""\r\n"

   "#endif\r\n"

   "\0"

END

 

3 TEXTINCLUDE

BEGIN

   "\r\n"

   "\0"

END

 

#endif    // APSTUDIO_INVOKED

 

 

/

//

// Menu

//

 

IDR_MYMENU MENU

BEGIN

   POPUP "&File"

   BEGIN

        MENUITEM "E&xit",                       ID_FILE_EXIT

   END

   POPUP "&START"

   BEGIN

        MENUITEM"&START...",                  ID_START_START

   END

END

 

 

/

//

// Dialog

//

 

IDD_START DIALOGEX 0, 0, 339, 182

STYLE DS_SETFONT | DS_MODALFRAME |WS_POPUP | WS_CAPTION | WS_SYSMENU

CAPTION "My Calculator"

FONT 8, "MS Sans Serif", 0,0, 0x1

BEGIN

   PUSHBUTTON     "Cancel",IDCANCEL,261,135,63,28

   PUSHBUTTON     "1",IDC_BUTTON1,7,47,50,39

   PUSHBUTTON     "2",IDC_BUTTON2,7,84,50,39

   PUSHBUTTON     "3",IDC_BUTTON3,7,122,50,43

   PUSHBUTTON     "4",IDC_BUTTON4,57,48,50,37

   PUSHBUTTON     "5",IDC_BUTTON5,57,86,50,36

   PUSHBUTTON      "6",IDC_BUTTON6,58,123,50,42

   PUSHBUTTON     "7",IDC_BUTTON7,108,49,50,35

   PUSHBUTTON     "8",IDC_BUTTON8,108,85,50,37

   PUSHBUTTON     "9",IDC_BUTTON9,108,124,50,41

   PUSHBUTTON     "0",IDC_BUTTON10,159,49,50,35

   PUSHBUTTON     ".",IDC_BUTTON11,159,86,50,38

   PUSHBUTTON     "=",IDC_BUTTON12,159,124,50,41

   PUSHBUTTON     "+",IDC_BUTTON13,210,49,50,30

   PUSHBUTTON     "-",IDC_BUTTON14,210,79,50,28

   PUSHBUTTON     "*",IDC_BUTTON15,210,108,50,26

   PUSHBUTTON     "/",IDC_BUTTON16,209,135,50,29

   PUSHBUTTON     "(",IDC_BUTTON17,260,50,32,28

   PUSHBUTTON     ")",IDC_BUTTON18,293,51,32,27

   LISTBOX        IDC_LIST1,8,0,316,49,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL| WS_TABSTOP

   PUSHBUTTON     "%",IDC_BUTTON19,261,80,63,28

   PUSHBUTTON     "Clear",IDC_BUTTON20,262,108,62,27

END

 

 

/

//

// DESIGNINFO

//

 

#ifdef APSTU// Microsoft Visual C++generated resource script.

//

#include "resource.h"

 

#define APSTUDIO_READONLY_SYMBOLS

/

//

// Generated from the TEXTINCLUDE 2resource.

//

#ifndef __BORLANDC__

#include "winres.h"

#endif

 

/

#undef APSTUDIO_READONLY_SYMBOLS

 

/

// 英语(美国) resources

 

#if !defined(AFX_RESOURCE_DLL) ||defined(AFX_TARG_ENU)

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

 

#ifdef APSTUDIO_INVOKED

/

//

// TEXTINCLUDE

//

 

1 TEXTINCLUDE

BEGIN

   "resource.h\0"

END

 

2 TEXTINCLUDE

BEGIN

   "#ifndef __BORLANDC__\r\n"

   "#include ""winres.h""\r\n"

   "#endif\r\n"

   "\0"

END

 

3 TEXTINCLUDE

BEGIN

   "\r\n"

   "\0"

END

 

#endif    // APSTUDIO_INVOKED

 

 

/

//

// Menu

//

 

IDR_MYMENU MENU

BEGIN

   POPUP "&File"

   BEGIN

        MENUITEM "E&xit",                       ID_FILE_EXIT

   END

   POPUP "&START"

   BEGIN

        MENUITEM"&START...",                  ID_START_START

   END

END

 

 

/

//

// Dialog

//

 

IDD_START DIALOGEX 0, 0, 339, 182

STYLE DS_SETFONT | DS_MODALFRAME |WS_POPUP | WS_CAPTION | WS_SYSMENU

CAPTION "My Calculator"

FONT 10, "MS Sans Serif",0, 0, 0x0

BEGIN

   PUSHBUTTON     "Cancel",IDCANCEL,261,135,63,28

   PUSHBUTTON     "1",IDC_BUTTON1,7,47,50,39

   PUSHBUTTON     "2",IDC_BUTTON2,7,84,50,39

   PUSHBUTTON     "3",IDC_BUTTON3,7,122,50,43

   PUSHBUTTON     "4",IDC_BUTTON4,57,48,50,37

   PUSHBUTTON     "5",IDC_BUTTON5,57,86,50,36

   PUSHBUTTON      "6",IDC_BUTTON6,58,123,50,42

   PUSHBUTTON     "7",IDC_BUTTON7,108,49,50,35

   PUSHBUTTON     "8",IDC_BUTTON8,108,85,50,37

   PUSHBUTTON     "9",IDC_BUTTON9,108,124,50,41

   PUSHBUTTON     "0",IDC_BUTTON10,159,49,50,35

   PUSHBUTTON     ".",IDC_BUTTON11,159,86,50,38

   PUSHBUTTON     "=",IDC_BUTTON12,159,124,50,41

   PUSHBUTTON     "+",IDC_BUTTON13,210,49,50,30

   PUSHBUTTON     "-",IDC_BUTTON14,210,79,50,28

   PUSHBUTTON     "*",IDC_BUTTON15,210,108,50,26

   PUSHBUTTON     "/",IDC_BUTTON16,209,135,50,29

   PUSHBUTTON     "(",IDC_BUTTON17,260,50,32,28

   PUSHBUTTON     ")",IDC_BUTTON18,293,51,32,27

    LISTBOX         IDC_LIST1, 8, 0, 316, 49,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP

   PUSHBUTTON     "%",IDC_BUTTON19,261,80,63,28

   PUSHBUTTON     "Clear",IDC_BUTTON20,262,108,62,27

END

 

 

/

//

// DESIGNINFO

//

 

#ifdef APSTUDIO_INVOKED

GUIDELINES DESIGNINFO

BEGIN

   IDD_ABOUT, DIALOG

   BEGIN

        LEFTMARGIN, 7

        RIGHTMARGIN, 332

        TOPMARGIN, 7

        BOTTOMMARGIN, 175

   END

END

#endif    // APSTUDIO_INVOKED

 

#endif    // 英语(美国) resources

/

 

 

 

#ifndef APSTUDIO_INVOKED

/

//

// Generated from the TEXTINCLUDE 3resource.

//

 

 

/

#endif    // not APSTUDIO_INVOKED

 

NVOKED

GUIDELINES DESIGNINFO

BEGIN

   IDD_START, DIALOG

   BEGIN

   END

END

#endif    // APSTUDIO_INVOKED

 

#endif    // 英语(美国) resources

/

 

 

 

#ifndef APSTUDIO_INVOKED

/

//

// Generated from the TEXTINCLUDE 3resource.

//

 

 

/

#endif    // not APSTUDIO_INVOKED

//保存在Resource.rc

 

#include<iostream>

#include<string>

#include<cmath>

#include<cstdlib>

#include <sstream>

#include"Calculator.h"

using namespace std;

 

void Calculator::Clear(){

    Nstack.MakeEmpty();

    Ostack.MakeEmpty();

}

 

voidCalculator::GetTwoNumDouble(double & Num1,double & Num2){

    Num1=Nstack.Pop();

    Num2=Nstack.Pop();

}

 

void Calculator::GetTwoNumInt(int&Num1,int &Num2){

    Num1=Nstack.Pop();

    Num2=Nstack.Pop();

}

 

void Calculator::Compute(char Opr){

    charOpr1=Opr;

    doubleNum1,Num2;

    intNum3,Num4;

    if(Opr!='='&&Opr!='%')GetTwoNumDouble(Num1,Num2);

    elseif(Opr!='=') GetTwoNumInt(Num3,Num4);

    switch(Opr){

    case'+':Nstack.Push(Num2+Num1);break;

    case'-':Nstack.Push(Num2-Num1);break;

    case'*':Nstack.Push(Num2*Num1);break;

    case'/':Nstack.Push(Num2/Num1);break;

    case'%':Nstack.Push(Num4%Num3);break;

    case'=':a=Nstack.Pop();break;

    }

}

void Calculator::Cal(string str){

    boolb1=true;

    boolb2=true;

    charch2,str2[50];

    stringstr1=str;

    intk,j=-1;

    Nstack.Push(0);

    if(str1[0]=='#'){

        for(k=1;k<=(int)str.length()-1;k++){

        if((str1[k]>='0'&&str1[k]<='9')||str1[k]=='.'){

            j++;

            str2[j]=str1[k];

        }

        else{

                if(j>=0){

                    str2[j+1]='\0';

                    Nstack.Push(atof(str2));

                    j=-1;

                }

            switch(str1[k]){

                case'+':case'-':

                    while(!Ostack.IsEmpty()&&Ostack.GetTop()!='('){//*************注意

                        ch2=Ostack.Pop();

                        Compute(ch2);

                    }

                    Ostack.Push(str1[k]);

                    break;

                case'*':case'/':case'%':

                    while(!Ostack.IsEmpty()&&b1&&Ostack.GetTop()!='('){

                        ch2=Ostack.Pop();

                        if(ch2=='*'||ch2=='/'||ch2=='%')

                            Compute(ch2);

                        else{

                            Ostack.Push(ch2);

                            b1=false;

                        }

                    }

                    Ostack.Push(str1[k]);

                    b1=true;

                    break;

                case'=':

                    while(!Ostack.IsEmpty()){

                        ch2=Ostack.Pop();

                        Compute(ch2);

                    }

                    Compute(str1[k]);

                    break;

                case'(':Ostack.Push(str1[k]);break;

                case')':

                    charstr3=Ostack.GetTop();

                    while(str3!='('){

                        str3=Ostack.Pop();

                        Compute(str3);

                        str3=Ostack.GetTop();

                    }

                    Ostack.Pop();

                    break;

            }

            }

    }

    }

    elsecout<<"输入格式错误!"<<endl;

}

//保存在Calculator.cpp

 

#include<iostream>

#include<string>

#include <sstream>

#include"Calculator.h"

using namespace std;

 

#include <windows.h>

#include "resource.h"

 

char buf1[20];

 

string DoubleToString(double d){

    stringstr;

    stringstreamss;

    ss<< d;

    ss>> str;

    returnstr;

}

 

//主函数,测试,下面是api

const char g_szClassName[] ="myWindowClass";

 

char buf[100];

int i = 1;

 

BOOL CALLBACK AboutDlgProc(HWND hwnd,UINT Message, WPARAM wParam, LPARAM lParam)

{

    buf[0]='#';

    switch(Message)

    {

    caseWM_INITDIALOG:

        return TRUE;

    caseWM_COMMAND:

        switch (LOWORD(wParam))

        {

        case IDC_BUTTON1:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '1';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON2:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '2';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON3:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '3';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON4:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '4';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON5:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '5';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON6:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '6';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON7:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '7';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON8:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '8';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON9:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '9';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON10:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '0';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON11:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '.';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON12:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '=';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

            CalculatorCalcul;

           Calcul.Cal(buf);

            stringstr1 = DoubleToString(Calcul.a);

            for(inti=0;i<str1.size();i++){

                buf1[i]=str1[i];

            }

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf1);

        }

            break;

        case IDC_BUTTON13:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '+';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON14:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '-';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON15:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '*';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON16:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '/';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON17:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '(';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON18:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= ')';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON19:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            buf[i]= '%';

            buf[++i]= '\0';

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);

        }

            break;

        case IDC_BUTTON20:{

            SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);

            i=1;

            for(inti=1;buf[i]!='\0';i++){

                buf[i]='\0';

            }

        }

            break;

        case IDCANCEL:

            EndDialog(hwnd,IDCANCEL);

            break;

        }

        break;

    default:

        return FALSE;

    }

    returnTRUE;

}

 

LRESULT CALLBACK WndProc(HWND hwnd,UINT Message, WPARAM wParam, LPARAM lParam){

    switch(Message){

    caseWM_COMMAND:

        switch (LOWORD(wParam)){

        case ID_FILE_EXIT:

            PostMessage(hwnd,WM_CLOSE, 0, 0);

            break;

        case ID_START_START:{

            intret = DialogBox(GetModuleHandle(NULL),

                MAKEINTRESOURCE(IDD_START), hwnd,AboutDlgProc);

            if(ret == IDCANCEL){

                MessageBox(hwnd, "Dialog exited withIDCANCEL.", "Notice",

                        MB_OK | MB_ICONINFORMATION);

                }

            elseif (ret == -1){

                MessageBox(hwnd, "Dialog failed!","Error",

                        MB_OK | MB_ICONINFORMATION);

                }

        }

            break;

        }

        break;

    caseWM_CLOSE:

        DestroyWindow(hwnd);

        break;

    caseWM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hwnd, Message, wParam,lParam);

    }

    return0;

}

 

 

int WINAPI WinMain(HINSTANCEhInstance, HINSTANCE hPrevInstance,

    LPSTRlpCmdLine, int nCmdShow)

{

    WNDCLASSEXwc;

    HWNDhwnd;

    MSGMsg;

 

    wc.cbSize= sizeof(WNDCLASSEX);

    wc.style= 0;

    wc.lpfnWndProc= WndProc;

    wc.cbClsExtra= 0;

    wc.cbWndExtra= 0;

    wc.hInstance= hInstance;

    wc.hIcon= LoadIcon(NULL, IDI_APPLICATION);

    wc.hCursor= LoadCursor(NULL, IDC_ARROW);

    wc.hbrBackground= (HBRUSH)(COLOR_WINDOW + 1);

    wc.lpszMenuName= MAKEINTRESOURCE(IDR_MYMENU);

    wc.lpszClassName= g_szClassName;

    wc.hIconSm= LoadIcon(NULL, IDI_APPLICATION);

 

    if(!RegisterClassEx(&wc))

    {

        MessageBox(NULL, "Window RegistrationFailed!", "Error!",

            MB_ICONEXCLAMATION| MB_OK);

        return 0;

    }

 

    hwnd= CreateWindowEx(

        WS_EX_CLIENTEDGE,

        g_szClassName,

        "My First API",

        WS_OVERLAPPEDWINDOW,

        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,

        NULL, NULL, hInstance, NULL);

 

    if(hwnd == NULL)

    {

        MessageBox(NULL, "Window CreationFailed!", "Error!",

            MB_ICONEXCLAMATION| MB_OK);

        return 0;

    }

 

    ShowWindow(hwnd,nCmdShow);

    UpdateWindow(hwnd);

 

    while(GetMessage(&Msg, NULL, 0, 0) > 0)

    {

        TranslateMessage(&Msg);

        DispatchMessage(&Msg);

    }

    returnMsg.wParam;

}

//保存在Win.cpp



  • 29
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C++可视化计算器是一种使用C++编程语言开发的计算器软件,可以通过图形界面来实现计算功能。这种计算器软件通常具有美观、易用、可扩展性强等优点,并且可以广泛应用于科学、工程、经济等领域。 实现一个C++可视化计算器需要具备一定的编程能力和计算机科学知识。首先,需要掌握C++基础语法知识及其面向对象的编程思想,如类、成员函数、继承等。其次,需要掌握相关图形界面开发框架的使用,如Qt、MFC、WXWidgets等,以便轻松地完成用户界面的设计和实现。另外,还需要掌握算法和数学知识,以实现计算器所需要的各种功能,如加减乘除、开方、三角函数、指数函数等。 C++可视化计算器的实现可以分为两部分,一部分是用户界面的设计和实现,另一部分是计算功能的实现。对于用户界面的设计和实现,开发者可以借助各种图形界面开发框架进行快速开发,通过设计按钮、文本框、菜单等控件,实现计算器的各个功能界面。计算器的另一部分功能实现则需要通过C++语言的算法和数学库,来设计并实现各种数学计算式和运算符的计算过程。 总之,C++可视化计算器是一种非常实用的软件开发工具,可以为人们提供一个快速、精准的数学计算平台。通过了解C++编程语言及其相关知识,我们可以实现高效的计算器应用程序,提升人们的生产、学习和研究效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值