win32sdk计算器

这是一个基于Win32GUI的简单计算器程序,它实现了基本的四则运算及括号运算。用户通过点击按钮输入数字和运算符,程序会检查表达式的合法性并进行计算,结果显示在编辑框中。程序还包括了定时器功能,用于实时显示系统时间。
摘要由CSDN通过智能技术生成
//win32gui版计算器
//Main.cpp
// jsq.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include "MainDlg.h"
#include <COMMCTRL.H>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
//Enable IPAddress Calendar.etc
InitCommonControls();
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, Main_Proc);
return 0;
}


//MainDlg.cpp
#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
#include "MainDlg.h"
#include "stdio.h"
//#include "string.h"
#include "stdlib.h"

int top=0,topop=1,msgtop=0;
char optr[256]="#";//初始化操作符栈;
char msg[256]="#";//初始表达式栈;
double result[256]={-1};//操作数栈,计算结束后的结果放在了第0个下标中;
double jieguo=0;




void pushmsg(char ch)
{
msg[msgtop++]=ch;//将按键字符数据送入表达式栈msg;
}

void backspace(HWND hwnd)
{
if(0==msgtop)
{
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),FALSE);
}
else
{
msg[(--msgtop)--]='\0';//按下backspace后删除前一个字符;
++msgtop;
}

}

double gettopnd()//取得操作数栈顶符号
{
return result[top-1];
}
char gettopop()//取得操作符栈顶符号
{
return optr[topop-1];
}

void pushnd(double ch)//操作数入栈
{
result[top++]=ch;
}

void pushop(char ch)//操作符入栈
{
optr[topop++]=ch;
}

double popnd()//弹出操作数
{
return result[--top];
}
char popop()//弹出操作符
{
return optr[--topop];
}


char IsOprator(char m )//判断字符是否是操作符,是则返回操作符assci,否为0;
{
switch(m)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':return m;break;
default: return 0;
}
}

int FmtStr(char msg[],int N)//格式化表达式,主要是将负数(-x)转化为(0-x)的形式以统一使用后续算法,同理可增加新的计算功能;
{
int tmp=0;//临时变量,主要是保存表达式增加的位数(表达式增加的长度)
for (int i=0;i<N-1;i++)//总共循环表达式的长度那么多次;
{
if(msg[i]=='-'&&msg[i-1]=='(')//取当前字符并判断该字符是否是负号且它的上一个字符是左括号,确定这个符号为负而不是减;
{
for(int t=N+1;t!=i;t--)//若为负号,则向后取数直到遇到右括号时终止;
{
msg[t]=msg[t-1];//将负号后,右括号前的所有字符作为一个操作数;
}
msg[i]='0';
tmp=tmp+1;
}
}
msgtop=msgtop+tmp;//当格式化表达式后,增加几个0,则表达式串长度增加;
return  tmp;
}

int Scan(char msg[],int N)//表达式合法性检测,合法为1;左右括号匹配,符号的下一个字符不能是除(外的字符;
{//数字的下一位不能是(,
int c=0,flag=1,next=0;
for(int i=0;i<N;i++)
{
if(IsOprator(msg[i]))//是符号则检测是否为(号,是则c+1,是)则c-1;同时检测右侧是否为符号,是则只能是(
{
if(next&&IsOprator(msg[i])==')')//(的下一个符号不能是)。
{
flag=0;
MessageBoxA(NULL,TEXT("错误:()间无操作符,请修正表达式!"),TEXT("警告!"),MB_OK|MB_ICONWARNING);
msg[--msgtop]='\0';//每次计算结束后删除表达式中的'#'字符;
next=0;
return flag;
}
else
{
next=0;
}
if((IsOprator(msg[i])=='+'||IsOprator(msg[i])=='-'||IsOprator(msg[i])=='*'||IsOprator(msg[i])=='/')&&0!=IsOprator(msg[i+1])&&IsOprator(msg[i+1])!='(')//检测i右侧是否为符号,左侧为算术符,右侧只能是(,否则表达式错误
{
flag=0;
MessageBoxA(NULL,TEXT("错误:出现连续操作符,请修正表达式!"),TEXT("警告!"),MB_OK|MB_ICONWARNING);
msg[--msgtop]='\0';//每次计算结束后删除表达式中的'#'字符;
return flag;
}
else
if('('==IsOprator(msg[i]))//检测是否为(号,则c+1,是)则c-1;
{
next=1;
c++;
}
else
if(')'==IsOprator(msg[i]))//是)则c-1;
{
c--;
}
}
else//数字的下一位不能是(;
{
if('('==IsOprator(msg[i+1]))
{
flag=0;
MessageBoxA(NULL,TEXT("错误:数字右侧为左括号,请修正表达式!"),TEXT("警告!"),MB_OK|MB_ICONWARNING);
msg[--msgtop]='\0';//每次计算结束后删除表达式中的'#'字符;
return flag;
}
}

}
if(c>0)
{
flag=0;
MessageBoxA(NULL,TEXT("错误:右括号不匹配,请修正表达式!"),TEXT("警告!"),MB_OK|MB_ICONWARNING);
msg[--msgtop]='\0';//每次计算结束后删除表达式中的'#'字符;
return flag;
}
else
if(c<0)
{
flag=0;
MessageBoxA(NULL,TEXT("错误:左括号不匹配,请修正表达式!"),TEXT("警告!"),MB_OK|MB_ICONWARNING);
msg[--msgtop]='\0';//每次计算结束后删除表达式中的'#'字符;
return flag;
}
return flag;
}

int jugelow(char ch)//栈顶符号优先级低于下一个符号,1为低于;
{
if(('*'==ch||'/'==ch)&&('+'==gettopop()||'-'==gettopop())||'#'==gettopop()||'('==gettopop())
{
return 1;
}
else
return 0;

}

double js(char msg[],int N)//计算表达式
{
for(int i=0;i<N;)
{
int t=0;
char tmp[256]="#";
if('+'==IsOprator(msg[0])||'-'==IsOprator(msg[0])||'*'==IsOprator(msg[0])||'/'==IsOprator(msg[0]))
{
MessageBoxA(NULL,TEXT("错误:首字符为操作符!"),TEXT("警告!"),MB_OK|MB_ICONWARNING);
break;
}
else
if('('==msg[i])
{
pushop('(');//遇左括号直接进操作符栈;
i=i+1;
}
else
{
if(!IsOprator(msg[i]))//如果为数字,则取出剩下的字符作为数字;
{
while(!IsOprator(msg[i])&&msg[i]!='#')//判断当前字符是否为操作符,若不是则全部赋值给操作数
{
tmp[t++]=msg[i++];
}
pushnd(atof(tmp));//转化字符为浮点型数据,并入数据栈;
}
else
//如果为*+-/()中的一种,则与符号栈顶元素比较优先级,op栈顶操作符号优先级高于下一个符号的话,
//则取出两个操作数进行计算,并将结果压入操作数栈;
//继续直到操作符栈顶为‘#’或者op栈顶操作符号优先级低于下一个符号。
if(IsOprator(msg[i]))
{	
if(!jugelow(msg[i]))
{
while(!jugelow(msg[i])&&'#'!=gettopop())
{
switch(gettopop())
{
case '*':
{
popop();
pushnd(popnd()*popnd());
}break;
case '/':
{
popop();
if(0==gettopnd())
{
MessageBoxA(NULL,TEXT("除数不能为0!"),TEXT("警告!"),MB_OK|MB_ICONWARNING);
}
else
{
double tmp;
tmp=popnd();
pushnd(popnd()/tmp);
}
}break;
case '+':
{
popop();
pushnd(popnd()+popnd());
}break;
case '-':
{
popop();
double tmp;
tmp=popnd();
pushnd(popnd()-tmp);}break;
}
if(('('==gettopop())&&(')'==msg[i]))
{
popop();
i++;
}
}
}
else//如果栈顶符号优先级低,则将当前符号入操作符栈;
{
pushop(msg[i]);
i=i+1;
}

}
}
}
return popnd();//返回计算结果;
}

void CALLBACK TimerProc(HWND hwnd)//取得系统时间,格式化后显示时间;
{
char buf[256]="0";
 SYSTEMTIME stLocal;
     GetLocalTime(&stLocal);//取得系统时间
 wsprintf(buf,TEXT("%4d年%2d月%2d日\r\n%2d:%02d:%02d\r\n"),
 stLocal.wYear, stLocal.wMonth, stLocal.wDay,
 stLocal.wHour, stLocal.wMinute, stLocal.wSecond);//格式化时间;
 SetDlgItemText(hwnd,IDC_TIME,buf);//设置编辑框内容;
}
/*
Template designed by RuPeng.com. Please visit http://www.rupeng.com for more information
如鹏网(http://www.rupeng.com)大学生计算机学习社区,提供大量免费视频学习教程,提供个性化一对一学习指导
*/
/*
HBRUSH  repaintedit(HWND hwnd, HDC hdc, HWND hwndChild, int type)
{
HWND hwnd1= GetDlgItem(NULL,IDC_EDITjg); //得到控件的句柄
    hdc=GetDC(hwnd1);//定义一个设备上下文的句柄,在API中用
//	HBRUSH hBrush=CreateSolidBrush(RGB(255,255,255)) ;//创建画刷。 
//	if(hwnd==hwnd1)
//	{	SelectObject(hdc,hBrush);
//	SetBkColor(hdc,RGB(85,255,0)); 
//	ReleaseDC(hwnd1,hdc);

}*/

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd, WM_CLOSE, Main_OnClose);
case WM_CTLCOLORSTATIC:
{
HWND hwnd1= GetDlgItem(hWnd,IDC_EDITjg);
HDC hdcStatic =GetDC(hwnd1);
HBRUSH hbrBkgnd=(HBRUSH)GetClassLong(hWnd,GCL_HBRBACKGROUND);//GetClassLong函数返回与指定窗口相关的WNDCLASSEX结构,GCL_HBRBACKGROUND获得与类有关的背景刷子的句柄。 
       if ((HWND)lParam==hwnd1)
       {
           hbrBkgnd = CreateSolidBrush(RGB(255,255,255));
        }
        return (INT_PTR)hbrBkgnd;

}
    }

    return FALSE;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{ 
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),FALSE);
SetTimer(hwnd,1,1000,(TIMERPROC)TimerProc);//初始化定时器,每秒钟执行一次TimerProc函数,实现时间显示;
    return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BUTTON1:
{
pushmsg('1');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON2:
{
pushmsg('2');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON3:
{
pushmsg('3');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON4:
{
pushmsg('4');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON5:
{
pushmsg('5');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON6:
{
pushmsg('6');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON7:
{
pushmsg('7');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON8:
{
pushmsg('8');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON9:
{
pushmsg('9');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON10:
{
pushmsg('0');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON11:
{
pushmsg('.');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON12:
{
pushmsg('-');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON13:
{
pushmsg('/');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON14:
{
pushmsg('*');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON15:
{
pushmsg('-');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON16:
{
pushmsg('+');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON17:
{
pushmsg('(');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON18:
{
pushmsg(')');
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),TRUE);
}
        break;
case IDC_BUTTON19://计算结果,并显示在编辑框内;
{
pushmsg('#');//为了计算的方便,在表达式末尾追加一个‘#’号;
int N=strlen(msg);//初始表达式的长度;
char jg[256]="\0";//为了将计算结果显示在编辑框中,增加一个计算结果数据;
N=N+FmtStr(msg,N);//格式化表达式后的数组长度;
if(Scan(msg,N))
{
jieguo=js(msg,N);//调用计算函数;
msg[(--msgtop)--]='\0';//每次计算结束后删除表达式中的'#'字符;
++msgtop;
sprintf(jg,"%8.2f",jieguo);//浮点数转化为字符串;
SetDlgItemText(hwnd,IDC_EDITjg,jg);//设置编辑框内容;
}

}
        break;
case IDC_BUTTON20://删除上一字符;
{
backspace(hwnd);
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
}
        break;
case IDC_BUTTON21://清空计算结果(清空表达式数组);
{
for(msgtop;msgtop>=0;msgtop--)
{
msg[msgtop]='\0';
}
msgtop++;
SetDlgItemText(hwnd,IDC_EDITjg,msg);//设置编辑框内容;
EnableWindow(GetDlgItem(hwnd,IDC_BUTTON20),FALSE);
}
        break;
case IDC_HELP1:
{
MessageBox(NULL,TEXT("本程序支持带括号的四则混合运算,\n\r请输入合法的表达式!"),TEXT("帮助"),MB_OK);
}
break;
case IDC_ABOUT1:
{
MessageBox(NULL,TEXT("code:Denny\n\rversion:v1.0\n\rdate:2011/05/29"),TEXT("About Me"),MB_OK);
}
break;
        default:
break;
    }
}

void Main_OnClose(HWND hwnd)
{
KillTimer(hwnd, 1);
    EndDialog(hwnd, 0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值