c++的可视化计算器
2015-08-03 20:54
162 查看
学生党的一个课程设计,希望可以对有些人有些帮助
,第一次发,不好的话请多多原谅
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
,第一次发,不好的话请多多原谅
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
相关文章推荐
- Calculation Of Polynomial(多项式的运算) C++
- 【c++】虚基类
- C++中cin和cin.getline函数连用的问题
- POJ1125Floyd-warshall算法模板题
- C语言深度解剖——读书笔记-12、内存管理
- 《C++编程思想》 第十章 引用和拷贝构造函数(原书代码+知识点+习题+解答)
- C++ 智能指针详解
- 今天在网上看到一个百度的C++面试题目
- JNI_最简单的Java调用C/C++代码(自己整理)
- c++11 中的 move 与 forward
- QString、string相互转换
- C++11 标准新特性: 右值引用与转移语义
- c++实现基于单进程单客户编程模型的echo程序
- 动态规划之UNIMODAL PALINDROMIC DECOMPOSITIONS
- C++中this指针的用法.
- C++零碎知识点
- C语言笔记
- IOS使用纯C语言创建静态库
- C语言-变量的存储类别(auto, static, register, extern)
- 【effective c++读书笔记】【第4章】设计与声明(2)