rendered paste body// This lesson --// --- WIN32 Lean and Mean// -- Optimize Message Pump// -- Use Three different controls to create a calculator// -- Use resources to make a dialog box appear#define IDC_ADD 1001#define IDC_SUB 1002#define IDC_DIV 1003#define IDC_MUL 1004#define IDC_EQA 1005#define IDC_OUTPUT 1006#define IDC_Clear 1007#define ADD 1#define SUB 2#define DIV 3#define MUL 4#define EQA 5#define WIN32_LEAN_AND_MEAN#include <windows.h>int recent,total,currentOperation;bool first=true;LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);int calc_total(int, int);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ WNDCLASSEX windowClass; // class/struct for our main window- HWND hwnd; // the handle to that window- MSG msg; // message- windowClass.cbSize = sizeof WNDCLASSEX; windowClass.style = CS_HREDRAW | CS_VREDRAW; // redraw on resize windowClass.lpfnWndProc = WndProc; // WndProc() address to function pointer- windowClass.cbClsExtra=0; windowClass.cbWndExtra=0; windowClass.hInstance = hInstance; windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Standard app icon- windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // Standard cursor- windowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //paint the background with? windowClass.lpszMenuName = NULL; // No menu windowClass.lpszClassName = "MyClass"; // Handle for this windows class- windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); if(!RegisterClassEx(&windowClass)) return 0; // struct registered and valid, now create the window- hwnd = CreateWindowEx(NULL, // extended styles- "MyClass", // struct/class name from earlier- "Calc", // Window title- WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU, 100, 100, //x,y 158, 75, // width, height NULL, NULL, hInstance, // app instance- NULL); if(!hwnd) return 0; while(GetMessage(&msg,NULL, 0,0) > 0){ TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hAdd, hSub, hDiv, hMul, hEqa, hClear, hOutput; switch(message){ case WM_CREATE: hAdd = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "+", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 0, 26, 30, 25, hwnd, (HMENU)IDC_ADD, GetModuleHandle(NULL), NULL); if(hAdd == NULL) MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR); hSub = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "-", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 31, 26, 30, 25, hwnd, (HMENU)IDC_SUB, GetModuleHandle(NULL), NULL); if(hSub == NULL) MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR); hDiv = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "/", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 61, 26, 30, 25, hwnd, (HMENU)IDC_DIV, GetModuleHandle(NULL), NULL); if(hDiv == NULL) MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR); hMul = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "*", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 91, 26, 30, 25, hwnd, (HMENU)IDC_MUL, GetModuleHandle(NULL), NULL); if(hMul == NULL) MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR); hEqa = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "=", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 121, 26, 30, 25, hwnd, (HMENU)IDC_EQA, GetModuleHandle(NULL), NULL); if(hEqa == NULL) MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR); hClear = CreateWindowEx(WS_EX_CLIENTEDGE, "BUTTON", "CE", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 121, 0, 30, 25, hwnd, (HMENU)IDC_Clear, GetModuleHandle(NULL), NULL); if(hClear == NULL) MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR); hOutput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_NUMBER , 0, 0, 121, 25, hwnd, (HMENU)IDC_OUTPUT, GetModuleHandle(NULL), NULL); if(hOutput == NULL) MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR); break; case WM_DESTROY: PostQuitMessage(WM_QUIT); break; case WM_COMMAND: switch(LOWORD(wParam)){ case IDC_ADD: switch(HIWORD(wParam)){ case BN_CLICKED: recent=GetDlgItemInt(hwnd, IDC_OUTPUT, NULL, FALSE); total=calc_total(ADD, recent); SetDlgItemInt(hwnd, IDC_OUTPUT, total, FALSE); break; } break; case IDC_SUB: switch(HIWORD(wParam)){ case BN_CLICKED: recent=GetDlgItemInt(hwnd, IDC_OUTPUT, NULL, FALSE); total=calc_total(SUB, recent); SetDlgItemInt(hwnd, IDC_OUTPUT, total, FALSE); break; } break; case IDC_DIV: switch(HIWORD(wParam)){ case BN_CLICKED: recent=GetDlgItemInt(hwnd, IDC_OUTPUT, NULL, FALSE); total=calc_total(DIV, recent); SetDlgItemInt(hwnd, IDC_OUTPUT, total, FALSE); break; } break; case IDC_MUL: switch(HIWORD(wParam)){ case BN_CLICKED: recent=GetDlgItemInt(hwnd, IDC_OUTPUT, NULL, FALSE); total=calc_total(MUL, recent); SetDlgItemInt(hwnd, IDC_OUTPUT, total, FALSE); break; } break; case IDC_Clear: switch(HIWORD(wParam)){ case BN_CLICKED: recent=0; total=0; SetDlgItemInt(hwnd, IDC_OUTPUT, total, FALSE); break; } break; case IDC_EQA: switch(HIWORD(wParam)){ case BN_CLICKED: recent=GetDlgItemInt(hwnd, IDC_OUTPUT, NULL, FALSE); total=calc_total(EQA, recent); SetDlgItemInt(hwnd, IDC_OUTPUT, total, FALSE); break; } break; } break; default: break; } return (DefWindowProc(hwnd, message, wParam, lParam));}int calc_total(int OperationType, int newInput){ switch(currentOperation){ case ADD: total=total+newInput; break; case SUB: total=total-newInput; break; case DIV: total=total/newInput; break; case MUL: total=total*newInput; break; } currentOperation=OperationType; if(first){ total=newInput; first=false; } return total;}