精华内容
下载资源
问答
  • QT实现简单计算器功能

    千次阅读 2019-05-04 21:31:39
    效果图: 1.定义一个类名expr,基类选择dialog,也可以选择默认的类名与基类 单击下一步,完成。就完成了项目的创建。 2.在该项目文件下的界面...第一种:使用connect(界面中的哪个按钮,发出了怎样的信号,谁,执...

    效果图:
    在这里插入图片描述
    1.定义一个类名expr,基类选择dialog,也可以选择默认的类名与基类
    在这里插入图片描述
    单击下一步,完成。就完成了项目的创建。
    2.在该项目文件下的界面文件中双击.ui文件,到界面布局
    在这里插入图片描述
    3.根据你所需要实现的功能添加的按钮并进行相应的布局
    在这里插入图片描述
    4.布局完成后,就是实现将相应按钮的功能,添加相应的槽函数
    添加槽函数有两种方式:

    第一种:使用connect(界面中的哪个按钮,发出了怎样的信号,谁,执行哪个函数)
    第二种:直接在按钮上右击,转到槽,选择相应的信号之后确定,槽函数就绑好了。

    5.代码段
    在头文件中添加一个自定义的头文件floatnumber.h
    在这里插入图片描述
    代码内容:

    #ifndef FLOATNUMBER_H
    #define FLOATNUMBER_H
    
    #endif
    #include <iostream>
    using namespace std;
    
    struct node{
        int flag;
        union{
            double a;
            char  op;
        }num;
    };
    
    

    expr.cpp中的代码:

    #include "expr.h"
    #include "ui_expr.h"
    #include "floatnumber.h"
    #include <QPushButton>
    #include <QTextEdit>
    #include <QString>
    #include <QDialog>
    #include <QDebug>
    
    typedef struct node _tNode;
    #define NUM_OF_NUMBER 20
    #define KIND_NUMBER  0
    #define KIND_OPERATOR 1
    
    expr::expr(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::expr)
    {
        ui->setupUi(this);
        this->tmp = "";
    }
    
    expr::~expr()
    {
        delete ui;
    }
    
    void expr::on_btn_0_clicked()
    {
        if(this->tmp != " ")
        {
            this->tmp += this->ui->btn_0->text();
            this->ui->lbl_display->setText(this->tmp);
        }
        }
    
    void expr::on_btn_1_clicked()
    {
         this->tmp += this->ui->btn_1->text();
          this->ui->lbl_display->setText(this->tmp);
    }
    
    void expr::on_btn_2_clicked()
    {
         this->tmp += this->ui->btn_2->text();
        this->ui->lbl_display->setText(this->tmp);
    }
    
    void expr::on_btn_3_clicked()
    {
         this->tmp += this->ui->btn_3->text();
         this->ui->lbl_display->setText(this->tmp);
    }
    
    void expr::on_btn_4_clicked()
    {
        this->tmp += this->ui->btn_4->text();
        this->ui->lbl_display->setText(this->tmp);
    }
    
    
    void expr::on_btn_5_clicked()
    {
        this->tmp += this->ui->btn_5->text();
        this->ui->lbl_display->setText(this->tmp);
    }
    
    void expr::on_btn_6_clicked()
    {
        this->tmp += this->ui->btn_6->text();
        this->ui->lbl_display->setText(this->tmp);
    }
    
    void expr::on_btn_7_clicked()
    {
        this->tmp += this->ui->btn_7->text();
        this->ui->lbl_display->setText(this->tmp);
    }
    
    void expr::on_btn_8_clicked()
    {
        this->tmp += this->ui->btn_8->text();
        this->ui->lbl_display->setText(this->tmp);
    }
    
    void expr::on_btn_9_clicked()
    {
        this->tmp += this->ui->btn_9->text();
        this->ui->lbl_display->setText(this->tmp);
    }
    
    void expr::on_btn_plus_clicked()
    {
        if(tmp != " ")
        {
            this->tmp += this->ui->btn_plus->text();
            this->ui->lbl_display->setText(this->tmp);
        }
      }
    
    void expr::on_btn_sub_clicked()
    {
        if(tmp != " ")
        {
            this->tmp += this->ui->btn_sub->text();
            this->ui->lbl_display->setText(this->tmp);
           }
    }
    
    void expr::on_btn_mul_clicked()
    {
        if(tmp != " ")
        {
            this->tmp += this->ui->btn_mul->text();
            this->ui->lbl_display->setText(this->tmp);
        }
    }
    
    void expr::on_btn_div_clicked()
    {
        if(tmp != " ")
        {
            this->tmp += this->ui->btn_div->text();
            this->ui->lbl_display->setText(this->tmp);
    
        }
    }
    
    void expr::on_btn_equ_clicked()
    {
        if(tmp != " ")
        {
               expr::calculate();
             this->ui->lbl_display->setText(this->tmp);
        }
    
    }
    
    void expr::on_btn_point_clicked()
    {
        if(tmp != " ")
        {
            this->tmp += this->ui->btn_point->text();
            this->ui->lbl_display->setText(this->tmp);
        }
    }
    
    void expr::on_btn_left_clicked()
    {
        if(tmp != " ")
        {
            this->tmp += this->ui->btn_left->text();
            this->ui->lbl_display->setText(this->tmp);
        }
    }
    
    void expr::on_btn_right_clicked()
    {
        if(tmp != " ")
        {
            this->tmp += this->ui->btn_right->text();
            this->ui->lbl_display->setText(this->tmp);
          }
    }
    
    void expr::on_btn_delet_clicked()
    {
        if(tmp != " ")
        {
            tmp = tmp.left(tmp.length()-1);
            this->ui->lbl_display->setText(this->tmp);
        }
    }
    
    void expr::on_btn_clear_clicked()
    {
        if(tmp != " ")
        {
            tmp.clear();
            this->ui->lbl_display->clear();
            this->ui->lbl_display->setText("0");
        }
    }
    
    
    
    void expr::calculate()
    {
        _tNode Node[NUM_OF_NUMBER];
        double num = 0;
        int   i = 0;                         //字符串的位置
        int num_of_point = 0;      //小数点后数字的个数
        int num_or_op = 0;         //浮点数和操作符个数
        int isfloat = 0;                 //小数点
        int len = tmp.length();   //字符串长度
    
        while(i < len)
        {
            if(tmp[i] >= '0' && tmp[i] <= '9')
            {
                if(!isfloat)   //整数部分
                {
                    num = num*10 + (tmp[i].toLatin1()-'0');   //tmp[i].toLatin1()将字符i转换为ASCII码
                    ++i;
                }
                else   //小数部分
                {
                    double per = 1;
                    for(int k = 0;k < num_of_point;k++)
                        per *= 0.1;
                    num +=  (tmp[i].toLatin1()-'0') * per;
                    num_of_point++;
                    ++i;
                }
            }
            else if(tmp[i] == '.')   //读到小数点
            {
                isfloat = 1;
                num_of_point = 1;
               ++i;
            }
            else  //读到操作符
            {
                if(num) //读到操作符后说明一个完整的数字输入完毕,要将数字、小数点等清零
                {
                    Node[num_or_op].flag = KIND_NUMBER;
                    Node[num_or_op].num.a = num;
                    num = 0;
                    ++num_or_op;
                    isfloat= 0;
                    num_of_point = 0;
                }
                Node[num_or_op].flag = KIND_OPERATOR;
                Node[num_or_op].num.op = tmp[i].toLatin1();
                ++num_or_op;
                ++i;
            }
        }
        if(num)   //最后一个操作数
        {
            Node[num_or_op].flag = KIND_NUMBER;
            Node[num_or_op].num.a = num;
            ++num_or_op;
            num = 0;
        }
        
        //将算数表达式改为后缀表达式
        QStack<_tNode>pNode;  //构建一个_tNode类型的栈pNode,是一个保存操作符栈
        _tNode _Node[NUM_OF_NUMBER];
        int j = 0;
        for(int m = 0;m< num_or_op;)
        {
            if(Node[m].flag)  //符号入栈
            {
                if(pNode.isEmpty())
                {
                    pNode.push(Node[m++]);
    
                }
                else
                {
                    _tNode tem = pNode.top();
                    int ret = process(tem.num.op,Node[m].num.op);
                    switch(ret)
                    {
                        case -1:
                            pNode.push(Node[m++]);
                            break;
                         case 1:
                              _Node[j++] = pNode.top();
                              pNode.pop();
                              break;
                           default:
                                 pNode.pop();
                                m++;
                                break;
                }
                }
            }
        else
        {
            _Node[j++] = Node[m++];
        }
        }
    while(!pNode.isEmpty()) //弹出栈中剩余的元素
    {
        _tNode tem = pNode.top();
        if(tem.num.op != '(' &&tem.num.op != ')')
            _Node[j++] = tem;
         pNode.pop();
    }
    
    QStack<double> last;  //构建一个数据栈
    double d1,d2;
    for(int n = 0;n < j;n++)
    {
        if(_Node[n].flag) //遇到符号弹出数字进行计算
        {
            d2 = last.top();
            last.pop();
            d1 = last.top();
            last.pop();
            switch(_Node[n].num.op)
            {
                case '+':
                       d1 += d2;
                        break;
            case '-':
                d1 -= d2;
                break;
            case '*':
                d1 *= d2;
                break;
            case '/':
                d1 /= d2;
                break;
            default:
                break;
            }
            last.push(d1);
        }
        else
        {
            last.push(_Node[n].num.a);
        }
    }
    qDebug() << d1;
    tmp += '=';
    tmp += QString::number(d1);
    }
    
    int expr::process(char a,char b)  //优先级比较
    {
        char aim[7][8] = {{ ">><<<>>" },{ ">><<<>>" },{ ">>>><>>" },{ ">>>><>>" },{ "<<<<<=1" },{ ">>>>1>>" },{ "<<<<<1=" }};
        char sta[7] = { '+','-','*','/','(',')','#' };
        char result;
        int i,pa,pb;
        for (i = 0; i<6; i++)
              {
                 if (a == sta[i])
                 {
                     pa = i;
                 }
                 if (b == sta[i])
                 {
                     pb = i;
                 }
              }
        result = aim[pa][pb];
        if(result == '>')return 1;
        else if(result == '<')return -1;
        else return 0;
      }
    
    
    

    expr.h中的代码:

    #ifndef EXPR_H
    #define EXPR_H
    
    #include <QDialog>
    #include <QStack>
    
    namespace Ui {
    class expr;
    }
    
    class expr : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit expr(QWidget *parent = 0);
        ~expr();
    
        void calculate();
        int  process(char a,char b);
    
    private slots:
        void on_btn_0_clicked();
    
        void on_btn_1_clicked();
    
        void on_btn_2_clicked();
    
        void on_btn_3_clicked();
    
        void on_btn_4_clicked();
    
        void on_btn_5_clicked();
    
        void on_btn_6_clicked();
    
        void on_btn_7_clicked();
    
        void on_btn_8_clicked();
    
        void on_btn_9_clicked();
    
        void on_btn_plus_clicked();
    
        void on_btn_sub_clicked();
    
        void on_btn_mul_clicked();
    
        void on_btn_div_clicked();
    
        void on_btn_equ_clicked();
    
        void on_btn_point_clicked();
    
        void on_btn_left_clicked();
    
        void on_btn_right_clicked();
    
        void on_btn_delet_clicked();
    
        void on_btn_clear_clicked();
    
    private:
        QString tmp;
        Ui::expr *ui;
    
    };
    
    #endif // EXPR_H
    
    

    注:算数表达式要考虑到符号的优先级问题,所以要运用到堆栈
    要将QString类型的变量初始化为空时双引号之间不能有空格,否则在计算时强制退出,存在内存泄漏问题,你也可以将QString改为char类型也可以避免这个错误。

    展开全文
  • 怎样才能做到按顺序储存到对列呢?首先,我设计一个for循环,并在其中添加判断初步实现将数字与字符分开。其次,我们要考虑如何将数字整个储存如对列,于是我在判断字符后添加一个判断,来实现...


    Github上的代码提交(Calculator文件)

    1.解题思路

    Scan类

    题目要求在这个类中写一个函数,用来处理输入的字符串(input)。我的初步思路是将数字和符号分开再按顺序储存到队列中。怎样才能做到按顺序储存到对列呢?首先,我设计一个for循环,并在其中添加判断初步实现将数字与字符分开。其次,我们要考虑如何将数字整个储存如对列,于是我在判断字符后添加一个判断,来实现如该字符前有数字,将数字储存入对列并清除数字储存变量num和数字位数计量变量count。再次,在for循环外添加一个if判断,若输入字符串input的最后是数字,将这些数字也储存入对列,到这里将数字和符号分开再按顺序储存到队列中已经基本完成。最后,我们还要对程序添加报错的功能,也就是判断为数字时给数字计算位数,若超过十位(包括小数点位),则直接报错。在这里我们要记得一个细节,就是我们需要将队列清空,防止在之后执行Print时将队列中的信息输出。

    Print类

    相对于Scan类,Print类的书写就相对简单一些。我写了一个for循环(循环次数为)来按顺序输出对列,每次都输出对列的第一个,输出后再删除第一个,于是到下一次执行时对列中的第二个就变成了第一个,这样就实现了按顺序输出。

    2.发现错误与调试

    (1)发现输入字符串后只能输出前一半。原因是在Print类中for循环使用了que_input.size(),而随着循环的进行,que_input.size()的值在不断缩小。于是我另外定义了一个变量使其等于que_input.size()并用于for循环中,如下:

    void print(queue<string>que_input) //输出queue 
    {
        int count2=que_input.size(); //设置一个变量等于队列长度 
        for(int k=0; k<count2; k++) 
        {
            cout<<que_input.front()<<endl;
            que_input.pop();
        }
    }

    (2)发现当输入的input中含有超过10位的数字时,输出结果除了报错外还输出了该数字之前的数字与字符。原因是程序缺少一个当出现错误时将对列清空以防止输出的语句。于是进行了如下修改:

    if(temp==1) //若出错清空queue防止输出 
    {
        int count1=que_input.size();
        for(int j=0; j<count1; j++)
        {
            que_input.pop();
            }
    }
        return que_input;
    }

    (3)我的代码原本是写在一个cpp中,所以在后来的分文件过程中也出现了问题。因为缺少头文件,导致程序编译无法通过

    (4)由于我在Scan.h文件中声明函数时将ToStringQueue()函数用void声明,导致函数的返回值为空,导致主函数que_character=INPUT.ToStringQueue (character);语句在编译时无法通过。后修改为用queue声明

    3.完整代码呈现

    Scan.h

    #ifndef SCAN_H
    #define SCAN_H
    #include<string>
    #include<iostream>
    #include<queue>
    using namespace std;
    
    class Scan
    {
        public:
            queue<string> ToStringQueue(string input);
    
    };

    endif

    Scan.cpp

    #include "Scan.h"
    #include<string>
    #include<iostream>
    #include<queue>
    
    using namespace std;
    
    
    queue<string> Scan::ToStringQueue (string input)
    {    
        queue<string>que_input;
        string num=""; //储存数字 
        string sym=""; //储存符号 
        int count=0; //记录数字位数 
        int i; 
        int temp=0; //记录输入是否出错 
        
        for(i=0; i<input.size(); i++)
        {
            if(input[i] >= '0' && input[i] <= '9' || input[i]=='.') //判断是数字或小数点 
            {
                num+=input[i]; //记录下数字 
                count++;   //记录下数字位数 
                if(count>10)  //若超出十位报错并跳出循环 ,同时记录下错误 
                {
                    cout << "More than ten...Error!" << endl;
                    num="";
                    break;
                    temp=1;
                }
            }
            
            else if(input[i]=='+' || input[i]=='-' || input[i]=='*' || input[i]=='/' || input[i]=='(' || input[i]==')') //判断是符号 
            {
                if(num!="") //判断该符号之前是否为数字 
                {
                    que_input.push(num);  //若之前为数字,将数字输出 
                    num="";    //清空数字储存变量 
                    count=0;  //清空记录数字位数变量 
                }
                sym=input[i]; 
                que_input.push(sym); //将字符push到queue上 
            }
        }
        
        if(num!="") //判断字符串最后一位是不是数字 
            {
                que_input.push(num); 
                num="";
                count=0;
            }
    
        if(temp==1) //若出错清空queue防止输出 
        {
            int count1=que_input.size();
            for(int j=0; j<count1; j++)
            {
                que_input.pop();
            }
        }
        return que_input;
    }

    Print.h

    #ifndef PRINT_H
    #define PRINT_H
    #include<string>
    #include<iostream>
    #include<queue>
    
    using namespace std;
    
    class Print
    {
        public:
            void print(queue<string>que_input);
    
    };
    
    #endif

    Print.cpp

    #include "Print.h"
    #include<string>
    #include<iostream>
    #include<queue>
    
    using namespace std;
    
    void Print::print(queue<string>que_input) //输出queue 
        {
            int count2=que_input.size(); //设置一个变量等于队列长度 
            for(int k=0; k<count2; k++) 
            {
                cout<<que_input.front()<<endl;
                que_input.pop();
            }
        }
    
    >Calculator.cpp
    
    #include "Scan.h"
    #include "Print.h"
    #include<iostream>
    #include<queue>
    #include<string>
    #include<iostream>
    
    using namespace std;
    
    int main()
    {
        string character;
        queue<string>que_character;
        Scan INPUT;
        Print OUTPUT;
        cin>>character;
        que_character=INPUT.ToStringQueue (character);
        OUTPUT.print(que_character);
        return 0;
    }

    4.自我思考

    在做这次作业之前我学习了慕课课程中的起航篇离岗篇还有继承篇,同时看了C++ primer这本书上有关于类部分的一些语句使用。strqueue则是通过上网搜索他们的语句和用法来学习的。虽然在开始编写代码之前做了这些准备工作但是在实际操作中还是遇到了很多的难题,后来通过于同学的讨论才慢慢的有了思路。在编写程序是我常常会犯一些很低级的错误,琢磨半天也没有发现问题出在哪,在之后的学习中我希望能够尽量避免这些错误。

    在完成作业之后,我翻看了其他同学的代码,发现我的程序还有很多不够优化的地方,比如在判断是符号时,不需要一长串或的叠加,还有输出的循环用while也会简便许多。

    发表于 2016-02-27 11:03 Olivia1011 阅读(...) 评论(...) 编辑 收藏
     

    转载于:https://www.cnblogs.com/Olivia1011/p/5222501.html

    展开全文
  • 此计算方法参考1976年6月上海人民出版社《怎样绕变压器》. 13.密闭音箱 该功能可以根据低音喇叭单元的常用参数,计算出适合的密闭箱体体积,和示例箱体外尺寸(如果板厚=0,则计算箱体内容积).其中,箱体共振频率是你...
  • 1.方程式 支持一元二次,一元一次,二元一次方程求值.支持正负数,小数系数输入,分数系数请先自行转换. 2.RC常数 RC时间常数是电路里经常用到的....也可以计算经过t时刻,电容C两端...注:快捷键F12可调用Windows自带计算器.
  • 这个软件提供了测量工具和计算器,直接在扫描后的彩色图片上放置任意元素5.抄完顶层,打开层设置菜单,关闭顶层,在文件菜单中调入底层图片6.依次抄出其它内层7.存出PCB文件,完成抄板多层板的抄板流程怎样的?内层....

    17487884f5992b24070be824b1e3cb51.png

    怎样抄板呢?抄板流程是怎样的?

    抄板比设计难度低得多,抄板,其实就是依葫芦画瓢。

    抄板步骤的简单说明:

    1.扫描电路板图片

    2.运行Quickpcb2005程序

    3.在文件菜单中调入扫描的电路板图片

    4.这个软件提供了测量工具和计算器,直接在扫描后的彩色图片上放置任意元素

    5.抄完顶层,打开层设置菜单,关闭顶层,在文件菜单中调入底层图片

    6.依次抄出其它内层

    7.存出PCB文件,完成抄板

    多层板的抄板流程怎样的?内层的线条是怎样抄出来的?多层板怎样分层?

    多层板的抄板流程其实就是重复抄双面板的过程。您掌握到上面提到的“抄完顶层抄底层”的方法,多层板就很容易了。

    与抄双面板不同的是,多层板多了一个分层的步骤。

    多层板的内层被顶底层覆盖,看不见其中的线路。当我们抄完PCB的顶底层后,一般都是用砂纸打磨的办法磨掉表层显示内层;砂纸就是五金店出售的普通砂纸,一般平铺PCB,然后按住砂纸,在PCB上均匀磨擦。

    丝印与绿油一般一擦就掉,铜线与铜皮就要好好擦几下。一般来说,蓝牙板几分钟就能擦好,内存条大概要十几分钟;当然力气大,花的时间会少一点;力气小花的时间就会多一点。

    磨板是目前分层用得最普遍的方案,也是最经济的了。咱们可以找块废弃的PCB试一下,其实磨板没什么技术难度,完全不用担心会把板子磨穿磨到手指头哦~~

    怎样让扫描的图片不失真呢?分辨率不同,得到的图片尺寸会不会不同?

    为了让扫描后的图片与原板尽量一致,就要让板子尽可能平整地贴合在扫描仪上,以减少光线折射引起的失真。所以PCB板上的器件最好是拆除,把板子平平整整的放到扫描仪的玻璃台上。扫描时有一项重要的参数:分辨率(DPI)。分辨率的单位是:象素/英寸,即每英寸内有多少个象素点,象素点越多,图片越精细;也就是说,分辨率越高,图片越精细。而尺寸是不会随分辨率变的。

    大家可以扫个图试一下,比如一块蓝牙板,用600DPI与2400DPI分别扫描,再调入到Quickpcb 中,我们来量一下两张图的板边尺寸,结果两张图的板边尺寸是一样的,不同的是:当放大屏幕显示时,2400DPI的马赛克比600DPI的少得多,图片清晰得多。

    由于分辨率反映的是图片的精细度,所以分辨率越高,图片数据量也就会越大。

    导入的图片最好是BMP格式的,因为其它格式的图片有压缩率,导入后图片的尺寸会发生变化。怎样在Quickpcb中打开扫描后的彩图?

    展开全文
  • 这一节讲的主要内容是如何为控件添加消息处理函数。  MFC为对话框和控件定义了诸多消息,我们对他们操作时会触发消息,这些消息...一、添加消息处理函数  仍然以前面的计算器程序为例,说明怎样为“计算”按钮添加...

      这一节讲的主要内容是如何为控件添加消息处理函数。
      MFC为对话框和控件定义了诸多消息,我们对他们操作时会触发消息,这些消息最终由消息处理函数处理,比如我们点击按钮时就会产生BN_CLICKED消息,
    修改编辑框内容时会产生EN_CHANGE消息等。一般为了让某种操作达到效果,我们只需要实现某个消息的消息处理函数。
    一、添加消息处理函数
      仍然以前面的计算器程序为例,说明怎样为“计算”按钮添加消息处理函数,添加方法列出4中:
      1、使用Class Wizard添加消息处理函数
      用过VC++6.0的朋友应该对Class Wizard很熟悉了,添加类、消息处理函数等经常会用到它,可以说是一个很核心的功能。但从VS2002开始就见不到Class
    Wizard了,大部分功能都集成到对话框和控件等的属性了,使用很方便。到VS2010,久违的Class Wizard又回来了。

      大家应该记得,“计算”按钮的ID为IDC_CALCULATE_BUTTON。上图中Commands标签下,Object IDs列表中有此ID,因为我们是想实现点击按钮后的消息处理
    函数,所以在Message列表中选择BN_CLIECKED消息,然后点右上方的Add Handler就可以添加BN_CALCULATE_CLICKED消息处理函数OnClickedAddButton了。当然你
    也可以改名,但一般用的默认的就可以。
      2、通过”Add Event Handler...“添加消息处理函数
      在”计算“按钮上点右键,然后在右键菜单中选择菜单项”Add Event Handler...“,弹出”Event Handler Wizard“对话框,如下图:


      可见"Message type"中默认选中的就是BN_CLICKED消息,函数名和所在类都已经自动给出,直接点”Add and Edit“就可以了。
      3、在按钮的属性视图中添加消息处理函数
      上面说过,从VS2002开始就主要从属性视图添加消息处理函数了。我们在”计算“按钮上点击邮件,在右键菜单中选择”Properties“,右侧面板中会显示按钮
    的属性视图。

      我们可以像上图中那样,点属性视图的"Control Events"按钮(类似闪电标志),下面列出了”计算“按钮的所有消息。我们要处理的是BN_ClICKED消息,点其
    右侧空白列表项,会出现一个带下箭头的按钮,再点此按钮会出现"<Add> OnBnClickedAdd"选项,最后选中这个选项会自动添加BN_CLICKED处理函数了。
      4、双击按钮添加消息处理函数
      最直接最简单的方法就是,双击”计算“按钮,MFC会自动为其在CAdditionDlg类中添加BN_CLICKED消息的处理函数OnBnClickedAddButton()。
    二、在消息处理函数中添加自定义功能
      在我们使用任意一种方法添加了消息处理函数以后,都只能得到一个空的OnBnClickedAddButton()函数的函数体,要实现我们想要的功能,还需要在函数体中加
    入自定义功能代码。
      在加法计算器程序中,我们想要“计算”按钮实现的功能是,获取被加数和加数的数值,然后计算它们的和并显示到编辑框里。那么,OnBnClickedAddButton()
    的函数体就应该修改为:
    C++代码:

      对于UpdateData()函数的说明在上一节中已经介绍过了,如果忘了可以在回上一节了解了解。
      接下来我们运行下此应用程序。在运行结果界面中,输入被加数5.1,加数2.3,然后点“计算”:

      在上图中可以看到,点“计算”按钮后,和的编辑框中显示了正确结果:7.4.
      简单分析一下运行过程:输入被加数和加数,点“计算”按钮后产生点击消息,从而调用OnBnClickedAddButton()函数。进入此函数后,首先由UpdateData(TRUE)
    函数将被加数的值5.1和加数的值2.3分别保存到变量m_summand和m_addend,然后通过语句m_sum=m_summand+m_addend;计算出被加数和加数的和7.4,并把7.4的值赋
    给m_sum。最后调用UpdateData(FALSE)根据被加数、加数、和的值更新三个编辑框的显示值,就得到了上面图中的结果。
      到此,一个具有简单的加法计算功能的加法计算器应用程序就基本完成了。如果大家想实现其他功能,可以修改控件资源和消息处理函数来联系下。

    转载于:https://www.cnblogs.com/mupiaomiao/p/6202753.html

    展开全文
  • MFC为对话框和控件等定义了诸多消息,我们对它们操作时会触发消息,这些消息最终由消息处理函数处理。...一般为了让某种操作达到效果,... 鸡啄米仍以前面的加法计算器的程序为例,说明怎样为“计算”按钮控件添加消息...
  • invest模型中威胁源数据非常重要,比如我设定耕地、建设用地和裸地为威胁源,那么怎样提取威胁源数据呢? 1、nodata数据处理 special analyst——地图代数——栅格计算器,输入以下函数 2、栅格转面 转换工具——由...
  • 6.I.3怎样添加资源 6.1.4资源的种类 6.1.5怎样访问资源 6.2使用资源 6.2.1 使用资源管理器 6.2.2使用String资源 6.2.3实例——彩虹和太极 6.2.4使用String数组资源 6.2.5使用Color资源 6.2.6使用Dimension资源 6.2.7...
  • 6.I.3怎样添加资源 6.1.4资源的种类 6.1.5怎样访问资源 6.2使用资源 6.2.1 使用资源管理器 6.2.2使用String资源 6.2.3实例——彩虹和太极 6.2.4使用String数组资源 6.2.5使用Color资源 6.2.6使用Dimension资源 6.2.7...
  • 学通Java的24堂课

    2014-01-17 13:19:41
    1.1.5 怎样学好java 8 1.2 环境搭建 8 1.2.1 jdk下载 8 1.2.2 jdk安装 10 1.2.3 配置环境变量 11 1.3 编写第一个java程序 14 1.3.1 在记事本中输入代码 14 1.3.2 保存代码为源代码文件 15 1.3.3 编译并运行...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位...
  • 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位...
  • 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位...
  • 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位...
  • 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位...
  • 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位...
  • 此计算方法参考1976年6月上海人民出版社《怎样绕变压器》. 15.密闭音箱 该功能可以根据低音喇叭单元的常用参数,计算出适合的密闭箱体体积,和示例箱体外尺寸(如果板厚=0,则计算箱体内容积).其中,箱体共振频率是你...
  • 实例265 怎样调用外部的EXE文件 361 实例266 关闭外部已开启的程序 362 7.10 程序运行 363 实例267 防止程序多次运行 363 实例268 程序运行时禁止关机 364 实例269 获取任务栏尺寸大小 365 实例270 改变系统提示信息...
  • Microsoft C# Windows程序设计(上下册)

    热门讨论 2011-08-05 10:28:13
    7.4 打印机的情况怎样? 7.5 手工转换 7.6 页单位和页缩放 7.7 画笔的宽度 7.8 页面变换 7.9 保存图形状态 7.10 可度量大小 7.11 任意坐标 7.12 哪些事情不能做 7.13 世界坐标变换 7.14 总结 ...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面...实例265 怎样调用外部的EXE文件 361 实例266 关闭外部已开启的程序 362 7.10 程序运行 363 实例267 防止程序多次运行 363 实例...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面...实例265 怎样调用外部的EXE文件 361 实例266 关闭外部已开启的程序 362 7.10 程序运行 363 实例267 防止程序多次运行 363 实例...
  • 一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面...实例265 怎样调用外部的EXE文件 361 实例266 关闭外部已开启的程序 362 7.10 程序运行 363 实例267 防止程序多次运行 363 实例...
  • 一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面...实例265 怎样调用外部的EXE文件 361 实例266 关闭外部已开启的程序 362 7.10 程序运行 363 实例267 防止程序多次运行 363 实例...
  • 一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面...实例265 怎样调用外部的EXE文件 361 实例266 关闭外部已开启的程序 362 7.10 程序运行 363 实例267 防止程序多次运行 363 实例...
  • 一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面...实例265 怎样调用外部的EXE文件 361 实例266 关闭外部已开启的程序 362 7.10 程序运行 363 实例267 防止程序多次运行 363 实例...
  • 一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面...实例265 怎样调用外部的EXE文件 361 实例266 关闭外部已开启的程序 362 7.10 程序运行 363 实例267 防止程序多次运行 363 实例...

空空如也

空空如也

1 2 3
收藏数 44
精华内容 17
关键字:

怎样添加计算器