新手做的计算器 有问题待解决
用SDK做的 刚学不久 有不少问题呢
问题1:不能支持键盘输入 加入WM_KEYDOWN WM_CHAR 消息后不能响应(MessageBox函数)
问题2: 显示数字问题,因为是用SetDlgItemText实现的,只能用字符串,每次显示的数都是保留六位小数的,而且最长支持14位数 不然就越界 有什么方法可以动态的显示数字呢?(比如按下小数点之后才有小数出现)还有解决问题?
下面是源码 各位前辈请多多指教 也可以多提些学习的建议 谢谢了~
#include <windows.h>
#include <stdio.h>
#include "resource.h"
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);//对话框消息函数
void ShowNumber (HWND hwnd,long double iNumber);//显示输入的数字
double Result(long double iFirstNum, char iOperation,long double iNum);//计算结果函数
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
)
{
MSG Message;
DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc, 0);
while (GetMessage (&Message, NULL, 0, 0))
{
TranslateMessage (&Message) ;
DispatchMessage (&Message) ;
}
return Message.wParam;
}
BOOL CALLBACK DialogProc(
HWND hwnd, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
static MSG Message;
static BOOL bEquel_Key=FALSE,bOperation_Key=FALSE,bDigit_Key=FALSE,bPoint=FALSE;//开关值
static char Operation='=';
static int iPoint=0;//判断小数点的位数
static long double iNumber=0,iFirstNumber=0,iResultNumber=0,Index=10;//计算用到的变量
HWND hDisplay;//显示区域句柄
hDisplay=GetDlgItem(hwnd,IDC_DISPLAY);//获取显示区域的句柄
bool KeyShift=FALSE;
//ShowNumber(hwnd,iNumber);//初始化显示区域
if(iPoint==0)
bPoint=FALSE;
switch (uMsg)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 0://输入零
if(bPoint)
{
int i=iPoint;
while(--i)
Index*=10;
ShowNumber(hwnd,iNumber+=(LOWORD(wParam))/Index);
iPoint++;
Index=10;
}
else
ShowNumber(hwnd,iNumber=iNumber*10);
return 0;
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19://按下1-9
if(bEquel_Key)//上个消息是等于
{
iFirstNumber=iNumber=iResultNumber=0;//清空所有计算所用的变量
bEquel_Key=FALSE,bOperation_Key=FALSE,bDigit_Key=FALSE;
}
if(bOperation_Key)//上个消息是运算符
{
iFirstNumber=iNumber;
iNumber=0;
}
if(bPoint)//如果按下了小数点
{
int i=iPoint++;
while(--i)
Index*=10;
ShowNumber(hwnd,iNumber+=(LOWORD(wParam)-10)/Index);
Index=10;
}
else
{
iNumber=iNumber*10;
ShowNumber(hwnd,iNumber+=LOWORD(wParam)-10);
}
bDigit_Key=TRUE;
return 0;
case IDC_ADD:
case IDC_SUB:
case IDC_MUL:
case IDC_DIV:
case IDC_REM://输入符号
if(bDigit_Key&&bOperation_Key)//如果连续计算
iNumber=Result(iFirstNumber,Operation,iNumber);
if(bEquel_Key)//如果上一个消息是等号
iNumber=iResultNumber;
GetDlgItemText(hwnd,LOWORD(wParam),&Operation,2);//获取按下的符号
SetDlgItemText(hwnd,IDC_DISPLAY,&Operation);//在显示区域显示符号
bDigit_Key=FALSE;
bEquel_Key=FALSE;
bOperation_Key=TRUE;
bPoint=FALSE;
return 0;
case IDC_EQUEL://等于
if(bDigit_Key)
{
iResultNumber=Result(iFirstNumber,Operation,iNumber);
ShowNumber(hwnd,Result(iFirstNumber,Operation,iNumber));
}
if(bEquel_Key)//连续按下等号的计算
{
iFirstNumber=iResultNumber;
iResultNumber=Result(iFirstNumber,Operation,iNumber);
ShowNumber(hwnd,Result(iFirstNumber,Operation,iNumber));
}
bEquel_Key=TRUE;
bOperation_Key=FALSE;
bDigit_Key=FALSE;
return 0;
case IDC_ESPACE: //清空当行
iPoint=1;
iNumber=0;
bPoint=FALSE;
ShowNumber(hwnd,0);
return 0;
case IDC_BACK://退格
if(iNumber)
{
if(bPoint&&iPoint>2)
{
Index=10;
int i=iPoint-2;
while(--i)
Index*=10;
iNumber=(int)(iNumber*Index);
ShowNumber(hwnd,iNumber/=Index);
iPoint--;
}
else
if(iPoint==2)
{
ShowNumber(hwnd,iNumber=(int)iNumber);
iPoint--;
}
else
ShowNumber(hwnd,iNumber=(int)(iNumber/10));
}
return 0;
case IDC_BEGIN://重新计算 清零
iPoint=1;
iFirstNumber=iNumber=iResultNumber=0;
bPoint=FALSE;
ShowNumber(hwnd,0);
return 0;
case IDC_POINT:
if(!bPoint)
{
bPoint=TRUE;
iPoint=1;
}
return 0;
case IDC_SHIFT:
iNumber=-iNumber;
ShowNumber(hwnd,iNumber);
return 0;
case IDCANCEL://退出
EndDialog(hwnd,LOWORD(wParam));
return 0;
default:
return 0 ;
}
case WM_KEYDOWN:
case WM_CHAR:
MessageBox(hwnd,"1","1",0);
return 0;
case WM_SETFOCUS:
SetFocus(hDisplay);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
return TRUE;
}
return FALSE;
}
void ShowNumber (HWND hwnd,long double iNumber)//显示数字
{
TCHAR szBuffer[20] ;
sprintf(szBuffer, "%f", iNumber) ;
SetDlgItemText(hwnd,IDC_DISPLAY,szBuffer);
}
double Result(long double iFirstNum, char Operation,long double iNum) //显示计算结果
{
switch (Operation)
{
case '=': return iNum ;
case '+': return iFirstNum+iNum ;
case '-': return iFirstNum-iNum ;
case '*': return iFirstNum*iNum ;
case '/': return iFirstNum/iNum;
case '%': return (int)iFirstNum%(int)iNum;
default : return 0 ;
}
}