首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

问各位大侠一个简单个有关问题(关于计算器的程序)有几句没有看懂,还望指教!

2012-04-04 
问各位大侠一个简单个问题(关于计算器的程序)有几句没有看懂,还望指教!!!!#includeLRESULT CALLBACK WndPr

问各位大侠一个简单个问题(关于计算器的程序)有几句没有看懂,还望指教!!!!
#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

热点排行
Bad Request.