// 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 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; }