windows c 計算器

照例先上圖.

下面光貼代碼不說話!

廣告不照例了,這次打在前面. c/c++/Java編程羣 :58698324 歡迎加入

  1. // Maindlg.rc
  2. //Microsoft Developer Studio generated resource script.
  3. //
  4. #include "resource.h"
  5. #define APSTUDIO_READONLY_SYMBOLS
  6. /////////////////////////////////////////////////////////////////////////////
  7. //
  8. // Generated from the TEXTINCLUDE 2 resource.
  9. //
  10. #include "afxres.h"
  11. /////////////////////////////////////////////////////////////////////////////
  12. #undef APSTUDIO_READONLY_SYMBOLS
  13. /////////////////////////////////////////////////////////////////////////////
  14. // Chinese (P.R.C.) resources
  15. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
  16. #ifdef _WIN32
  17. LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
  18. #pragma code_page(936)
  19. #endif //_WIN32
  20. /////////////////////////////////////////////////////////////////////////////
  21. //
  22. // Dialog
  23. //
  24. IDD_MAINDLG DIALOG DISCARDABLE  0, 0, 129, 107
  25. STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
  26. CAPTION "Dialog"
  27. FONT 10, "System"
  28. BEGIN
  29.     EDITTEXT        IDC_EDIT1,14,10,101,13,ES_AUTOHSCROLL
  30.     PUSHBUTTON      "0",IDC_BUTTON1,14,39,19,13
  31.     PUSHBUTTON      "1",IDC_BUTTON2,44,39,19,13
  32.     PUSHBUTTON      "2",IDC_BUTTON3,70,39,19,13
  33.     PUSHBUTTON      "3",IDC_BUTTON4,14,56,19,13
  34.     PUSHBUTTON      "4",IDC_BUTTON5,44,55,19,13
  35.     PUSHBUTTON      "5",IDC_BUTTON6,70,56,19,13
  36.     PUSHBUTTON      "6",IDC_BUTTON7,14,73,19,13
  37.     PUSHBUTTON      "7",IDC_BUTTON8,44,72,19,13
  38.     PUSHBUTTON      "8",IDC_BUTTON9,70,73,19,13
  39.     PUSHBUTTON      "9",IDC_BUTTON10,14,90,19,13
  40.     PUSHBUTTON      "+/-",IDC_REVERSE,44,90,19,13
  41.     PUSHBUTTON      ".",IDC_BUTTON12,70,90,19,13
  42.     PUSHBUTTON      "/",IDC_BUTTON13,96,39,19,13
  43.     PUSHBUTTON      "*",IDC_BUTTON14,96,56,19,13
  44.     PUSHBUTTON      "-",IDC_BUTTON15,96,73,19,13
  45.     PUSHBUTTON      "+",IDC_BUTTON16,96,90,19,13
  46.     PUSHBUTTON      "C",IDC_RESET,96,23,19,13
  47.     PUSHBUTTON      "Backspace",IDC_BACKSPACE,14,24,39,12
  48.     PUSHBUTTON      "=",IDC_DOIT,60,24,28,12
  49. END
  50. /////////////////////////////////////////////////////////////////////////////
  51. //
  52. // DESIGNINFO
  53. //
  54. #ifdef APSTUDIO_INVOKED
  55. GUIDELINES DESIGNINFO DISCARDABLE 
  56. BEGIN
  57.     IDD_MAINDLG, DIALOG
  58.     BEGIN
  59.         LEFTMARGIN, 14
  60.         RIGHTMARGIN, 115
  61.         TOPMARGIN, 10
  62.         BOTTOMMARGIN, 103
  63.     END
  64. END
  65. #endif    // APSTUDIO_INVOKED
  66. #ifdef APSTUDIO_INVOKED
  67. /////////////////////////////////////////////////////////////////////////////
  68. //
  69. // TEXTINCLUDE
  70. //
  71. 1 TEXTINCLUDE DISCARDABLE 
  72. BEGIN
  73.     "resource.h/0"
  74. END
  75. 2 TEXTINCLUDE DISCARDABLE 
  76. BEGIN
  77.     "#include ""afxres.h""/r/n"
  78.     "/0"
  79. END
  80. 3 TEXTINCLUDE DISCARDABLE 
  81. BEGIN
  82.     "/r/n"
  83.     "/0"
  84. END
  85. #endif    // APSTUDIO_INVOKED
  86. #endif    // Chinese (P.R.C.) resources
  87. /////////////////////////////////////////////////////////////////////////////
  88. #ifndef APSTUDIO_INVOKED
  89. /////////////////////////////////////////////////////////////////////////////
  90. //
  91. // Generated from the TEXTINCLUDE 3 resource.
  92. //
  93. /////////////////////////////////////////////////////////////////////////////
  94. #endif    // not APSTUDIO_INVOKED

  1. //{{NO_DEPENDENCIES}}
  2. // Microsoft Developer Studio generated include file.
  3. // Used by MainDlg.rc
  4. //
  5. #define IDD_MAINDLG                     101
  6. #define IDC_EDIT1                       1000
  7. #define IDC_BUTTON1                     1001
  8. #define IDC_BUTTON2                     1002
  9. #define IDC_BUTTON3                     1003
  10. #define IDC_BUTTON4                     1004
  11. #define IDC_BUTTON5                     1005
  12. #define IDC_BUTTON6                     1006
  13. #define IDC_BUTTON7                     1007
  14. #define IDC_BUTTON8                     1008
  15. #define IDC_BUTTON9                     1009
  16. #define IDC_BUTTON10                    1010
  17. #define IDC_REVERSE                    1011
  18. #define IDC_BUTTON12                    1012
  19. #define IDC_BUTTON13                    1013
  20. #define IDC_BUTTON14                    1014
  21. #define IDC_BUTTON15                    1015
  22. #define IDC_BUTTON16                    1016
  23. #define IDC_RESET                      1018
  24. #define IDC_BACKSPACE                    1019
  25. #define IDC_DOIT                   1020
  26. // Next default values for new objects
  27. // 
  28. #ifdef APSTUDIO_INVOKED
  29. #ifndef APSTUDIO_READONLY_SYMBOLS
  30. #define _APS_NEXT_RESOURCE_VALUE        102
  31. #define _APS_NEXT_COMMAND_VALUE         40001
  32. #define _APS_NEXT_CONTROL_VALUE         1002
  33. #define _APS_NEXT_SYMED_VALUE           101
  34. #endif
  35. #endif

  1. /********************************************************************
  2. 使用語言:   C/SDK
  3. 程序功能:   實現簡單計算器
  4. 注意:     實現程序的操作數類型是long,不支持浮點數運算
  5.         對於計算結果超出long所能表示範圍數據就會產生溢出.
  6. 程序擴展注意事項:
  7.         1> 程序使用對話框模板,模板上面的控件ID都有嚴格的順序.
  8.             比如 IDC_BUTTON1 對應的是數字0,IDC_BUTTON1對應9.
  9.             id依次增大,實現計算的時候依賴這個id順序.因此不能隨便
  10.             修改控件id.
  11. 程序結構:
  12.         1> 創建模態對話框
  13.         2> 對話框窗口過程DlgPorc()通過調用DoCommand()實現
  14.             WM_COMMAND消息處理.
  15.         3> DoCommand() 中通過檢測按鈕id處於哪個範圍內分類處理
  16.             由於要處理一系列連續控件,因此沒有使用switch結構而是if else結構
  17.           分類如下:
  18.             1> 數字按鈕 0~9,用於構造操作數
  19.             2> 相反數按鈕 +/- 用於構造當前操作數的相反數
  20.             3> + - * / 運算按鈕,用於數據運算(與求結果 = 按鈕共享處理代碼)
  21.             4> 退格按鈕,用於重新構造操作數
  22.             5> 重置按鈕 "C" ,用於所有的數據復位.
  23. *********************************************************************/
  24. #include "stdafx.h"
  25. #include "resource.h"
  26. #include <stdlib.h>
  27. #include <stdio.h>
  28. #include <math.h>
  29. #include <string.h>
  30. BOOL CALLBACK WINAPI DlgProc(HWND,UINT,WPARAM,LPARAM);
  31. long OP(long op1,char opt,long op2);
  32. BOOL DoCommand(HWND hDlg,WPARAM wParam,LPARAM lParam);
  33. int APIENTRY WinMain(HINSTANCE hInstance,
  34.                      HINSTANCE hPrevInstance,
  35.                      LPSTR     lpCmdLine,
  36.                      int       nCmdShow)
  37. {
  38.     // TODO: Place code here.
  39.     DialogBox(hInstance,(LPCTSTR)IDD_MAINDLG,NULL,(DLGPROC)DlgProc);
  40.     return 0;
  41. }
  42. BOOL CALLBACK WINAPI DlgProc(HWND hDlg,UINT nMsg,WPARAM wParam,LPARAM lParam)
  43. {
  44.     
  45.     switch(nMsg)
  46.     {
  47.     case WM_INITDIALOG:
  48.         EnableWindow(GetDlgItem(hDlg,IDC_EDIT1),false);
  49.         SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),"不支持浮點數,結果可能溢出");
  50.         break;
  51.     case WM_COMMAND:
  52.         return DoCommand(hDlg,wParam,lParam);
  53.         break;
  54.     }
  55.     return 0;
  56. }
  57. // 分類處理wm_command 消息
  58. BOOL DoCommand(HWND hDlg,WPARAM wParam,LPARAM lParam)
  59. {
  60.     static long op1=0,op2=0; // 兩個操作數
  61.     static char strShow[100]=""// 顯示的數字
  62.     //  static long num = 0;
  63.     //  static long lResult = 0; // 運算結果
  64.     static bool bSecondOP = false;
  65.     static bool bResult = false;  // 當前顯示的是否是運算的結果數字
  66.     static char lastopt=0; // 上次的操作符
  67.     int BtnID = LOWORD(wParam); // 按鈕id
  68.     char tempCH[5];  // 中間變量存貯
  69.     if(BtnID >= IDC_BUTTON1 && BtnID <= IDC_BUTTON10) // 數字按鈕
  70.     {// IDC_BUTTON1 :0 id=1001 ~~~ IDC_BUTTON10 : 9 id= 1010
  71.         int n = BtnID - IDC_BUTTON1; // 得到點擊的數字
  72.         if (bSecondOP)
  73.         {
  74.             (op2>=0)?(op2=op2*10+n):(op2=op2*10-n); // 正數加,負數減得到新的數
  75.             sprintf(strShow,"%ld",op2);
  76.         }
  77.         else
  78.         {
  79.             (op1>=0)?(op1=op1*10+n):(op1=op1*10-n);
  80.             sprintf(strShow,"%ld",op1);
  81.         }
  82.         SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),strShow);
  83.         bResult = false;
  84.     }
  85.     else if (BtnID == IDC_DOIT || BtnID >= IDC_BUTTON13 && BtnID <= IDC_BUTTON16) 
  86.     {// + - * / 運算 或者是 按下了求結果的等號按鈕
  87.         // 得到操作符號,(不可以修改按鈕上的文字)
  88.         GetWindowText(GetDlgItem(hDlg,BtnID),tempCH,5);  
  89.         if (bSecondOP || tempCH[0] == '='// 如果是兩個操作數都有了.則運算之
  90.         {
  91.             op1 = OP(op1,lastopt,op2); // 運算結果放入op1
  92.             op2 = 0;
  93.             sprintf(strShow,"%ld",op1);
  94.             SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),strShow);
  95.             bResult = true;
  96.             if (tempCH[0] == '=')
  97.                 return 0;
  98.         }
  99.         lastopt = tempCH[0]; // 此次的操作符
  100.         strcpy(strShow,""); 
  101.         bSecondOP = true;
  102.     }
  103.     else if (BtnID == IDC_BACKSPACE && !bResult)  // 退格,假如是操作數,則不做處理
  104.     {
  105.         bSecondOP?// 第一個或者第二個數字退一位
  106.             (op2/=10,sprintf(strShow,"%ld",op2))
  107.             :(op1/=10,sprintf(strShow,"%ld",op1)); 
  108.         SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),strShow);
  109.     }
  110.     else if(BtnID == IDC_RESET) // 所有的標誌復位
  111.     {
  112.         bSecondOP = false;
  113.         bResult = false;
  114.         op1 = op2 = 0;
  115.         lastopt = 0;
  116.         strcpy(strShow,"");
  117.         SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),"0");
  118.     }
  119.     else if (BtnID == IDC_REVERSE && !bResult)  // 當前數的相反數
  120.     {
  121.         bSecondOP?
  122.             (op2=-op2,sprintf(strShow,"%ld",op2))
  123.             :(op1=-op1,sprintf(strShow,"%ld",op1)); 
  124.         SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),strShow);
  125.     }
  126.     else if (BtnID == IDCANCEL)  // 退出程序
  127.     {
  128.         EndDialog(hDlg,HIWORD(wParam));
  129.         return 0;
  130.     }
  131.     return 0;
  132. }
  133. // 運算函數
  134. long OP(long op1,char opt,long op2)
  135. {
  136.     switch(opt)
  137.     {
  138.         case '+':
  139.             return op1+op2;
  140.         case '-':
  141.             return op1-op2;
  142.         case '*':
  143.             return op1*op2;
  144.         case '/':
  145.             if(op2 == 0)
  146.                 return 0;
  147.             return op1/op2;
  148.     }
  149.     return op1;
  150. }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章