问各位大侠一个简单个问题(关于计算器的程序)有几句没有看懂,还望指教!!!!
#include
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HexCalc") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
.......
}
void ShowNumber (HWND hwnd, UINT iNumber)
{
TCHAR szBuffer[20] ;
wsprintf (szBuffer, TEXT ("%X"), iNumber) ;
SetDlgItemText (hwnd, VK_ESCAPE, szBuffer) ;
}
DWORD CalcIt (UINT iFirstNum, int iOperation, UINT iNum)
{
switch (iOperation)
{
case '=': return iNum ;
case '+': return iFirstNum + iNum ;
case '-': return iFirstNum - iNum ;
case '*': return iFirstNum * iNum ;
case '&': return iFirstNum & iNum ;
case '|': return iFirstNum | iNum ;
case '^': return iFirstNum ^ iNum ;
case '<': return iFirstNum << iNum ;
case '>': return iFirstNum >> iNum ;
case '/': return iNum ? iFirstNum / iNum: MAXDWORD ;
case '%': return iNum ? iFirstNum % iNum: MAXDWORD ;
default : return 0 ;
}
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static BOOL bNewNumber = TRUE ;
static int iOperation = '=' ;
static UINT iNumber, iFirstNum ;
HWND hButton ;
switch (message)
{
case WM_KEYDOWN: //拦截WM_KEYDOWN讯息,将左箭头键转换为Backspace键。
if (wParam != VK_LEFT)
break ;
wParam = VK_BACK ;
//将字元代码转换为大写,Enter键转换为等号键的ASCII码。
case WM_CHAR:
if ((wParam = (WPARAM) CharUpper ((TCHAR *) wParam)) == VK_RETURN)
wParam = '=' ;
if (hButton = GetDlgItem (hwnd, wParam))
{//GetDlgItem检验WM_CHAR讯息的有效性
SendMessage (hButton, BM_SETSTATE, 1, 0) ;
Sleep (100) ;
SendMessage (hButton, BM_SETSTATE, 0, 0) ;
}
else
{
MessageBeep (0) ;
break ;
}
// fall through
case WM_COMMAND:
SetFocus (hwnd) ;
if (LOWORD (wParam) == VK_BACK) // backspace
ShowNumber (hwnd, iNumber /= 16) ;
else if (LOWORD (wParam) == VK_ESCAPE) // escape
ShowNumber (hwnd, iNumber = 0) ;
else if (isxdigit (LOWORD (wParam))) 解释下下面的代码的作用
{
if (bNewNumber) //???
{
iFirstNum = iNumber ; // ??
iNumber = 0 ;
}
bNewNumber = FALSE ; //???
if (iNumber <= MAXDWORD >> 4)
ShowNumber (hwnd, iNumber = 16 * iNumber + wParam - //重点解释??
(isdigit (wParam) ? '0': 'A' - 10)) ;
else
MessageBeep (0) ;
}
else // operation
{
if (!bNewNumber)
ShowNumber (hwnd, iNumber =
CalcIt (iFirstNum, iOperation, iNumber)) ;
bNewNumber = TRUE ;
iOperation = LOWORD (wParam) ;
}
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
[解决办法]
bNewNumber为真的话,当前需要输入一个数.
if (bNewNumber) //???
{
iFirstNum = iNumber ; // ??
iNumber = 0 ;
}
bNewNumber = FALSE ; //???
如果当前需要输入一个数,那么记录已经输入过的数,并且置现在输入的数为0.
if (iNumber <= MAXDWORD >> 4)
ShowNumber (hwnd, iNumber = 16 * iNumber + wParam - //重点解释??
(isdigit (wParam) ? '0': 'A' - 10)) ;
else
MessageBeep (0) ;
仅以十进制为例
假如你已经输入一个1.那么iNumber = 1
然后输入一个9,那么值就是1 * 10 + 9
iNumber对应了编辑框里面的的数值.
然后显示.
[解决办法]
其实这也对应一个状态机.
1*4+4
考虑从左到右依次运算(也就是说没有优先级,且是数字和运算符相间的表达式,当然还要注意头尾),你只需要两种状态:
1.need a number
2.need a operator