照例先上圖.
下面光貼代碼不說話!
廣告不照例了,這次打在前面. c/c++/Java編程羣 :58698324 歡迎加入
- // Maindlg.rc
- //Microsoft Developer Studio generated resource script.
- //
- #include "resource.h"
- #define APSTUDIO_READONLY_SYMBOLS
- /////////////////////////////////////////////////////////////////////////////
- //
- // Generated from the TEXTINCLUDE 2 resource.
- //
- #include "afxres.h"
- /////////////////////////////////////////////////////////////////////////////
- #undef APSTUDIO_READONLY_SYMBOLS
- /////////////////////////////////////////////////////////////////////////////
- // Chinese (P.R.C.) resources
- #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
- #ifdef _WIN32
- LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
- #pragma code_page(936)
- #endif //_WIN32
- /////////////////////////////////////////////////////////////////////////////
- //
- // Dialog
- //
- IDD_MAINDLG DIALOG DISCARDABLE 0, 0, 129, 107
- STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
- CAPTION "Dialog"
- FONT 10, "System"
- BEGIN
- EDITTEXT IDC_EDIT1,14,10,101,13,ES_AUTOHSCROLL
- PUSHBUTTON "0",IDC_BUTTON1,14,39,19,13
- PUSHBUTTON "1",IDC_BUTTON2,44,39,19,13
- PUSHBUTTON "2",IDC_BUTTON3,70,39,19,13
- PUSHBUTTON "3",IDC_BUTTON4,14,56,19,13
- PUSHBUTTON "4",IDC_BUTTON5,44,55,19,13
- PUSHBUTTON "5",IDC_BUTTON6,70,56,19,13
- PUSHBUTTON "6",IDC_BUTTON7,14,73,19,13
- PUSHBUTTON "7",IDC_BUTTON8,44,72,19,13
- PUSHBUTTON "8",IDC_BUTTON9,70,73,19,13
- PUSHBUTTON "9",IDC_BUTTON10,14,90,19,13
- PUSHBUTTON "+/-",IDC_REVERSE,44,90,19,13
- PUSHBUTTON ".",IDC_BUTTON12,70,90,19,13
- PUSHBUTTON "/",IDC_BUTTON13,96,39,19,13
- PUSHBUTTON "*",IDC_BUTTON14,96,56,19,13
- PUSHBUTTON "-",IDC_BUTTON15,96,73,19,13
- PUSHBUTTON "+",IDC_BUTTON16,96,90,19,13
- PUSHBUTTON "C",IDC_RESET,96,23,19,13
- PUSHBUTTON "Backspace",IDC_BACKSPACE,14,24,39,12
- PUSHBUTTON "=",IDC_DOIT,60,24,28,12
- END
- /////////////////////////////////////////////////////////////////////////////
- //
- // DESIGNINFO
- //
- #ifdef APSTUDIO_INVOKED
- GUIDELINES DESIGNINFO DISCARDABLE
- BEGIN
- IDD_MAINDLG, DIALOG
- BEGIN
- LEFTMARGIN, 14
- RIGHTMARGIN, 115
- TOPMARGIN, 10
- BOTTOMMARGIN, 103
- END
- END
- #endif // APSTUDIO_INVOKED
- #ifdef APSTUDIO_INVOKED
- /////////////////////////////////////////////////////////////////////////////
- //
- // TEXTINCLUDE
- //
- 1 TEXTINCLUDE DISCARDABLE
- BEGIN
- "resource.h/0"
- END
- 2 TEXTINCLUDE DISCARDABLE
- BEGIN
- "#include ""afxres.h""/r/n"
- "/0"
- END
- 3 TEXTINCLUDE DISCARDABLE
- BEGIN
- "/r/n"
- "/0"
- END
- #endif // APSTUDIO_INVOKED
- #endif // Chinese (P.R.C.) resources
- /////////////////////////////////////////////////////////////////////////////
- #ifndef APSTUDIO_INVOKED
- /////////////////////////////////////////////////////////////////////////////
- //
- // Generated from the TEXTINCLUDE 3 resource.
- //
- /////////////////////////////////////////////////////////////////////////////
- #endif // not APSTUDIO_INVOKED
- //{{NO_DEPENDENCIES}}
- // Microsoft Developer Studio generated include file.
- // Used by MainDlg.rc
- //
- #define IDD_MAINDLG 101
- #define IDC_EDIT1 1000
- #define IDC_BUTTON1 1001
- #define IDC_BUTTON2 1002
- #define IDC_BUTTON3 1003
- #define IDC_BUTTON4 1004
- #define IDC_BUTTON5 1005
- #define IDC_BUTTON6 1006
- #define IDC_BUTTON7 1007
- #define IDC_BUTTON8 1008
- #define IDC_BUTTON9 1009
- #define IDC_BUTTON10 1010
- #define IDC_REVERSE 1011
- #define IDC_BUTTON12 1012
- #define IDC_BUTTON13 1013
- #define IDC_BUTTON14 1014
- #define IDC_BUTTON15 1015
- #define IDC_BUTTON16 1016
- #define IDC_RESET 1018
- #define IDC_BACKSPACE 1019
- #define IDC_DOIT 1020
- // Next default values for new objects
- //
- #ifdef APSTUDIO_INVOKED
- #ifndef APSTUDIO_READONLY_SYMBOLS
- #define _APS_NEXT_RESOURCE_VALUE 102
- #define _APS_NEXT_COMMAND_VALUE 40001
- #define _APS_NEXT_CONTROL_VALUE 1002
- #define _APS_NEXT_SYMED_VALUE 101
- #endif
- #endif
- /********************************************************************
- 使用語言: C/SDK
- 程序功能: 實現簡單計算器
- 注意: 實現程序的操作數類型是long,不支持浮點數運算
- 對於計算結果超出long所能表示範圍數據就會產生溢出.
- 程序擴展注意事項:
- 1> 程序使用對話框模板,模板上面的控件ID都有嚴格的順序.
- 比如 IDC_BUTTON1 對應的是數字0,IDC_BUTTON1對應9.
- id依次增大,實現計算的時候依賴這個id順序.因此不能隨便
- 修改控件id.
- 程序結構:
- 1> 創建模態對話框
- 2> 對話框窗口過程DlgPorc()通過調用DoCommand()實現
- WM_COMMAND消息處理.
- 3> DoCommand() 中通過檢測按鈕id處於哪個範圍內分類處理
- 由於要處理一系列連續控件,因此沒有使用switch結構而是if else結構
- 分類如下:
- 1> 數字按鈕 0~9,用於構造操作數
- 2> 相反數按鈕 +/- 用於構造當前操作數的相反數
- 3> + - * / 運算按鈕,用於數據運算(與求結果 = 按鈕共享處理代碼)
- 4> 退格按鈕,用於重新構造操作數
- 5> 重置按鈕 "C" ,用於所有的數據復位.
- *********************************************************************/
- #include "stdafx.h"
- #include "resource.h"
- #include <stdlib.h>
- #include <stdio.h>
- #include <math.h>
- #include <string.h>
- BOOL CALLBACK WINAPI DlgProc(HWND,UINT,WPARAM,LPARAM);
- long OP(long op1,char opt,long op2);
- BOOL DoCommand(HWND hDlg,WPARAM wParam,LPARAM lParam);
- int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
- {
- // TODO: Place code here.
- DialogBox(hInstance,(LPCTSTR)IDD_MAINDLG,NULL,(DLGPROC)DlgProc);
- return 0;
- }
- BOOL CALLBACK WINAPI DlgProc(HWND hDlg,UINT nMsg,WPARAM wParam,LPARAM lParam)
- {
- switch(nMsg)
- {
- case WM_INITDIALOG:
- EnableWindow(GetDlgItem(hDlg,IDC_EDIT1),false);
- SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),"不支持浮點數,結果可能溢出");
- break;
- case WM_COMMAND:
- return DoCommand(hDlg,wParam,lParam);
- break;
- }
- return 0;
- }
- // 分類處理wm_command 消息
- BOOL DoCommand(HWND hDlg,WPARAM wParam,LPARAM lParam)
- {
- static long op1=0,op2=0; // 兩個操作數
- static char strShow[100]=""; // 顯示的數字
- // static long num = 0;
- // static long lResult = 0; // 運算結果
- static bool bSecondOP = false;
- static bool bResult = false; // 當前顯示的是否是運算的結果數字
- static char lastopt=0; // 上次的操作符
- int BtnID = LOWORD(wParam); // 按鈕id
- char tempCH[5]; // 中間變量存貯
- if(BtnID >= IDC_BUTTON1 && BtnID <= IDC_BUTTON10) // 數字按鈕
- {// IDC_BUTTON1 :0 id=1001 ~~~ IDC_BUTTON10 : 9 id= 1010
- int n = BtnID - IDC_BUTTON1; // 得到點擊的數字
- if (bSecondOP)
- {
- (op2>=0)?(op2=op2*10+n):(op2=op2*10-n); // 正數加,負數減得到新的數
- sprintf(strShow,"%ld",op2);
- }
- else
- {
- (op1>=0)?(op1=op1*10+n):(op1=op1*10-n);
- sprintf(strShow,"%ld",op1);
- }
- SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),strShow);
- bResult = false;
- }
- else if (BtnID == IDC_DOIT || BtnID >= IDC_BUTTON13 && BtnID <= IDC_BUTTON16)
- {// + - * / 運算 或者是 按下了求結果的等號按鈕
- // 得到操作符號,(不可以修改按鈕上的文字)
- GetWindowText(GetDlgItem(hDlg,BtnID),tempCH,5);
- if (bSecondOP || tempCH[0] == '=') // 如果是兩個操作數都有了.則運算之
- {
- op1 = OP(op1,lastopt,op2); // 運算結果放入op1
- op2 = 0;
- sprintf(strShow,"%ld",op1);
- SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),strShow);
- bResult = true;
- if (tempCH[0] == '=')
- return 0;
- }
- lastopt = tempCH[0]; // 此次的操作符
- strcpy(strShow,"");
- bSecondOP = true;
- }
- else if (BtnID == IDC_BACKSPACE && !bResult) // 退格,假如是操作數,則不做處理
- {
- bSecondOP?// 第一個或者第二個數字退一位
- (op2/=10,sprintf(strShow,"%ld",op2))
- :(op1/=10,sprintf(strShow,"%ld",op1));
- SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),strShow);
- }
- else if(BtnID == IDC_RESET) // 所有的標誌復位
- {
- bSecondOP = false;
- bResult = false;
- op1 = op2 = 0;
- lastopt = 0;
- strcpy(strShow,"");
- SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),"0");
- }
- else if (BtnID == IDC_REVERSE && !bResult) // 當前數的相反數
- {
- bSecondOP?
- (op2=-op2,sprintf(strShow,"%ld",op2))
- :(op1=-op1,sprintf(strShow,"%ld",op1));
- SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),strShow);
- }
- else if (BtnID == IDCANCEL) // 退出程序
- {
- EndDialog(hDlg,HIWORD(wParam));
- return 0;
- }
- return 0;
- }
- // 運算函數
- long OP(long op1,char opt,long op2)
- {
- switch(opt)
- {
- case '+':
- return op1+op2;
- case '-':
- return op1-op2;
- case '*':
- return op1*op2;
- case '/':
- if(op2 == 0)
- return 0;
- return op1/op2;
- }
- return op1;
- }