|
|
1.1 ! root 1: /*------------------------------------- ! 2: HEXCALC.C -- Hexadecimal Calculator ! 3: -------------------------------------*/ ! 4: ! 5: #define INCL_WIN ! 6: #include <os2.h> ! 7: #include <ctype.h> ! 8: #include <limits.h> ! 9: #include <stdlib.h> ! 10: #include <string.h> ! 11: #include "hexcalc.h" ! 12: ! 13: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ; ! 14: ! 15: int main (void) ! 16: { ! 17: HAB hab ; ! 18: HMQ hmq ; ! 19: HWND hwndFrame ; ! 20: QMSG qmsg ; ! 21: ! 22: hab = WinInitialize (0) ; ! 23: hmq = WinCreateMsgQueue (hab, 0) ; ! 24: ! 25: WinRegisterClass (hab, CLIENTCLASS, ClientWndProc, 0L, 0) ; ! 26: ! 27: hwndFrame = WinLoadDlg (HWND_DESKTOP, HWND_DESKTOP, ! 28: NULL, NULL, ID_HEXCALC, NULL) ; ! 29: ! 30: WinSendMsg (hwndFrame, WM_SETICON, ! 31: WinLoadPointer (HWND_DESKTOP, NULL, ID_ICON), NULL) ; ! 32: ! 33: WinSetFocus (HWND_DESKTOP, WinWindowFromID (hwndFrame, FID_CLIENT)) ; ! 34: ! 35: while (WinGetMsg (hab, &qmsg, NULL, 0, 0)) ! 36: WinDispatchMsg (hab, &qmsg) ; ! 37: ! 38: WinDestroyWindow (hwndFrame) ; ! 39: WinDestroyMsgQueue (hmq) ; ! 40: WinTerminate (hab) ; ! 41: return 0 ; ! 42: } ! 43: ! 44: void ShowNumber (HWND hwnd, ULONG ulNumber) ! 45: { ! 46: CHAR szBuffer [20] ; ! 47: ! 48: WinSetWindowText (WinWindowFromID (hwnd, ESCAPE), ! 49: strupr (ltoa (ulNumber, szBuffer, 16))) ; ! 50: } ! 51: ! 52: ULONG CalcIt (ULONG ulFirstNum, SHORT sOperation, ULONG ulNum) ! 53: { ! 54: switch (sOperation) ! 55: { ! 56: case '=' : return ulNum ; ! 57: case '+' : return ulFirstNum + ulNum ; ! 58: case '-' : return ulFirstNum - ulNum ; ! 59: case '*' : return ulFirstNum * ulNum ; ! 60: case '&' : return ulFirstNum & ulNum ; ! 61: case '|' : return ulFirstNum | ulNum ; ! 62: case '^' : return ulFirstNum ^ ulNum ; ! 63: case '<' : return ulFirstNum << ulNum ; ! 64: case '>' : return ulFirstNum >> ulNum ; ! 65: case '/' : return ulNum ? ulFirstNum / ulNum : ULONG_MAX ; ! 66: case '%' : return ulNum ? ulFirstNum % ulNum : ULONG_MAX ; ! 67: default : return 0L ; ! 68: } ! 69: } ! 70: ! 71: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 72: { ! 73: static BOOL fNewNumber = TRUE ; ! 74: static ULONG ulNumber, ulFirstNum ; ! 75: static SHORT sOperation = '=' ; ! 76: HWND hwndButton ; ! 77: SHORT idButton ; ! 78: ! 79: switch (msg) ! 80: { ! 81: case WM_CHAR: ! 82: if (CHARMSG(&msg)->fs & KC_KEYUP) ! 83: return 0 ; ! 84: ! 85: if (CHARMSG(&msg)->fs & KC_VIRTUALKEY) ! 86: switch (CHARMSG(&msg)->vkey) ! 87: { ! 88: case VK_LEFT: ! 89: if (!(CHARMSG(&msg)->fs & KC_CHAR)) ! 90: { ! 91: CHARMSG(&msg)->chr = '\b' ; ! 92: CHARMSG(&msg)->fs |= KC_CHAR ; ! 93: } ! 94: break ; ! 95: ! 96: case VK_ESC: ! 97: CHARMSG(&msg)->chr = ESCAPE ; ! 98: CHARMSG(&msg)->fs |= KC_CHAR ; ! 99: break ; ! 100: ! 101: case VK_NEWLINE: ! 102: case VK_ENTER: ! 103: CHARMSG(&msg)->chr = '=' ; ! 104: CHARMSG(&msg)->fs |= KC_CHAR ; ! 105: break ; ! 106: } ! 107: ! 108: if (CHARMSG(&msg)->fs & KC_CHAR) ! 109: { ! 110: CHARMSG(&msg)->chr = toupper (CHARMSG(&msg)->chr) ; ! 111: ! 112: if (hwndButton = WinWindowFromID (hwnd,CHARMSG(&msg)->chr)) ! 113: WinSendMsg (hwndButton, BM_CLICK, NULL, NULL) ; ! 114: else ! 115: WinAlarm (HWND_DESKTOP, WA_ERROR) ; ! 116: } ! 117: return 1 ; ! 118: ! 119: case WM_COMMAND: ! 120: idButton = COMMANDMSG(&msg)->cmd ; ! 121: ! 122: if (idButton == '\b') // backspace ! 123: ShowNumber (hwnd, ulNumber /= 16) ; ! 124: ! 125: else if (idButton == ESCAPE) // escape ! 126: ShowNumber (hwnd, ulNumber = 0L) ; ! 127: ! 128: else if (isxdigit (idButton)) // hex digit ! 129: { ! 130: if (fNewNumber) ! 131: { ! 132: ulFirstNum = ulNumber ; ! 133: ulNumber = 0L ; ! 134: } ! 135: fNewNumber = FALSE ; ! 136: ! 137: if (ulNumber <= ULONG_MAX >> 4) ! 138: ShowNumber (hwnd, ! 139: ulNumber = 16 * ulNumber + idButton - ! 140: (isdigit (idButton) ? '0' : 'A' - 10)) ; ! 141: else ! 142: WinAlarm (HWND_DESKTOP, WA_ERROR) ; ! 143: } ! 144: else // operation ! 145: { ! 146: if (!fNewNumber) ! 147: ShowNumber (hwnd, ulNumber = ! 148: CalcIt (ulFirstNum, sOperation, ulNumber)) ; ! 149: fNewNumber = TRUE ; ! 150: sOperation = idButton ; ! 151: } ! 152: return 0 ; ! 153: ! 154: case WM_BUTTON1DOWN: ! 155: WinAlarm (HWND_DESKTOP, WA_ERROR) ; ! 156: break ; ! 157: ! 158: case WM_ERASEBACKGROUND: ! 159: return 1 ; ! 160: } ! 161: return WinDefWindowProc (hwnd, msg, mp1, mp2) ; ! 162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.