/* * WineCalc (winecalc.c) * * Copyright 2003 James Briggs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include // sprintf #include #include #include #include // #include #include "winecalc.h" #include "dialog.h" #include "stats.h" #include "resource.h" // lame M$ math library doesn't support hyp functions //#ifdef _MSC_VER #define atanh(X) atan(X) #define asinh(X) asin(X) #define acosh(X) acos(X) //#endif // How winecalc works // // 1. In the original calculator, numbers are "extended precision". // We emulate with calcfloat (calcfloat floating point) for now. // Note that recent M$ compilers 5.0 and later do not implement double float, // and do not support 80-bit numbers. Max width is 64-bits. // // 2. 4 temp areas: // // i) current edit buffer value for keystrokes // ii) computed value area for last computation // iii) memory area for MR, MC, MS, M+ // iv) formatted display buffer // // 3. Memory Store works off current buffer, not value // // 4. display limit is 32 numbers plus 10 commas plus one period = 43 characters // // 5. original calc is better called SciCalc and saves settings in win.ini: // // [SciCalc] // layout=1 (0 = scientific mode, 1 = basic mode) // UseSep=1 (0 = no digits separator, 1 = enable digits separator) // // 6. Window Menus // // The menus know their own states, so we don't need to track them // When switching to Standard Calculator Mode, number base is changed to Decimal and Trig Mode to Degrees, // but Word Size Mode is unchanged // // 7. It would be nice to add command line parsing for batch files // // various display error messages static TCHAR err_invalid [CALC_BUF_SIZE]; static TCHAR err_divide_by_zero [CALC_BUF_SIZE]; static TCHAR err_undefined [CALC_BUF_SIZE]; // calculator state is kept here CALC calc; static RECT rFiller; static int keys[CALC_NS_COUNT]['f'+1]; // note: sparse array // map from button press to calc[] index // 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP, PI static const int h[] = { 0, 0, 33, 34, 21, 22, 23, 10, 11, 12, 54, 55, 56 ,57, 58 ,59, 6, 17, 28, 39, 50, 18, 53 }; // enable status of various buttons on sci mode depending on number base static const int btn_toggle[CALC_NS_COUNT][TOGGLE_COUNT] = // 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP,PI { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 } }; static int hms[] = { 64, 65, 66 }; static int hws[] = { 69, 70, 71, 72 }; static int sta[] = { 16, 27, 38, 49 }; static HMENU menus[3]; static TCHAR appname[40]; static int debug; int parse(int wParam, int lParam); HWND hWndDlgStats; extern HWND hWndListBox; HINSTANCE hInstance; int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow ) { MSG msg; WNDCLASS wc; HWND hWnd; HACCEL haccel; TCHAR s[CALC_BUF_SIZE]; int r; hInstance = hInst; r = GetProfileString(TEXT("SciCalc"), TEXT("layout"), TEXT("0"), s, CALC_BUF_SIZE ); calc.sciMode = _ttoi(s); if (calc.sciMode != 0 && calc.sciMode != 1) calc.sciMode = 1; // Standard Mode r = GetProfileString(TEXT("SciCalc"), TEXT("UseSep"), TEXT("0"), s, CALC_BUF_SIZE ); calc.digitGrouping = _ttoi(s); if (calc.digitGrouping != 0 && calc.digitGrouping != 1) calc.digitGrouping = 1; calc.new = 1; // initialize struct values if (!LoadString( hInst, IDS_APPNAME, appname, sizeof(appname) / sizeof(appname[0]))) exit(1); if (!LoadString( hInst, IDS_ERR_INVALID_INPUT, err_invalid, sizeof(err_invalid) / sizeof(err_invalid[0]))) exit(1); if (!LoadString( hInst, IDS_ERR_DIVIDE_BY_ZERO, err_divide_by_zero, sizeof(err_divide_by_zero) / sizeof(err_divide_by_zero[0]))) exit(1); if (!LoadString( hInst, IDS_ERR_UNDEFINED, err_undefined, sizeof(err_undefined) / sizeof(err_undefined[0]))) exit(1); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = MainProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_CALCICON)); wc.hCursor = LoadCursor( NULL, IDI_APPLICATION ); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); wc.lpszMenuName = NULL; wc.lpszClassName = appname; if (!RegisterClass(&wc)) exit(1); hWnd = CreateWindow( appname, appname, WS_CLIPSIBLINGS | (WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX), CW_USEDEFAULT, CW_USEDEFAULT, calc.sciMode ? CALC_STANDARD_WIDTH : CALC_SCIENTIFIC_WIDTH, calc.sciMode ? CALC_STANDARD_HEIGHT : CALC_SCIENTIFIC_HEIGHT, NULL, NULL, hInst, NULL ); if (!hWnd) exit(1); ShowWindow( hWnd, cmdshow ); UpdateWindow( hWnd ); if (!(haccel = LoadAccelerators(hInst, TEXT("MAIN_MENU")))) exit(1); while( GetMessage(&msg, NULL, 0, 0) ) { if (hWndDlgStats == 0 || !IsDialogMessage(hWndDlgStats, &msg)) { if (!TranslateAccelerator( hWnd, haccel, &msg )) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } } return msg.wParam; } LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (msg) { case WM_CREATE: calc.hInst = ((LPCREATESTRUCT) lParam)->hInstance; calc.hWnd = hWnd; InitLuts(); InitCalc( &calc ); InitMenus(calc.hInst); if (calc.sciMode) SetMenu(hWnd, menus[MENU_STD]); else SetMenu(hWnd, menus[MENU_SCIMS]); calc_buffer_display(&calc); return 0; case WM_PAINT: { HDC hMemDC; hdc = BeginPaint( hWnd, &ps ); hMemDC = CreateCompatibleDC( hdc ); DrawCalc( hdc, hMemDC, &ps, &calc ); DeleteDC( hMemDC ); EndPaint( hWnd, &ps ); return 0; } case WM_MOVE: calc.pos.x = (unsigned) LOWORD(lParam); calc.pos.y = (unsigned) HIWORD(lParam); return 0; case WM_DESTROY: { int r; TCHAR s[CALC_BUF_SIZE]; _stprintf(s, TEXT("%d"), calc.sciMode); r = WriteProfileString(TEXT("SciCalc"), TEXT("layout"), s); _stprintf(s, TEXT("%d"), calc.digitGrouping); r = WriteProfileString(TEXT("SciCalc"), TEXT("UseSep"), s); } DestroyCalc( &calc ); DestroyMenus(); PostQuitMessage( 0 ); return 0; case WM_KEYDOWN: switch (wParam) { case VK_F1: calc.next = 1; MessageBox(hWnd, TEXT("No Help Available"), TEXT("Windows Help"), MB_OK); return 0; case VK_F2: // DWORD calc.next = 1; if (!calc.sciMode) { if (calc.numBase == NBASE_DECIMAL) SendMessage(hWnd, WM_COMMAND, ID_CALC_MS_DEGREES, lParam); else SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_DWORD, lParam); } return 0; case VK_F3: // WORD calc.next = 1; if (!calc.sciMode) { if (calc.numBase == NBASE_DECIMAL) SendMessage(hWnd, WM_COMMAND, ID_CALC_MS_RADIANS, lParam); else SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_WORD, lParam); } return 0; case VK_F4: // Byte // Grad calc.next = 1; if (!calc.sciMode) { if (calc.numBase == NBASE_DECIMAL) SendMessage(hWnd, WM_COMMAND, ID_CALC_MS_GRADS, lParam); else SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_BYTE, lParam); } return 0; case VK_F5: // Hex calc.next = 1; if (!calc.sciMode) SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_HEX, lParam); return 0; case VK_F6: // Decimal calc.next = 1; if (!calc.sciMode) SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_DEC, lParam); return 0; case VK_F7: // Octal calc.next = 1; if (!calc.sciMode) SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_OCT, lParam); return 0; case VK_F8: // Binary calc.next = 1; if (!calc.sciMode) SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_BIN, lParam); return 0; case VK_F12: // QWORD calc.next = 1; if (!calc.sciMode) SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_QWORD, lParam); return 0; case VK_F9: // +/- if (!calc.sciMode) SendMessage(hWnd, WM_CHAR, 'Z', lParam); return 0; case VK_INSERT: // Dat calc.next = 1; SendMessage(hWndListBox, LB_INSERTSTRING, -1, (LPARAM)calc.buffer); InvalidateRect(hWndDlgStats, NULL, TRUE); // update list count at bottom edge of dialog UpdateWindow(hWndDlgStats); return 0; case VK_DELETE: calc.next = 1; calc.buffer[0] = TEXT('\0'); calc_buffer_display(&calc); return 0; default: break; } return 0; case WM_CHAR: if (debug) show_debug(&calc, TEXT("Start WM_CHAR"), wParam, lParam); switch (wParam) { case TEXT('\x13'): // Ctrl+S Sta Statistics if (hWndDlgStats) { // Statistics Box already displayed, focus but don't create another one // SetFocus(hWndDlgStats); // SendMessage(hWndDlgStats, WM_SETFOCUS, 0, 0); } else { int i; if (lParam == 1) { for (i=0;i<4;i++) EnableWindow((HWND)calc.cb[sta[i]].hBtn, FALSE); } else { for (i=0;i<4;i++) EnableWindow((HWND)calc.cb[sta[i]].hBtn, TRUE); hWndDlgStats = CreateDialog( // modeless dialog calc.hInst, // handle to application instance TEXT("DLG_STATS"), // identifies dialog box template name hWnd, // handle to owner window StatsDlgProc); // pointer to dialog box procedure if (!hWndDlgStats) exit(1); SendMessage(hWndDlgStats, WM_SETFOCUS, 0, 0); } } break; case TEXT('\x01'): // Ctrl+A Ave Statistics case TEXT('\x04'): // Ctrl+D s Standard Deviation Statistics case TEXT('\x14'): // Ctrl+T Sum Statistics { int i; int n; TCHAR s[CALC_BUF_SIZE]; double val = 0L; double avg = 0L; double total = 0L; double x[1024]; // This is all lame. Here we are querying the list control for items and calculating the total. // We should have an array of intermediate results to work with to avoid roundoff errors, etc. n = SendMessage(hWndListBox, LB_GETCOUNT, 0, 0); for (i=0;i= TEXT('0') && c <= TEXT('9')) || (c >= TEXT('a') && c <= TEXT('f')) || (c >= TEXT('A') && c <= TEXT('F')))) { SendMessage(hWnd, WM_CHAR, c, lParam); } else if ((calc.numBase == NBASE_DECIMAL) && (c >= TEXT('0') && c <= TEXT('9'))) { SendMessage(hWnd, WM_CHAR, c, lParam); } else if ((calc.numBase == NBASE_OCTAL) && (c >= TEXT('0') && c <= TEXT('7'))) { SendMessage(hWnd, WM_CHAR, c, lParam); } else if ((calc.numBase == NBASE_BINARY) && (c == TEXT('0') || c == TEXT('1'))) { SendMessage(hWnd, WM_CHAR, c, lParam); } else if (c == TEXT('.') || c == TEXT(',') || c == TEXT('e') || c == TEXT('E') || c == TEXT('+') || c == TEXT('-')) { SendMessage(hWnd, WM_CHAR, c, lParam); } else if (c == TEXT(' ') || // eat harmless trash here c == TEXT(';') || c == TEXT(':')) { ; // noop } else { // extra spicy trash gets noticed MessageBeep(0); // uh, beeps can get annoying. maybe rate limit. } } } } } } break; default: { parse(wParam, lParam); } } // switch WM_CHAR calc_buffer_display(&calc); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case IDM_COPY: SendMessage(hWnd, WM_CHAR, TEXT('\x03'), lParam); return 0; case IDM_PASTE: SendMessage(hWnd, WM_CHAR, TEXT('\x16'), lParam); return 0; case IDM_MODE_STANDARD: if (!calc.sciMode) { int i; RECT lpRect; calc.sciMode = 1; calc.trigMode = TRIGMODE_DEGREES; calc.numBase = NBASE_DECIMAL; EnableWindow(hWnd, FALSE); for (i=1;ihInst; HFONT hFont = GetStockObject(DEFAULT_GUI_FONT); calc->trigMode = TRIGMODE_DEGREES; calc->numBase = NBASE_DECIMAL; calc->init = 1; if (calc->new) { calc->new = 0; calc->value = 0; calc->memory = 0; calc->displayMode = 0; calc->buffer[0] = TEXT('\0'); _tcscpy(calc->display, TEXT("0.")); calc->err = 0; calc->next = TEXT('\0'); calc->wordSize = WORDSIZE_QWORD; calc->invMode = 0; calc->hypMode = 0; } if (calc->sciMode) { calc->numButtons = CALC_BUTTONS_STANDARD; // Row 1 (top) skipx = MARGIN_LEFT; skipy = CALC_STANDARD_MARGIN_TOP + CALC_EDIT_HEIGHT; calc->cb[0].id = 0; _tcscpy(calc->cb[0].label,TEXT("FILLER")); calc->cb[0].color = CALC_COLOR_BLUE; calc->cb[0].r.left = skipx + 4; calc->cb[0].r.top = skipy + 2; calc->cb[0].r.right = skipx + SZ_FILLER_X - 2; calc->cb[0].r.bottom = skipy + SZ_FILLER_Y - 2; calc->cb[0].enable = 1; skipx = SZ_FILLER_X + MARGIN_STANDARD_BIG_X + 11; calc->cb[1].id = ID_CALC_BACKSPACE; LoadString( hInst, IDS_BTN_BACKSPACE, calc->cb[1].label, sizeof(calc->cb[1].label) / sizeof(calc->cb[1].label[0])); calc->cb[1].color = CALC_COLOR_RED; calc->cb[1].r.left = skipx; calc->cb[1].r.top = skipy; calc->cb[1].r.right = SZ_BIGBTN_X; calc->cb[1].r.bottom = SZ_BIGBTN_Y; calc->cb[1].enable = 1; skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; calc->cb[2].id = ID_CALC_CLEAR_ENTRY; LoadString( hInst, IDS_BTN_CLEAR_ENTRY, calc->cb[2].label, sizeof(calc->cb[2].label) / sizeof(calc->cb[2].label[0])); calc->cb[2].color = CALC_COLOR_RED; calc->cb[2].r.left = skipx; calc->cb[2].r.top = skipy; calc->cb[2].r.right = SZ_BIGBTN_X; calc->cb[2].r.bottom = SZ_BIGBTN_Y; calc->cb[2].enable = 1; skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; calc->cb[3].id = ID_CALC_CLEAR_ALL; LoadString( hInst, IDS_BTN_CLEAR_ALL, calc->cb[3].label, sizeof(calc->cb[3].label) / sizeof(calc->cb[3].label[0])); calc->cb[3].color = CALC_COLOR_RED; calc->cb[3].r.left = skipx; calc->cb[3].r.top = skipy; calc->cb[3].r.right = SZ_BIGBTN_X; calc->cb[3].r.bottom = SZ_BIGBTN_Y; calc->cb[3].enable = 1; // Row 2 skipx = MARGIN_LEFT; skipy += SZ_BIGBTN_Y + MARGIN_BIG_Y; calc->cb[4].id = ID_CALC_MEM_CLEAR; LoadString( hInst, IDS_BTN_MEM_CLEAR, calc->cb[4].label, sizeof(calc->cb[4].label) / sizeof(calc->cb[4].label[0])); calc->cb[4].color = CALC_COLOR_RED; calc->cb[4].r.left = skipx; calc->cb[4].r.top = skipy; calc->cb[4].r.right = SZ_MEDBTN_X; calc->cb[4].r.bottom = SZ_MEDBTN_Y; calc->cb[4].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; calc->cb[5].id = ID_CALC_SEVEN; _tcscpy(calc->cb[5].label,TEXT("7")); calc->cb[5].color = CALC_COLOR_BLUE; calc->cb[5].r.left = skipx; calc->cb[5].r.top = skipy; calc->cb[5].r.right = SZ_MEDBTN_X; calc->cb[5].r.bottom = SZ_MEDBTN_Y; calc->cb[5].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[6].id = ID_CALC_EIGHT; _tcscpy(calc->cb[6].label,TEXT("8")); calc->cb[6].color = CALC_COLOR_BLUE; calc->cb[6].r.left = skipx; calc->cb[6].r.top = skipy; calc->cb[6].r.right = SZ_MEDBTN_X; calc->cb[6].r.bottom = SZ_MEDBTN_Y; calc->cb[6].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[7].id = ID_CALC_NINE; _tcscpy(calc->cb[7].label,TEXT("9")); calc->cb[7].color = CALC_COLOR_BLUE; calc->cb[7].r.left = skipx; calc->cb[7].r.top = skipy; calc->cb[7].r.right = SZ_MEDBTN_X; calc->cb[7].r.bottom = SZ_MEDBTN_Y; calc->cb[7].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[8].id = ID_CALC_DIVIDE; _tcscpy(calc->cb[8].label,TEXT("/")); calc->cb[8].color = CALC_COLOR_RED; calc->cb[8].r.left = skipx; calc->cb[8].r.top = skipy; calc->cb[8].r.right = SZ_MEDBTN_X; calc->cb[8].r.bottom = SZ_MEDBTN_Y; calc->cb[8].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[9].id = ID_CALC_SQRT; LoadString( hInst, IDS_BTN_SQRT, calc->cb[9].label, sizeof(calc->cb[9].label) / sizeof(calc->cb[9].label[0])); calc->cb[9].color = CALC_COLOR_BLUE; calc->cb[9].r.left = skipx; calc->cb[9].r.top = skipy; calc->cb[9].r.right = SZ_MEDBTN_X; calc->cb[9].r.bottom = SZ_MEDBTN_Y; calc->cb[9].enable = 1; // Row 3 skipx = MARGIN_LEFT; skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; calc->cb[10].id = ID_CALC_MEM_RECALL; LoadString( hInst, IDS_BTN_MEM_RECALL, calc->cb[10].label, sizeof(calc->cb[10].label) / sizeof(calc->cb[10].label[0])); calc->cb[10].color = CALC_COLOR_RED; calc->cb[10].r.left = skipx; calc->cb[10].r.top = skipy; calc->cb[10].r.right = SZ_MEDBTN_X; calc->cb[10].r.bottom = SZ_MEDBTN_Y; calc->cb[10].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; calc->cb[11].id = ID_CALC_FOUR; _tcscpy(calc->cb[11].label,TEXT("4")); calc->cb[11].color = CALC_COLOR_BLUE; calc->cb[11].r.left = skipx; calc->cb[11].r.top = skipy; calc->cb[11].r.right = SZ_MEDBTN_X; calc->cb[11].r.bottom = SZ_MEDBTN_Y; calc->cb[11].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[12].id = ID_CALC_FIVE; _tcscpy(calc->cb[12].label,TEXT("5")); calc->cb[12].color = CALC_COLOR_BLUE; calc->cb[12].r.left = skipx; calc->cb[12].r.top = skipy; calc->cb[12].r.right = SZ_MEDBTN_X; calc->cb[12].r.bottom = SZ_MEDBTN_Y; calc->cb[12].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[13].id = ID_CALC_SIX; _tcscpy(calc->cb[13].label,TEXT("6")); calc->cb[13].color = CALC_COLOR_BLUE; calc->cb[13].r.left = skipx; calc->cb[13].r.top = skipy; calc->cb[13].r.right = SZ_MEDBTN_X; calc->cb[13].r.bottom = SZ_MEDBTN_Y; calc->cb[13].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[14].id = ID_CALC_MULTIPLY; _tcscpy(calc->cb[14].label,TEXT("*")); calc->cb[14].color = CALC_COLOR_RED; calc->cb[14].r.left = skipx; calc->cb[14].r.top = skipy; calc->cb[14].r.right = SZ_MEDBTN_X; calc->cb[14].r.bottom = SZ_MEDBTN_Y; calc->cb[14].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[15].id = ID_CALC_PERCENT; _tcscpy(calc->cb[15].label,TEXT("%")); calc->cb[15].color = CALC_COLOR_BLUE; calc->cb[15].r.left = skipx; calc->cb[15].r.top = skipy; calc->cb[15].r.right = SZ_MEDBTN_X; calc->cb[15].r.bottom = SZ_MEDBTN_Y; calc->cb[15].enable = 1; // Row 4 skipx = MARGIN_LEFT; skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; calc->cb[16].id = ID_CALC_MEM_STORE; LoadString( hInst, IDS_BTN_MEM_STORE, calc->cb[16].label, sizeof(calc->cb[16].label) / sizeof(calc->cb[16].label[0])); calc->cb[16].color = CALC_COLOR_RED; calc->cb[16].r.left = skipx; calc->cb[16].r.top = skipy; calc->cb[16].r.right = SZ_MEDBTN_X; calc->cb[16].r.bottom = SZ_MEDBTN_Y; calc->cb[16].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; calc->cb[17].id = ID_CALC_ONE; _tcscpy(calc->cb[17].label,TEXT("1")); calc->cb[17].color = CALC_COLOR_BLUE; calc->cb[17].r.left = skipx; calc->cb[17].r.top = skipy; calc->cb[17].r.right = SZ_MEDBTN_X; calc->cb[17].r.bottom = SZ_MEDBTN_Y; calc->cb[17].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[18].id = ID_CALC_TWO; _tcscpy(calc->cb[18].label,TEXT("2")); calc->cb[18].color = CALC_COLOR_BLUE; calc->cb[18].r.left = skipx; calc->cb[18].r.top = skipy; calc->cb[18].r.right = SZ_MEDBTN_X; calc->cb[18].r.bottom = SZ_MEDBTN_Y; calc->cb[18].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[19].id = ID_CALC_THREE; _tcscpy(calc->cb[19].label,TEXT("3")); calc->cb[19].color = CALC_COLOR_BLUE; calc->cb[19].r.left = skipx; calc->cb[19].r.top = skipy; calc->cb[19].r.right = SZ_MEDBTN_X; calc->cb[19].r.bottom = SZ_MEDBTN_Y; calc->cb[19].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[20].id = ID_CALC_MINUS; _tcscpy(calc->cb[20].label,TEXT("-")); calc->cb[20].color = CALC_COLOR_RED; calc->cb[20].r.left = skipx; calc->cb[20].r.top = skipy; calc->cb[20].r.right = SZ_MEDBTN_X; calc->cb[20].r.bottom = SZ_MEDBTN_Y; calc->cb[20].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[21].id = ID_CALC_RECIPROCAL; _tcscpy(calc->cb[21].label,TEXT("1/x")); calc->cb[21].color = CALC_COLOR_RED; calc->cb[21].r.left = skipx; calc->cb[21].r.top = skipy; calc->cb[21].r.right = SZ_MEDBTN_X; calc->cb[21].r.bottom = SZ_MEDBTN_Y; calc->cb[21].enable = 1; // Row 5 (bottom) skipx = MARGIN_LEFT; skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; calc->cb[22].id = ID_CALC_MEM_PLUS; LoadString( hInst, IDS_BTN_MEM_PLUS, calc->cb[22].label, sizeof(calc->cb[22].label) / sizeof(calc->cb[22].label[0])); calc->cb[22].color = CALC_COLOR_RED; calc->cb[22].r.left = skipx; calc->cb[22].r.top = skipy; calc->cb[22].r.right = SZ_MEDBTN_X; calc->cb[22].r.bottom = SZ_MEDBTN_Y; calc->cb[22].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; calc->cb[23].id = ID_CALC_ZERO; _tcscpy(calc->cb[23].label,TEXT("0")); calc->cb[23].color = CALC_COLOR_BLUE; calc->cb[23].r.left = skipx; calc->cb[23].r.top = skipy; calc->cb[23].r.right = SZ_MEDBTN_X; calc->cb[23].r.bottom = SZ_MEDBTN_Y; calc->cb[23].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[24].id = ID_CALC_SIGN; _tcscpy(calc->cb[24].label,TEXT("+/-")); calc->cb[24].color = CALC_COLOR_RED; calc->cb[24].r.left = skipx; calc->cb[24].r.top = skipy; calc->cb[24].r.right = SZ_MEDBTN_X; calc->cb[24].r.bottom = SZ_MEDBTN_Y; calc->cb[24].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[25].id = ID_CALC_DECIMAL; _tcscpy(calc->cb[25].label,TEXT(".")); calc->cb[25].color = CALC_COLOR_BLUE; calc->cb[25].r.left = skipx; calc->cb[25].r.top = skipy; calc->cb[25].r.right = SZ_MEDBTN_X; calc->cb[25].r.bottom = SZ_MEDBTN_Y; calc->cb[25].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[26].id = ID_CALC_PLUS; _tcscpy(calc->cb[26].label,TEXT("+")); calc->cb[26].color = CALC_COLOR_RED; calc->cb[26].r.left = skipx; calc->cb[26].r.top = skipy; calc->cb[26].r.right = SZ_MEDBTN_X; calc->cb[26].r.bottom = SZ_MEDBTN_Y; calc->cb[26].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[27].id = ID_CALC_EQUALS; _tcscpy(calc->cb[27].label,TEXT("=")); calc->cb[27].color = CALC_COLOR_RED; calc->cb[27].r.left = skipx; calc->cb[27].r.top = skipy; calc->cb[27].r.right = SZ_MEDBTN_X; calc->cb[27].r.bottom = SZ_MEDBTN_Y; calc->cb[27].enable = 1; } else { calc->numButtons = CALC_BUTTONS_SCIENTIFIC; // Row 1 (top) skipx = MARGIN_LEFT; skipy = CALC_SCIENTIFIC_MARGIN_TOP + CALC_EDIT_HEIGHT - 1; calc->cb[0].id = 0; _tcscpy(calc->cb[0].label,TEXT("FILLER")); calc->cb[0].color = CALC_COLOR_BLUE; calc->cb[0].r.left = skipx + 4 * SZ_MEDBTN_X + 2 * SZ_SPACER_X + 2 * MARGIN_SMALL_X + 12; calc->cb[0].r.top = skipy; calc->cb[0].r.right = skipx + 4 * SZ_MEDBTN_X + 2 * SZ_SPACER_X + 2 * MARGIN_SMALL_X + SZ_FILLER_X + 4; calc->cb[0].r.bottom = skipy + SZ_FILLER_Y - 6; calc->cb[0].enable = 1; calc->cb[1].id = 0; _tcscpy(calc->cb[1].label,TEXT("FILLER")); calc->cb[1].color = CALC_COLOR_BLUE; calc->cb[1].r.left = skipx + 3 * SZ_MEDBTN_X + SZ_SPACER_X + 2 * MARGIN_SMALL_X + 8; calc->cb[1].r.top = skipy; calc->cb[1].r.right = skipx + 3 * SZ_MEDBTN_X + SZ_SPACER_X + 2 * MARGIN_SMALL_X + SZ_FILLER_X + 0; calc->cb[1].r.bottom = skipy + SZ_FILLER_Y - 6; calc->cb[1].enable = 1; skipx += SZ_FILLER_X + MARGIN_SMALL_X; skipx = MARGIN_BIG_X; calc->cb[2].id = ID_CALC_BACKSPACE; LoadString( hInst, IDS_BTN_BACKSPACE, calc->cb[2].label, sizeof(calc->cb[2].label) / sizeof(calc->cb[2].label[0])); calc->cb[2].color = CALC_COLOR_RED; calc->cb[2].r.left = skipx; calc->cb[2].r.top = skipy; calc->cb[2].r.right = SZ_BIGBTN_X; calc->cb[2].r.bottom = SZ_BIGBTN_Y; calc->cb[2].enable = 1; skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; calc->cb[3].id = ID_CALC_CLEAR_ENTRY; LoadString( hInst, IDS_BTN_CLEAR_ENTRY, calc->cb[3].label, sizeof(calc->cb[3].label) / sizeof(calc->cb[3].label[0])); calc->cb[3].color = CALC_COLOR_RED; calc->cb[3].r.left = skipx; calc->cb[3].r.top = skipy; calc->cb[3].r.right = SZ_BIGBTN_X; calc->cb[3].r.bottom = SZ_BIGBTN_Y; calc->cb[3].enable = 1; skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; calc->cb[4].id = ID_CALC_CLEAR_ALL; LoadString( hInst, IDS_BTN_CLEAR_ALL, calc->cb[4].label, sizeof(calc->cb[4].label) / sizeof(calc->cb[4].label[0])); calc->cb[4].color = CALC_COLOR_RED; calc->cb[4].r.left = skipx; calc->cb[4].r.top = skipy; calc->cb[4].r.right = SZ_BIGBTN_X; calc->cb[4].r.bottom = SZ_BIGBTN_Y; calc->cb[4].enable = 1; // Row 2 skipx = MARGIN_LEFT; skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; calc->cb[5].id = ID_CALC_STA; _tcscpy(calc->cb[5].label,TEXT("Sta")); calc->cb[5].color = CALC_COLOR_GRAY; calc->cb[5].r.left = skipx; calc->cb[5].r.top = skipy; calc->cb[5].r.right = SZ_MEDBTN_X; calc->cb[5].r.bottom = SZ_MEDBTN_Y; calc->cb[5].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[6].id = ID_CALC_FE; _tcscpy(calc->cb[6].label,TEXT("F-E")); calc->cb[6].color = CALC_COLOR_MAGENTA; calc->cb[6].r.left = skipx; calc->cb[6].r.top = skipy; calc->cb[6].r.right = SZ_MEDBTN_X; calc->cb[6].r.bottom = SZ_MEDBTN_Y; calc->cb[6].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[7].id = ID_CALC_LEFTPAREN; _tcscpy(calc->cb[7].label,TEXT("(")); calc->cb[7].color = CALC_COLOR_MAGENTA; calc->cb[7].r.left = skipx; calc->cb[7].r.top = skipy; calc->cb[7].r.right = SZ_MEDBTN_X; calc->cb[7].r.bottom = SZ_MEDBTN_Y; calc->cb[7].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[8].id = ID_CALC_RIGHTPAREN; _tcscpy(calc->cb[8].label,TEXT(")")); calc->cb[8].color = CALC_COLOR_MAGENTA; calc->cb[8].r.left = skipx; calc->cb[8].r.top = skipy; calc->cb[8].r.right = SZ_MEDBTN_X; calc->cb[8].r.bottom = SZ_MEDBTN_Y; calc->cb[8].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[9].id = ID_CALC_MEM_CLEAR; LoadString( hInst, IDS_BTN_MEM_CLEAR, calc->cb[9].label, sizeof(calc->cb[9].label) / sizeof(calc->cb[9].label[0])); calc->cb[9].color = CALC_COLOR_RED; calc->cb[9].r.left = skipx; calc->cb[9].r.top = skipy; calc->cb[9].r.right = SZ_MEDBTN_X; calc->cb[9].r.bottom = SZ_MEDBTN_Y; calc->cb[9].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[10].id = ID_CALC_SEVEN; _tcscpy(calc->cb[10].label,TEXT("7")); calc->cb[10].color = CALC_COLOR_BLUE; calc->cb[10].r.left = skipx; calc->cb[10].r.top = skipy; calc->cb[10].r.right = SZ_MEDBTN_X; calc->cb[10].r.bottom = SZ_MEDBTN_Y; calc->cb[10].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[11].id = ID_CALC_EIGHT; _tcscpy(calc->cb[11].label,TEXT("8")); calc->cb[11].color = CALC_COLOR_BLUE; calc->cb[11].r.left = skipx; calc->cb[11].r.top = skipy; calc->cb[11].r.right = SZ_MEDBTN_X; calc->cb[11].r.bottom = SZ_MEDBTN_Y; calc->cb[11].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[12].id = ID_CALC_NINE; _tcscpy(calc->cb[12].label,TEXT("9")); calc->cb[12].color = CALC_COLOR_BLUE; calc->cb[12].r.left = skipx; calc->cb[12].r.top = skipy; calc->cb[12].r.right = SZ_MEDBTN_X; calc->cb[12].r.bottom = SZ_MEDBTN_Y; calc->cb[12].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[13].id = ID_CALC_DIVIDE; _tcscpy(calc->cb[13].label,TEXT("/")); calc->cb[13].color = CALC_COLOR_RED; calc->cb[13].r.left = skipx; calc->cb[13].r.top = skipy; calc->cb[13].r.right = SZ_MEDBTN_X; calc->cb[13].r.bottom = SZ_MEDBTN_Y; calc->cb[13].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[14].id = ID_CALC_MOD; _tcscpy(calc->cb[14].label,TEXT("Mod")); calc->cb[14].color = CALC_COLOR_RED; calc->cb[14].r.left = skipx; calc->cb[14].r.top = skipy; calc->cb[14].r.right = SZ_MEDBTN_X; calc->cb[14].r.bottom = SZ_MEDBTN_Y; calc->cb[14].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[15].id = ID_CALC_AND; _tcscpy(calc->cb[15].label,TEXT("And")); calc->cb[15].color = CALC_COLOR_RED; calc->cb[15].r.left = skipx; calc->cb[15].r.top = skipy; calc->cb[15].r.right = SZ_MEDBTN_X; calc->cb[15].r.bottom = SZ_MEDBTN_Y; calc->cb[15].enable = 1; // Row 3 skipx = MARGIN_LEFT; skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; calc->cb[16].id = ID_CALC_AVE; _tcscpy(calc->cb[16].label,TEXT("Ave")); calc->cb[16].color = CALC_COLOR_GRAY; calc->cb[16].r.left = skipx; calc->cb[16].r.top = skipy; calc->cb[16].r.right = SZ_MEDBTN_X; calc->cb[16].r.bottom = SZ_MEDBTN_Y; calc->cb[16].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[17].id = ID_CALC_DMS; _tcscpy(calc->cb[17].label,TEXT("dms")); calc->cb[17].color = CALC_COLOR_MAGENTA; calc->cb[17].r.left = skipx; calc->cb[17].r.top = skipy; calc->cb[17].r.right = SZ_MEDBTN_X; calc->cb[17].r.bottom = SZ_MEDBTN_Y; calc->cb[17].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[18].id = ID_CALC_EXP; _tcscpy(calc->cb[18].label,TEXT("Exp")); calc->cb[18].color = CALC_COLOR_MAGENTA; calc->cb[18].r.left = skipx; calc->cb[18].r.top = skipy; calc->cb[18].r.right = SZ_MEDBTN_X; calc->cb[18].r.bottom = SZ_MEDBTN_Y; calc->cb[18].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[19].id = ID_CALC_LN; _tcscpy(calc->cb[19].label,TEXT("ln")); calc->cb[19].color = CALC_COLOR_MAGENTA; calc->cb[19].r.left = skipx; calc->cb[19].r.top = skipy; calc->cb[19].r.right = SZ_MEDBTN_X; calc->cb[19].r.bottom = SZ_MEDBTN_Y; calc->cb[19].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[20].id = ID_CALC_MEM_RECALL; _tcscpy(calc->cb[20].label,TEXT("MR")); calc->cb[20].color = CALC_COLOR_RED; calc->cb[20].r.left = skipx; calc->cb[20].r.top = skipy; calc->cb[20].r.right = SZ_MEDBTN_X; calc->cb[20].r.bottom = SZ_MEDBTN_Y; calc->cb[20].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[21].id = ID_CALC_FOUR; _tcscpy(calc->cb[21].label,TEXT("4")); calc->cb[21].color = CALC_COLOR_BLUE; calc->cb[21].r.left = skipx; calc->cb[21].r.top = skipy; calc->cb[21].r.right = SZ_MEDBTN_X; calc->cb[21].r.bottom = SZ_MEDBTN_Y; calc->cb[21].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[22].id = ID_CALC_FIVE; _tcscpy(calc->cb[22].label,TEXT("5")); calc->cb[22].color = CALC_COLOR_BLUE; calc->cb[22].r.left = skipx; calc->cb[22].r.top = skipy; calc->cb[22].r.right = SZ_MEDBTN_X; calc->cb[22].r.bottom = SZ_MEDBTN_Y; calc->cb[22].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[23].id = ID_CALC_SIX; _tcscpy(calc->cb[23].label,TEXT("6")); calc->cb[23].color = CALC_COLOR_BLUE; calc->cb[23].r.left = skipx; calc->cb[23].r.top = skipy; calc->cb[23].r.right = SZ_MEDBTN_X; calc->cb[23].r.bottom = SZ_MEDBTN_Y; calc->cb[23].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[24].id = ID_CALC_MULTIPLY; _tcscpy(calc->cb[24].label,TEXT("*")); calc->cb[24].color = CALC_COLOR_RED; calc->cb[24].r.left = skipx; calc->cb[24].r.top = skipy; calc->cb[24].r.right = SZ_MEDBTN_X; calc->cb[24].r.bottom = SZ_MEDBTN_Y; calc->cb[24].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[25].id = ID_CALC_OR; _tcscpy(calc->cb[25].label,TEXT("Or")); calc->cb[25].color = CALC_COLOR_RED; calc->cb[25].r.left = skipx; calc->cb[25].r.top = skipy; calc->cb[25].r.right = SZ_MEDBTN_X; calc->cb[25].r.bottom = SZ_MEDBTN_Y; calc->cb[25].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[26].id = ID_CALC_XOR; _tcscpy(calc->cb[26].label,TEXT("Xor")); calc->cb[26].color = CALC_COLOR_RED; calc->cb[26].r.left = skipx; calc->cb[26].r.top = skipy; calc->cb[26].r.right = SZ_MEDBTN_X; calc->cb[26].r.bottom = SZ_MEDBTN_Y; calc->cb[26].enable = 1; // Row 4 skipx = MARGIN_LEFT; skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; calc->cb[27].id = ID_CALC_SUM; _tcscpy(calc->cb[27].label,TEXT("Sum")); calc->cb[27].color = CALC_COLOR_GRAY; calc->cb[27].r.left = skipx ; calc->cb[27].r.top = skipy; calc->cb[27].r.right = SZ_MEDBTN_X; calc->cb[27].r.bottom = SZ_MEDBTN_Y; calc->cb[27].enable = 0; skipx += MARGIN_SMALL_X + SZ_MEDBTN_X + SZ_SPACER_X; calc->cb[28].id = ID_CALC_SIN; _tcscpy(calc->cb[28].label,TEXT("sin")); calc->cb[28].color = CALC_COLOR_MAGENTA; calc->cb[28].r.left = skipx; calc->cb[28].r.top = skipy; calc->cb[28].r.right = SZ_MEDBTN_X; calc->cb[28].r.bottom = SZ_MEDBTN_Y; calc->cb[28].enable = 1; skipx += MARGIN_SMALL_X + SZ_MEDBTN_X; calc->cb[29].id = ID_CALC_POWER ; _tcscpy(calc->cb[29].label,TEXT("x^y")); calc->cb[29].color = CALC_COLOR_MAGENTA; calc->cb[29].r.left = skipx; calc->cb[29].r.top = skipy; calc->cb[29].r.right = SZ_MEDBTN_X; calc->cb[29].r.bottom = SZ_MEDBTN_Y; calc->cb[29].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[30].id = ID_CALC_LOG10; _tcscpy(calc->cb[30].label,TEXT("log")); calc->cb[30].color = CALC_COLOR_MAGENTA; calc->cb[30].r.left = skipx; calc->cb[30].r.top = skipy; calc->cb[30].r.right = SZ_MEDBTN_X; calc->cb[30].r.bottom = SZ_MEDBTN_Y; calc->cb[30].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[31].id = ID_CALC_MEM_STORE; LoadString( hInst, IDS_BTN_MEM_STORE, calc->cb[31].label, sizeof(calc->cb[31].label) / sizeof(calc->cb[31].label[0])); calc->cb[31].color = CALC_COLOR_RED; calc->cb[31].r.left = skipx; calc->cb[31].r.top = skipy; calc->cb[31].r.right = SZ_MEDBTN_X; calc->cb[31].r.bottom = SZ_MEDBTN_Y; calc->cb[31].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[32].id = ID_CALC_ONE; _tcscpy(calc->cb[32].label,TEXT("1")); calc->cb[32].color = CALC_COLOR_BLUE; calc->cb[32].r.left = skipx; calc->cb[32].r.top = skipy; calc->cb[32].r.right = SZ_MEDBTN_X; calc->cb[32].r.bottom = SZ_MEDBTN_Y; calc->cb[32].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[33].id = ID_CALC_TWO; _tcscpy(calc->cb[33].label,TEXT("2")); calc->cb[33].color = CALC_COLOR_BLUE; calc->cb[33].r.left = skipx; calc->cb[33].r.top = skipy; calc->cb[33].r.right = SZ_MEDBTN_X; calc->cb[33].r.bottom = SZ_MEDBTN_Y; calc->cb[33].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[34].id = ID_CALC_THREE; _tcscpy(calc->cb[34].label,TEXT("3")); calc->cb[34].color = CALC_COLOR_BLUE; calc->cb[34].r.left = skipx; calc->cb[34].r.top = skipy; calc->cb[34].r.right = SZ_MEDBTN_X; calc->cb[34].r.bottom = SZ_MEDBTN_Y; calc->cb[34].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[35].id = ID_CALC_MINUS; _tcscpy(calc->cb[35].label,TEXT("-")); calc->cb[35].color = CALC_COLOR_RED; calc->cb[35].r.left = skipx; calc->cb[35].r.top = skipy; calc->cb[35].r.right = SZ_MEDBTN_X; calc->cb[35].r.bottom = SZ_MEDBTN_Y; calc->cb[35].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[36].id = ID_CALC_LSH; _tcscpy(calc->cb[36].label,TEXT("Lsh")); calc->cb[36].color = CALC_COLOR_RED; calc->cb[36].r.left = skipx; calc->cb[36].r.top = skipy; calc->cb[36].r.right = SZ_MEDBTN_X; calc->cb[36].r.bottom = SZ_MEDBTN_Y; calc->cb[36].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[37].id = ID_CALC_NOT; _tcscpy(calc->cb[37].label,TEXT("Not")); calc->cb[37].color = CALC_COLOR_RED; calc->cb[37].r.left = skipx; calc->cb[37].r.top = skipy; calc->cb[37].r.right = SZ_MEDBTN_X; calc->cb[37].r.bottom = SZ_MEDBTN_Y; calc->cb[37].enable = 1; // Row 5 (bottom) skipx = MARGIN_LEFT; skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; calc->cb[38].id = ID_CALC_S; _tcscpy(calc->cb[38].label,TEXT("s")); calc->cb[38].color = CALC_COLOR_GRAY; calc->cb[38].r.left = skipx; calc->cb[38].r.top = skipy; calc->cb[38].r.right = SZ_MEDBTN_X; calc->cb[38].r.bottom = SZ_MEDBTN_Y; calc->cb[38].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[39].id = ID_CALC_COS; _tcscpy(calc->cb[39].label,TEXT("cos")); calc->cb[39].color = CALC_COLOR_MAGENTA; calc->cb[39].r.left = skipx; calc->cb[39].r.top = skipy; calc->cb[39].r.right = SZ_MEDBTN_X; calc->cb[39].r.bottom = SZ_MEDBTN_Y; calc->cb[39].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[40].id = ID_CALC_CUBE; _tcscpy(calc->cb[40].label,TEXT("x^3")); calc->cb[40].color = CALC_COLOR_MAGENTA; calc->cb[40].r.left = skipx; calc->cb[40].r.top = skipy; calc->cb[40].r.right = SZ_MEDBTN_X; calc->cb[40].r.bottom = SZ_MEDBTN_Y; calc->cb[40].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[41].id = ID_CALC_FACTORIAL; _tcscpy(calc->cb[41].label,TEXT("n!")); calc->cb[41].color = CALC_COLOR_MAGENTA; calc->cb[41].r.left = skipx; calc->cb[41].r.top = skipy; calc->cb[41].r.right = SZ_MEDBTN_X; calc->cb[41].r.bottom = SZ_MEDBTN_Y; calc->cb[41].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[42].id = ID_CALC_MEM_PLUS; LoadString( hInst, IDS_BTN_MEM_PLUS, calc->cb[42].label, sizeof(calc->cb[42].label) / sizeof(calc->cb[42].label[0])); calc->cb[42].color = CALC_COLOR_RED; calc->cb[42].r.left = skipx; calc->cb[42].r.top = skipy; calc->cb[42].r.right = SZ_MEDBTN_X; calc->cb[42].r.bottom = SZ_MEDBTN_Y; calc->cb[42].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[43].id = ID_CALC_ZERO; _tcscpy(calc->cb[43].label,TEXT("0")); calc->cb[43].color = CALC_COLOR_BLUE; calc->cb[43].r.left = skipx; calc->cb[43].r.top = skipy; calc->cb[43].r.right = SZ_MEDBTN_X; calc->cb[43].r.bottom = SZ_MEDBTN_Y; calc->cb[43].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[44].id = ID_CALC_SIGN; _tcscpy(calc->cb[44].label,TEXT("+/-")); calc->cb[44].color = CALC_COLOR_RED; calc->cb[44].r.left = skipx; calc->cb[44].r.top = skipy; calc->cb[44].r.right = SZ_MEDBTN_X; calc->cb[44].r.bottom = SZ_MEDBTN_Y; calc->cb[44].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[45].id = ID_CALC_DECIMAL; _tcscpy(calc->cb[45].label,TEXT(".")); calc->cb[45].color = CALC_COLOR_BLUE; calc->cb[45].r.left = skipx; calc->cb[45].r.top = skipy; calc->cb[45].r.right = SZ_MEDBTN_X; calc->cb[45].r.bottom = SZ_MEDBTN_Y; calc->cb[45].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[46].id = ID_CALC_PLUS; _tcscpy(calc->cb[46].label,TEXT("+")); calc->cb[46].color = CALC_COLOR_RED; calc->cb[46].r.left = skipx; calc->cb[46].r.top = skipy; calc->cb[46].r.right = SZ_MEDBTN_X; calc->cb[46].r.bottom = SZ_MEDBTN_Y; calc->cb[46].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[47].id = ID_CALC_EQUALS; _tcscpy(calc->cb[47].label,TEXT("=")); calc->cb[47].color = CALC_COLOR_RED; calc->cb[47].r.left = skipx; calc->cb[47].r.top = skipy; calc->cb[47].r.right = SZ_MEDBTN_X; calc->cb[47].r.bottom = SZ_MEDBTN_Y; calc->cb[47].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[48].id = ID_CALC_INT; _tcscpy(calc->cb[48].label,TEXT("Int")); calc->cb[48].color = CALC_COLOR_RED; calc->cb[48].r.left = skipx; calc->cb[48].r.top = skipy; calc->cb[48].r.right = SZ_MEDBTN_X; calc->cb[48].r.bottom = SZ_MEDBTN_Y; calc->cb[48].enable = 1; // Row 6 skipx = MARGIN_LEFT; skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; calc->cb[49].id = ID_CALC_DAT; _tcscpy(calc->cb[49].label,TEXT("Dat")); calc->cb[49].color = CALC_COLOR_GRAY; calc->cb[49].r.left = skipx; calc->cb[49].r.top = skipy; calc->cb[49].r.right = SZ_MEDBTN_X; calc->cb[49].r.bottom = SZ_MEDBTN_Y; calc->cb[49].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[50].id = ID_CALC_TAN; _tcscpy(calc->cb[50].label,TEXT("tan")); calc->cb[50].color = CALC_COLOR_MAGENTA; calc->cb[50].r.left = skipx; calc->cb[50].r.top = skipy; calc->cb[50].r.right = SZ_MEDBTN_X; calc->cb[50].r.bottom = SZ_MEDBTN_Y; calc->cb[50].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[51].id = ID_CALC_SQUARE; _tcscpy(calc->cb[51].label,TEXT("x^2")); calc->cb[51].color = CALC_COLOR_MAGENTA; calc->cb[51].r.left = skipx; calc->cb[51].r.top = skipy; calc->cb[51].r.right = SZ_MEDBTN_X; calc->cb[51].r.bottom = SZ_MEDBTN_Y; calc->cb[51].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[52].id = ID_CALC_RECIPROCAL; _tcscpy(calc->cb[52].label,TEXT("1/x")); calc->cb[52].color = CALC_COLOR_MAGENTA; calc->cb[52].r.left = skipx; calc->cb[52].r.top = skipy; calc->cb[52].r.right = SZ_MEDBTN_X; calc->cb[52].r.bottom = SZ_MEDBTN_Y; calc->cb[52].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[53].id = ID_CALC_PI; _tcscpy(calc->cb[53].label,TEXT("pi")); calc->cb[53].color = CALC_COLOR_BLUE; calc->cb[53].r.left = skipx; calc->cb[53].r.top = skipy; calc->cb[53].r.right = SZ_MEDBTN_X; calc->cb[53].r.bottom = SZ_MEDBTN_Y; calc->cb[53].enable = 1; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; calc->cb[54].id = ID_CALC_A; _tcscpy(calc->cb[54].label,TEXT("A")); calc->cb[54].color = CALC_COLOR_GRAY; calc->cb[54].r.left = skipx; calc->cb[54].r.top = skipy; calc->cb[54].r.right = SZ_MEDBTN_X; calc->cb[54].r.bottom = SZ_MEDBTN_Y; calc->cb[54].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[55].id = ID_CALC_B; _tcscpy(calc->cb[55].label,TEXT("B")); calc->cb[55].color = CALC_COLOR_GRAY; calc->cb[55].r.left = skipx; calc->cb[55].r.top = skipy; calc->cb[55].r.right = SZ_MEDBTN_X; calc->cb[55].r.bottom = SZ_MEDBTN_Y; calc->cb[55].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[56].id = ID_CALC_C; _tcscpy(calc->cb[56].label,TEXT("C")); calc->cb[56].color = CALC_COLOR_GRAY; calc->cb[56].r.left = skipx; calc->cb[56].r.top = skipy; calc->cb[56].r.right = SZ_MEDBTN_X; calc->cb[56].r.bottom = SZ_MEDBTN_Y; calc->cb[56].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[57].id = ID_CALC_D; _tcscpy(calc->cb[57].label,TEXT("D")); calc->cb[57].color = CALC_COLOR_GRAY; calc->cb[57].r.left = skipx; calc->cb[57].r.top = skipy; calc->cb[57].r.right = SZ_MEDBTN_X; calc->cb[57].r.bottom = SZ_MEDBTN_Y; calc->cb[57].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[58].id = ID_CALC_E; _tcscpy(calc->cb[58].label,TEXT("E")); calc->cb[58].color = CALC_COLOR_GRAY; calc->cb[58].r.left = skipx; calc->cb[58].r.top = skipy; calc->cb[58].r.right = SZ_MEDBTN_X; calc->cb[58].r.bottom = SZ_MEDBTN_Y; calc->cb[58].enable = 0; skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; calc->cb[59].id = ID_CALC_F; _tcscpy(calc->cb[59].label,TEXT("F")); calc->cb[59].color = CALC_COLOR_GRAY; calc->cb[59].r.left = skipx; calc->cb[59].r.top = skipy; calc->cb[59].r.right = SZ_MEDBTN_X; calc->cb[59].r.bottom = SZ_MEDBTN_Y; calc->cb[59].enable = 0; // Buttons calc->cb[60].id = ID_CALC_NS_HEX; LoadString( hInst, IDS_BTN_SHRT_HEX, calc->cb[60].label, sizeof(calc->cb[60].label) / sizeof(calc->cb[60].label[0])); calc->cb[60].color = CALC_COLOR_GRAY; calc->cb[60].r.left = CALC_NS_HEX_LEFT; calc->cb[60].r.top = CALC_NS_HEX_TOP; calc->cb[60].r.right = SZ_RADIO_NS_X; calc->cb[60].r.bottom = SZ_RADIO_NS_Y; calc->cb[60].enable = 1; calc->cb[61].id = ID_CALC_NS_DEC; LoadString( hInst, IDS_BTN_SHRT_DEC, calc->cb[61].label, sizeof(calc->cb[61].label) / sizeof(calc->cb[61].label[0])); calc->cb[61].color = CALC_COLOR_GRAY; calc->cb[61].r.left = CALC_NS_DEC_LEFT; calc->cb[61].r.top = CALC_NS_DEC_TOP; calc->cb[61].r.right = SZ_RADIO_NS_X; calc->cb[61].r.bottom = SZ_RADIO_NS_Y; calc->cb[61].enable = 1; calc->cb[62].id = ID_CALC_NS_OCT; LoadString( hInst, IDS_BTN_SHRT_OCT, calc->cb[62].label, sizeof(calc->cb[62].label) / sizeof(calc->cb[62].label[0])); calc->cb[62].color = CALC_COLOR_GRAY; calc->cb[62].r.left = CALC_NS_OCT_LEFT; calc->cb[62].r.top = CALC_NS_OCT_TOP; calc->cb[62].r.right = SZ_RADIO_NS_X; calc->cb[62].r.bottom = SZ_RADIO_NS_Y; calc->cb[62].enable = 1; calc->cb[63].id = ID_CALC_NS_BIN; LoadString( hInst, IDS_BTN_SHRT_BIN, calc->cb[63].label, sizeof(calc->cb[63].label) / sizeof(calc->cb[63].label[0])); calc->cb[63].color = CALC_COLOR_GRAY; calc->cb[63].r.left = CALC_NS_BIN_LEFT; calc->cb[63].r.top = CALC_NS_BIN_TOP; calc->cb[63].r.right = SZ_RADIO_NS_X; calc->cb[63].r.bottom = SZ_RADIO_NS_Y; calc->cb[63].enable = 1; calc->cb[64].id = ID_CALC_MS_DEGREES; LoadString( hInst, IDS_BTN_DEGREES, calc->cb[64].label, sizeof(calc->cb[64].label) / sizeof(calc->cb[64].label[0])); calc->cb[64].color = CALC_COLOR_GRAY; calc->cb[64].r.left = CALC_MS_DEGREES_LEFT; calc->cb[64].r.top = CALC_MS_DEGREES_TOP; calc->cb[64].r.right = SZ_RADIO_MS_X; calc->cb[64].r.bottom = SZ_RADIO_MS_Y; calc->cb[64].enable = 1; calc->cb[65].id = ID_CALC_MS_RADIANS; LoadString( hInst, IDS_BTN_RADIANS, calc->cb[65].label, sizeof(calc->cb[65].label) / sizeof(calc->cb[65].label[0])); calc->cb[65].color = CALC_COLOR_GRAY; calc->cb[65].r.left = CALC_MS_RADIANS_LEFT; calc->cb[65].r.top = CALC_MS_RADIANS_TOP; calc->cb[65].r.right = SZ_RADIO_MS_X; calc->cb[65].r.bottom = SZ_RADIO_MS_Y; calc->cb[65].enable = 1; calc->cb[66].id = ID_CALC_MS_GRADS; LoadString( hInst, IDS_BTN_GRADS, calc->cb[66].label, sizeof(calc->cb[66].label) / sizeof(calc->cb[66].label[0])); calc->cb[66].color = CALC_COLOR_GRAY; calc->cb[66].r.left = CALC_MS_GRADS_LEFT; calc->cb[66].r.top = CALC_MS_GRADS_TOP; calc->cb[66].r.right = SZ_RADIO_MS_X; calc->cb[66].r.bottom = SZ_RADIO_MS_Y; calc->cb[66].enable = 1; calc->cb[67].id = ID_CALC_CB_INV; _tcscpy(calc->cb[67].label,TEXT("Inv")); calc->cb[67].color = CALC_COLOR_GRAY; calc->cb[67].r.left = CALC_CB_INV_LEFT; calc->cb[67].r.top = CALC_CB_INV_TOP; calc->cb[67].r.right = SZ_RADIO_CB_X; calc->cb[67].r.bottom = SZ_RADIO_CB_Y; calc->cb[67].enable = 1; calc->cb[68].id = ID_CALC_CB_HYP; _tcscpy(calc->cb[68].label,TEXT("Hyp")); calc->cb[68].color = CALC_COLOR_GRAY; calc->cb[68].r.left = CALC_CB_HYP_LEFT; calc->cb[68].r.top = CALC_CB_HYP_TOP; calc->cb[68].r.right = SZ_RADIO_CB_X; calc->cb[68].r.bottom = SZ_RADIO_CB_Y; calc->cb[68].enable = 1; calc->cb[69].id = ID_CALC_WS_QWORD; _tcscpy(calc->cb[69].label,TEXT("Qword")); calc->cb[69].color = CALC_COLOR_GRAY; calc->cb[69].r.left = CALC_WS_QWORD_LEFT; calc->cb[69].r.top = CALC_WS_QWORD_TOP; calc->cb[69].r.right = SZ_RADIO_WS_X; calc->cb[69].r.bottom = SZ_RADIO_WS_Y; calc->cb[69].enable = 1; calc->cb[70].id = ID_CALC_WS_DWORD; _tcscpy(calc->cb[70].label,TEXT("Dword")); calc->cb[70].color = CALC_COLOR_GRAY; calc->cb[70].r.left = CALC_WS_DWORD_LEFT; calc->cb[70].r.top = CALC_WS_DWORD_TOP; calc->cb[70].r.right = SZ_RADIO_WS_X; calc->cb[70].r.bottom = SZ_RADIO_WS_Y; calc->cb[70].enable = 1; calc->cb[71].id = ID_CALC_WS_WORD; _tcscpy(calc->cb[71].label,TEXT("Word")); calc->cb[71].color = CALC_COLOR_GRAY; calc->cb[71].r.left = CALC_WS_WORD_LEFT; calc->cb[71].r.top = CALC_WS_WORD_TOP; calc->cb[71].r.right = SZ_RADIO_WS_X; calc->cb[71].r.bottom = SZ_RADIO_WS_Y; calc->cb[71].enable = 1; calc->cb[72].id = ID_CALC_WS_BYTE; _tcscpy(calc->cb[72].label,TEXT("Byte")); calc->cb[72].color = CALC_COLOR_GRAY; calc->cb[72].r.left = CALC_WS_BYTE_LEFT; calc->cb[72].r.top = CALC_WS_BYTE_TOP; calc->cb[72].r.right = SZ_RADIO_WS_X; calc->cb[72].r.bottom = SZ_RADIO_WS_Y; calc->cb[72].enable = 1; } // preload clip region for filler squares if (calc->sciMode) { n = 1; rFiller.left = calc->cb[0].r.left; rFiller.top = calc->cb[0].r.top; rFiller.right = calc->cb[0].r.right; rFiller.bottom = calc->cb[0].r.bottom; } else { n = 2; rFiller.left = calc->cb[1].r.left; rFiller.top = calc->cb[1].r.top; rFiller.right = calc->cb[0].r.right; rFiller.bottom = calc->cb[0].r.bottom; } top_button = calc->numButtons - 1; if (!calc->sciMode) top_button -= CALC_NS_COUNT + CALC_MS_COUNT + CALC_CB_COUNT + CALC_WS_COUNT; for (; n <= top_button; n++) { ; calc->cb[n].hBtn = CreateWindow( TEXT("BUTTON"), calc->cb[n].label, WS_VISIBLE | WS_CHILD | WS_BORDER | BS_CENTER | BS_VCENTER | BS_TEXT | (calc->cb[n].enable ? 0 : WS_DISABLED), // BS_FLAT calc->cb[n].r.left, calc->cb[n].r.top, calc->cb[n].r.right, calc->cb[n].r.bottom, calc->hWnd, (HMENU)calc->cb[n].id, calc->hInst, NULL ); if (!calc->cb[n].hBtn) exit(1); SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); } if (!calc->sciMode) { top_button += CALC_NS_COUNT; for (; n<=top_button; n++) { int j = ID_CALC_NS_HEX + n - top_button + CALC_NS_COUNT - 1; calc->cb[n].hBtn = CreateWindow( TEXT("BUTTON"), calc->cb[n].label, WS_VISIBLE | WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_RADIOBUTTON, CALC_NS_OFFSET_X + calc->cb[n].r.left, CALC_NS_OFFSET_Y + calc->cb[n].r.top, calc->cb[n].r.right, calc->cb[n].r.bottom, calc->hWnd, (HMENU)(j), calc->hInst, NULL ); if (!calc->cb[n].hBtn) exit(1); SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); } top_button += CALC_MS_COUNT; for (; n<=top_button; n++) { calc->cb[n].hBtn = CreateWindow( TEXT("BUTTON"), calc->cb[n].label, WS_VISIBLE | WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_RADIOBUTTON, CALC_MS_OFFSET_X + calc->cb[n].r.left, CALC_MS_OFFSET_Y + calc->cb[n].r.top, calc->cb[n].r.right, calc->cb[n].r.bottom, calc->hWnd, (HMENU)(ID_CALC_MS_DEGREES + n - top_button + CALC_MS_COUNT - 1), calc->hInst, NULL ); if (!calc->cb[n].hBtn) exit(1); SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); } top_button += CALC_CB_COUNT; for (; n<=top_button; n++) { calc->cb[n].hBtn = CreateWindow( TEXT("BUTTON"), calc->cb[n].label, WS_VISIBLE | WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_CHECKBOX, CALC_CB_OFFSET_X + calc->cb[n].r.left, CALC_CB_OFFSET_Y + calc->cb[n].r.top, calc->cb[n].r.right, calc->cb[n].r.bottom, calc->hWnd, (HMENU)(ID_CALC_CB_INV + n - top_button + CALC_CB_COUNT - 1), calc->hInst, NULL ); if (!calc->cb[n].hBtn) exit(1); SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); } top_button += CALC_WS_COUNT; for (; n<=top_button; n++) { calc->cb[n].hBtn = CreateWindow( TEXT("BUTTON"), calc->cb[n].label, WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_RADIOBUTTON, CALC_WS_OFFSET_X + calc->cb[n].r.left, CALC_WS_OFFSET_Y + calc->cb[n].r.top, calc->cb[n].r.right, calc->cb[n].r.bottom, calc->hWnd, (HMENU)(ID_CALC_WS_QWORD + n - top_button + CALC_WS_COUNT - 1), calc->hInst, NULL ); if (!calc->cb[n].hBtn) exit(1); EnableWindow(calc->cb[n].hBtn, FALSE); SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); } // set sci defaults SendMessage(calc->cb[61].hBtn, BM_SETCHECK, 1, 0); // decimal SendMessage(calc->cb[64].hBtn, BM_SETCHECK, 1, 0); // degrees SendMessage(calc->cb[69].hBtn, BM_SETCHECK, 1, 0); // qword } } void DrawCalcRect (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object) { POINT pt; HPEN hPenGray; HPEN hPenBlack; HPEN hPenWhite; HPEN hPenOrg; int WDISPLAY_LEFT; int WDISPLAY_TOP; int WDISPLAY_RIGHT; int WDISPLAY_BOTTOM; if (!calc->sciMode) { WDISPLAY_LEFT = WDISPLAY_SCIENTIFIC_LEFT; WDISPLAY_TOP = WDISPLAY_SCIENTIFIC_TOP; WDISPLAY_RIGHT = WDISPLAY_SCIENTIFIC_RIGHT; WDISPLAY_BOTTOM = WDISPLAY_SCIENTIFIC_BOTTOM; } else { WDISPLAY_LEFT = WDISPLAY_STANDARD_LEFT; WDISPLAY_TOP = WDISPLAY_STANDARD_TOP; WDISPLAY_RIGHT = WDISPLAY_STANDARD_RIGHT; WDISPLAY_BOTTOM = WDISPLAY_STANDARD_BOTTOM; } // never delete the active pen! // Gray Pen hPenGray = CreatePen(PS_SOLID, 1, RGB(CALC_GRAY,CALC_GRAY,CALC_GRAY)); hPenBlack = CreatePen(PS_SOLID, 1, RGB(0,0,0)); hPenWhite = CreatePen(PS_SOLID, 1, RGB(255,255,255)); hPenOrg = SelectObject(hdc, hPenGray); MoveToEx(hdc, calc->cb[object].r.left, calc->cb[object].r.bottom, &pt); LineTo(hdc, calc->cb[object].r.left, calc->cb[object].r.top); LineTo(hdc, calc->cb[object].r.right, calc->cb[object].r.top); // Black Pen SelectObject(hdc, hPenBlack); MoveToEx(hdc, calc->cb[object].r.right-2, calc->cb[object].r.top+1, &pt); LineTo(hdc, calc->cb[object].r.left+1, calc->cb[object].r.top+1); LineTo(hdc, calc->cb[object].r.left+1, calc->cb[object].r.bottom-1); SelectObject(hdc, hPenBlack); MoveToEx(hdc, WDISPLAY_LEFT - 1, WDISPLAY_BOTTOM, &pt); LineTo(hdc, WDISPLAY_LEFT - 1, WDISPLAY_TOP - 1); LineTo(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_TOP - 1); SelectObject(hdc, hPenGray); MoveToEx(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_TOP - 2, &pt); LineTo(hdc, WDISPLAY_LEFT - 2, WDISPLAY_TOP - 2); LineTo(hdc, WDISPLAY_LEFT - 2, WDISPLAY_BOTTOM + 1); // White Pen SelectObject(hdc, hPenWhite); MoveToEx(hdc, calc->cb[object].r.left, calc->cb[object].r.bottom, &pt); LineTo(hdc, calc->cb[object].r.right, calc->cb[object].r.bottom); LineTo(hdc, calc->cb[object].r.right, calc->cb[object].r.top); SelectObject(hdc, hPenOrg); DeleteObject(hPenGray); DeleteObject(hPenBlack); DeleteObject(hPenWhite); } void DrawCalcRectSci(HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, RECT *r) { POINT pt; HPEN hPen; HPEN hPenOrg; // never delete the active pen! // White Pen hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255)); hPenOrg = SelectObject(hdc, hPen); MoveToEx(hdc, r->left + 1, r->bottom + 1, &pt); LineTo(hdc, r->left + 1, r->top + 1); LineTo(hdc, r->right + 1, r->top + 1); LineTo(hdc, r->right + 1, r->bottom + 1); LineTo(hdc, r->left + 1, r->bottom + 1); SelectObject(hdc, hPenOrg); DeleteObject(hPen); // Black Pen hPen = CreatePen(PS_SOLID, 1, RGB(CALC_GRAY,CALC_GRAY,CALC_GRAY)); hPenOrg = SelectObject(hdc, hPen); MoveToEx(hdc, r->left, r->bottom, &pt); LineTo(hdc, r->left, r->top); LineTo(hdc, r->right, r->top); LineTo(hdc, r->right, r->bottom); LineTo(hdc, r->left, r->bottom); SelectObject(hdc, hPenOrg); DeleteObject(hPen); } static RECT scirect1 = { WDISPLAY_SCIENTIFIC_LEFT - 2, WDISPLAY_SCIENTIFIC_TOP + 25, WDISPLAY_SCIENTIFIC_LEFT + 202, WDISPLAY_SCIENTIFIC_TOP + 51 }; static RECT scirect2 = { WDISPLAY_SCIENTIFIC_LEFT + 205, WDISPLAY_SCIENTIFIC_TOP + 25, WDISPLAY_SCIENTIFIC_RIGHT, WDISPLAY_SCIENTIFIC_TOP + 51 }; static RECT scirect3 = { WDISPLAY_SCIENTIFIC_LEFT - 2, WDISPLAY_SCIENTIFIC_TOP + 57, WDISPLAY_SCIENTIFIC_LEFT + 102, WDISPLAY_SCIENTIFIC_TOP + 81 }; void DrawCalc (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc) { TCHAR s[CALC_BUF_SIZE]; scirect1.right = calc->cb[0].r.right + 2; scirect2.left = calc->cb[0].r.right + 5; scirect3.right = calc->cb[1].r.left - 10; DrawCalcRect (hdc, hMemDC, ps, calc, 0); if (!calc->sciMode) { DrawCalcRect (hdc, hMemDC, ps, calc, 1); DrawCalcRectSci(hdc, hMemDC, ps, calc, &scirect1); DrawCalcRectSci(hdc, hMemDC, ps, calc, &scirect2); DrawCalcRectSci(hdc, hMemDC, ps, calc, &scirect3); } LoadString(calc->hInst, IDS_BTN_MEM_STATUS_M, s, sizeof(s) / sizeof(s[0])); DrawCalcText(hdc, hMemDC, ps, calc, 0, s); } void DrawCalcText (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object, TCHAR *s) { POINT pt; HFONT hFont; HFONT hFontOrg; HPEN hPen; HPEN hPenOrg; HBRUSH hBrush; HBRUSH hBrushOrg; TCHAR s2[CALC_BUF_SIZE]; int WDISPLAY_LEFT; int WDISPLAY_TOP; int WDISPLAY_RIGHT; int WDISPLAY_BOTTOM; if (!calc->sciMode) { WDISPLAY_LEFT = WDISPLAY_SCIENTIFIC_LEFT; WDISPLAY_TOP = WDISPLAY_SCIENTIFIC_TOP; WDISPLAY_RIGHT = WDISPLAY_SCIENTIFIC_RIGHT; WDISPLAY_BOTTOM = WDISPLAY_SCIENTIFIC_BOTTOM; } else { WDISPLAY_LEFT = WDISPLAY_STANDARD_LEFT; WDISPLAY_TOP = WDISPLAY_STANDARD_TOP; WDISPLAY_RIGHT = WDISPLAY_STANDARD_RIGHT; WDISPLAY_BOTTOM = WDISPLAY_STANDARD_BOTTOM; } // DEFAULT_GUI_FONT is Tahoma on 2000 and XP? // SYSTEM_FONT is MS Sans Serif? hFont = GetStockObject(DEFAULT_GUI_FONT); hFontOrg = SelectObject(hdc, hFont); if (calc->memory) { SetBkMode(hdc, TRANSPARENT); TextOut(hdc, calc->cb[object].r.left + 9, calc->cb[object].r.top + 7, s, _tcslen(s) ); SetBkMode(hdc, OPAQUE); } if (calc->paren) { _stprintf(s2, TEXT("(=%d"),calc->paren); SetBkMode(hdc, TRANSPARENT); SetTextAlign(hdc, TA_CENTER); TextOut(hdc, calc->cb[object+1].r.left + 13, calc->cb[object+1].r.top + 6, s2, _tcslen(s2) ); SetBkMode(hdc, OPAQUE); } hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255)); hPenOrg = SelectObject(hdc, hPen); hBrush = GetSysColorBrush(COLOR_WINDOW); hBrushOrg = SelectObject(hdc, hBrush); MoveToEx(hdc, WDISPLAY_LEFT - 1, WDISPLAY_BOTTOM + 1, &pt ); LineTo(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_BOTTOM + 1); LineTo(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_TOP - 2); Rectangle(hdc, WDISPLAY_LEFT, WDISPLAY_TOP, WDISPLAY_RIGHT, WDISPLAY_BOTTOM); SelectObject(hdc, hPenOrg); SelectObject(hdc, hBrushOrg); DeleteObject(hPen); SetBkMode(hdc, TRANSPARENT); SetTextAlign(hdc, TA_RIGHT); TextOut(hdc, WDISPLAY_RIGHT - 4, WDISPLAY_TOP + 1, calc->display, _tcslen(calc->display) ); SelectObject(hdc, hFontOrg); } void DestroyCalc (CALC *calc) { int i; for (i=0;inumButtons;i++) DestroyWindow(calc->cb[i].hBtn); } void DestroyMenus() { if (menus[MENU_STD] != 0) DestroyMenu(menus[MENU_STD]); if (menus[MENU_SCIMS] != 0) DestroyMenu(menus[MENU_SCIMS]); if (menus[MENU_SCIWS] != 0) DestroyMenu(menus[MENU_SCIWS]); } void calc_buffer_format(CALC *calc) { TCHAR *p; int n; int flag = 0; int point = 0; // calc_buffer_format: enforce buffer content rules // // disallow more than one point (beep) // remove leading zeros // remove trailing zeros after point (sprintf can cause this) // remove trailing points // chop at 32 digits. Though there could also be a point, and 10 separator characters. p = calc->buffer; while (*p) { if (*p++ == TEXT('.')) point++; } if (point > 1) { calc->buffer[_tcslen(calc->buffer)-1] = TEXT('\0'); MessageBeep(0); } //if (point) { // p = calc->buffer; // n = _tcslen(p) - 1; // while (*(p+n) && // *(p+n) != TEXT('.') && // *(p+n) == TEXT('0')) { // calc->buffer[n] = TEXT('\0'); // n--; // } //} // remove leading zeros p = calc->buffer; while (*p) { if (*p != TEXT('0')) break; p++; } // remove trailing points n = _tcslen(p); while (n) { if (*(p+n-1) == TEXT('.')) { if (flag) { *(p + n) = TEXT('\0'); } else { flag = 1; } n--; } else { break; } } // if (!*p) // _tcscpy(p, TEXT("0")); // chop at 32 digits if (flag) *(p+33) = TEXT('\0'); else *(p+32) = TEXT('\0'); n = 0; while (*p) *(calc->buffer + n++) = *(p++); *(calc->buffer + n) = TEXT('\0'); } void calc_buffer_display(CALC *calc) { TCHAR *p; TCHAR s[CALC_BUF_SIZE]; int point=0; calcfloat real; static int old_base = NBASE_DECIMAL; switch (calc->numBase) { case NBASE_HEX: real = calc_atof(calc->buffer, old_base); _stprintf(calc->display, _T("%lx"), (long)real); _stprintf(calc->buffer, _T("%lx"), (long)real); old_base = NBASE_HEX; break; case NBASE_OCTAL: real = calc_atof(calc->buffer, old_base); _stprintf(calc->display, TEXT("%lo"), (long)real); _stprintf(calc->buffer, TEXT("%lo"), (long)real); old_base = NBASE_OCTAL; break; case NBASE_BINARY: { int buf=0; int t; if (calc->buffer[0]==_T('\0')) { real=0; } else { real = calc_atof(calc->buffer, old_base); } calc->display[buf]=_T('0'); calc->buffer[buf]=_T('0'); for (t=31;t>=0;t--) { if (((((long)real)>>t) & ~0xFFFFFFFE)==0) { calc->display[buf]=_T('0'); calc->buffer[buf]=_T('0'); buf++; } else { calc->display[buf]=_T('1'); calc->buffer[buf]=_T('1'); buf++; } } if (buf==0) { buf++; } calc->buffer[buf]=_T('\0'); calc->display[buf]=_T('\0'); old_base = NBASE_BINARY; } break; case NBASE_DECIMAL: calc_buffer_format(calc); if (calc->displayMode) { if (!_tcscmp(calc->buffer, TEXT("0")) || !calc->buffer[0]) { _tcscpy(calc->display, TEXT("0.e+0")); } else { int i = 0; int lz = 0; int exp = 0; real = calc_atof(calc->buffer,old_base); _stprintf(s, FMT_DESC_EXP, real); // remove leading zeros in exponent p = s; while (*p) { if (*p == TEXT('e')) { // starting exponent parsing exp = 1; } else if (exp) { // inside exponent, and haven't seen a digit, so could be a leading zero if (*p == TEXT('0')) lz = 1; } if (exp && (*p != TEXT('e')) && (*p != TEXT('0')) && (*p != TEXT('+')) && (*p != TEXT('-'))) { exp = 0; lz = 0; } if (!lz) calc->display[i++] = *p; p++; } if (calc->display[i-1] == TEXT('+')) // all trailing zeros calc->display[i++] = TEXT('0'); calc->display[i] = 0; } } else { // calc_buffer_display: display buffer after formatting // // if digitGrouping, embed separators // add point if missing // display if (old_base != calc->numBase) { if (calc->buffer[0]==_T('\0')) { real = 0; } else { real = calc_atof(calc->buffer, old_base); } _stprintf(calc->display, _T("%.f"), real); _stprintf(calc->buffer, _T("%.f"), real); } _tcscpy(s,calc->buffer); p = s; while (*p) { if (*p++ == TEXT('.')) point = 1; } if (!*s) _tcscpy(s, TEXT("0")); if (calc->digitGrouping) calc_sep(s); if (!point && calc->numBase == NBASE_DECIMAL) _tcscat(s, TEXT(".")); if (*s == TEXT('.')) _tcscpy(calc->display, TEXT("0")); else calc->display[0] = 0; _tcscat(calc->display, s); } old_base = NBASE_DECIMAL; } InvalidateRect(calc->hWnd, NULL, FALSE); UpdateWindow(calc->hWnd); } TCHAR *calc_sep(TCHAR *s) { TCHAR c; TCHAR *p; int n; int x = 1; int i = 0; int point = 0; TCHAR r[CALC_BUF_SIZE]; n = _tcslen(s); if (!*s) return s; p = s; // need to handle leading minus sign! // see if there is a point character while (*p) { if (*p++ == TEXT('.')) { point = p - s; break; } } // if there is a point character, skip over decimal places if (point) { i = n - point + 1; n = point - 1; _tcscpy(r, s); _tcsrev(r); } // commify the integer part now while ((c = *(s + --n))) { r[i++] = c; if (x++ % 3 == 0) r[i++] = TEXT(','); if (n == 0) break; } if (r[i-1] == TEXT(',')) r[--i] = TEXT('\0'); else r[i] = TEXT('\0'); _tcscpy(s, _tcsrev(r)); return s; } long factorial(long n) { if (n <= 1L) return 1L; return n * factorial(n - 1); } void calc_setmenuitem_radio(HMENU hMenu, UINT id) { MENUITEMINFO menuItem; menuItem.fMask = MIIM_FTYPE; menuItem.fType = MFT_STRING | MFT_RADIOCHECK; // menuItem.fState = MFS_ENABLED; // menuItem.wID = id; // menuItem.hSubMenu = NULL; // menuItem.hbmpChecked = NULL; // menuItem.hbmpUnchecked = NULL; // menuItem.dwItemData = 0; // menuItem.dwTypeData = "Hex\tF5"; // menuItem.cch = sizeof("Hex\tF5"); menuItem.cbSize = sizeof(MENUITEMINFO); SetMenuItemInfo(hMenu, id, FALSE, &menuItem); } calcfloat calc_convert_to_radians(CALC *calc) { calcfloat r = calc_atof(calc->buffer, calc->numBase); if (calc->trigMode == TRIGMODE_RADIANS) return r; if (calc->trigMode == TRIGMODE_DEGREES) return r * CONST_PI / 180; else if (calc->trigMode == TRIGMODE_GRADS) return r * CONST_PI / 200; // 90 degrees == 100 grads return 0L; } calcfloat calc_convert_from_radians(CALC *calc) { calcfloat r = calc_atof(calc->buffer, calc->numBase); if (calc->trigMode == TRIGMODE_RADIANS) return r; if (calc->trigMode == TRIGMODE_DEGREES) return r * 180 / CONST_PI; else if (calc->trigMode == TRIGMODE_GRADS) return r * 200 / CONST_PI; // 90 degrees == 100 grads return 0L; } void show_debug(CALC *calc, TCHAR *title, long w, long l) { TCHAR s[1024]; _stprintf(s, TEXT("wParam = (%C) %d:%d, %x:%xh\n \ lParam = %d:%d, %x:%x\n \ value = %.32g\n \ memory = %.32g\n \ buffer = \"%s\"\n \ display = \"%s\"\n \ numBase = %d\n \ trigMode = %d\n \ wordSize = %d\n \ invMode = %d\n \ hypMode = %d\n \ oper = (%C)\n"), LOWORD(w), LOWORD(w), HIWORD(w), LOWORD(w), HIWORD(w), LOWORD(l), HIWORD(l), LOWORD(l), HIWORD(l), calc->value, calc->memory, calc->buffer, calc->display, calc->numBase, calc->trigMode, calc->wordSize, calc->invMode, calc->hypMode, calc->oper ); MessageBox(calc->hWnd, s, title, MB_OK); } calcfloat calc_atof(const TCHAR *s, int base) { #ifdef UNICODE char s_ansi[128]; #endif // converts from another base to decimal calcfloat switch (base) { case NBASE_DECIMAL: wcstombs(s_ansi, s, sizeof(s_ansi)); return CALC_ATOF(s_ansi); case NBASE_HEX: return (calcfloat)_tcstol(s, NULL, 16); case NBASE_OCTAL: return (calcfloat)_tcstol(s, NULL, 8); case NBASE_BINARY: return (calcfloat)_tcstol(s, NULL, 2); default: break; } return 0L; } void calc_ftoa(CALC *calc, calcfloat r, TCHAR *buf) { // converts from decimal calcfloat to another base switch (calc->numBase) { case NBASE_DECIMAL: _stprintf(buf, FMT_DESC_FLOAT, r); break; case NBASE_HEX: _stprintf(buf, TEXT("%lX"), (long)r); break; case NBASE_OCTAL: _stprintf(buf, TEXT("%lo"), (long)r); break; case NBASE_BINARY: // 911 - need routine here break; default: break; } } int parse(int wParam, int lParam) { switch (wParam) { case TEXT('\b'): // backspace if (calc.buffer[0]) calc.buffer[_tcslen(calc.buffer)-1] = TEXT('\0'); break; case TEXT('\x1b'): // ESC calc.next = 1; calc.buffer[0] = TEXT('\0'); calc.value = 0; calc.init = 1; break; case TEXT('0'): case TEXT('1'): case TEXT('2'): case TEXT('3'): case TEXT('4'): case TEXT('5'): case TEXT('6'): case TEXT('7'): case TEXT('8'): case TEXT('9'): case TEXT('a'): case TEXT('b'): case TEXT('c'): case TEXT('d'): case TEXT('e'): case TEXT('f'): case TEXT('A'): case TEXT('B'): case TEXT('C'): case TEXT('D'): case TEXT('E'): case TEXT('F'): { TCHAR s22[CALC_BUF_SIZE]; TCHAR w = (TCHAR)LOWORD(wParam); if (!keys[calc.numBase][(WORD)w]) { MessageBeep(0); return 0; } if (calc.next) { // user first digit indicates new buffer needed after previous UI event calc.next = 0; calc.buffer[0] = TEXT('\0'); } calc.newenter = 1; _stprintf(s22,TEXT("%C"), w); _tcscat(calc.buffer, s22); //MessageBox(NULL, s22, NULL, 0); } break; case TEXT('.'): case TEXT(','): // 911 - need to handle this, i18n if (calc.numBase == NBASE_DECIMAL) { if (calc.next) { // first digit indicates new buffer needed after previous UI event calc.next = 0; calc.buffer[0] = TEXT('\0'); } _tcscat(calc.buffer, TEXT(".")); } else { MessageBeep(0); return 0; } break; case TEXT('x'): case TEXT('X'): // exp, e(1)=2.718 if (calc.numBase == NBASE_DECIMAL) { calc.next = 1; calc.value = exp(calc_atof(calc.buffer, calc.numBase)); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value); } else { MessageBeep(0); return 0; } break; case TEXT('l'): case TEXT('L'): calc.next = 1; if (calc_atof(calc.buffer, calc.numBase) == 0.0L) { _tcscpy(calc.buffer, err_invalid); } else { calc.value = log10(calc_atof(calc.buffer, calc.numBase)); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value); } break; case TEXT('N'): case TEXT('n'): // ln is natural logarithm calc.next = 1; if (calc_atof(calc.buffer, calc.numBase) == 0.0L) { _tcscpy(calc.buffer, err_invalid); } else { calc.value = log(calc_atof(calc.buffer, calc.numBase)); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value); } break; case TEXT('p'): case TEXT('P'): if (calc.numBase == NBASE_DECIMAL) { calc.next = 1; _stprintf(calc.buffer, FMT_DESC_FLOAT, CONST_PI); } else { MessageBeep(0); return 0; } break; case TEXT('\x0c'): // Ctrl+L MC (only need to invalid rectangle if wasn't already zero, no need to update display) calc.next = 1; if (calc.memory) { calc.memory = 0.0; InvalidateRect(calc.hWnd, &rFiller, TRUE); UpdateWindow(calc.hWnd); } return 0; break; case TEXT('\x12'): // Ctrl+R MR (value doesn't change, so no invalid rectangle. but display is updated.) calc.next = 1; if (calc.memory != calc_atof(calc.buffer, calc.numBase)) _stprintf(calc.buffer,FMT_DESC_FLOAT,calc.memory); else return 0; break; case TEXT('\x10'): // Ctrl+P M+ (need to invalidate rectangle in many cases but not display) calc.next = 1; InvalidateRect(calc.hWnd, &rFiller, TRUE); calc.memory += calc_atof(calc.buffer, calc.numBase); return 0; break; case TEXT('\x0d'): // Ctrl+M MS (only need to invalid rectangle if was zero and now not, // or was not zero and now is, not display) calc.next = 1; { int x = GetKeyState(VK_CONTROL); if (x < 0 || lParam == NUMBER_OF_THE_BEAST) { if ((!calc.memory && calc_atof(calc.buffer, calc.numBase)) || (calc.memory && !calc_atof(calc.buffer, calc.numBase))) { calc.memory = calc_atof(calc.buffer, calc.numBase); InvalidateRect(calc.hWnd, &rFiller, FALSE); UpdateWindow(calc.hWnd); } else { calc.memory = calc_atof(calc.buffer, calc.numBase); } return 0; } } // fall through for Enter processing case TEXT('='): { calcfloat r = calc.operand; if (calc.newenter) { calc.newenter = 0; calc.operand = calc_atof(calc.buffer, calc.numBase); r = calc_atof(calc.buffer, calc.numBase); // convert buffer from whatever base to decimal real } if (calc.oper == TEXT('+')) { calc.value += r; } else if (calc.oper == TEXT('-')) { calc.value -= r; } else if (calc.oper == TEXT('*')) { calc.value *= r; } else if (calc.oper == TEXT('%')) { calc.value = (long)calc.value % (long)r; } else if (calc.oper == TEXT('/')) { if (!calc_atof(calc.buffer, calc.numBase)) { _tcscpy(calc.buffer, err_undefined); calc.err = 1; } else { calc.value /= r; } } else if (calc.oper == TEXT('&')) { calc.value = (calcfloat)((long)calc.value & (long)r); } else if (calc.oper == TEXT('|')) { calc.value = (calcfloat)((long)calc.value | (long)r); } else if (calc.oper == TEXT('^')) { calc.value = (calcfloat)((long)calc.value ^ (long)r); } else if (calc.oper == TEXT('y')) { calc.value = (calcfloat)pow(calc.value, r); } else if (calc.oper == TEXT('<')) { if (calc.invMode) calc.value = (calcfloat)((long)calc.value >> (long)calc_atof(calc.buffer, calc.numBase)); else calc.value = (calcfloat)((long)calc.value << (long)calc_atof(calc.buffer, calc.numBase)); } else { // must have been a gratuitous user = calc.value = calc_atof(calc.buffer, calc.numBase); } calc_ftoa(&calc, calc.value, calc.buffer); if (!calc.next) // calc.value = r; calc.next = 1; } break; case TEXT('R'): case TEXT('r'): // 1/x calc.next = 1; if (calc_atof(calc.buffer, calc.numBase) == 0) { calc.err = 1; _tcscpy(calc.buffer, err_divide_by_zero); } else { calc.value = 1/calc_atof(calc.buffer, calc.numBase); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); } break; case TEXT('@'): // ^2 - sqrt in standard mode, squared in sci mode calc.next = 1; calc.value = calc_atof(calc.buffer, calc.numBase); if (!calc.sciMode) calc.value *= calc.value; else calc.value = sqrt(calc.value); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); break; case TEXT('#'): // ^3 calc.next = 1; calc.value = calc_atof(calc.buffer, calc.numBase); calc.value *= calc.value * calc.value; _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); break; case TEXT('Y'): case TEXT('y'): // x^y calc.next = 1; calc.value = calc_atof(calc.buffer, calc.numBase); calc.oper = TEXT('y'); calc.next = 1; break; case TEXT('<'): // Lsh calc.next = 1; calc.value = calc_atof(calc.buffer, calc.numBase); calc.oper = TEXT('<'); calc.next = 1; break; case TEXT(';'): // INT calc.next = 1; calc.value = (long)calc_atof(calc.buffer, calc.numBase); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); break; case TEXT('!'): // factorial, need to use gamma function for reals t^(z-1)*e^t dt calc.next = 1; calc.value = calc_atof(calc.buffer, calc.numBase); calc.value = (calcfloat)factorial((long)calc.value); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); break; case TEXT('&'): // bitwise and calc.oper = '&'; calc.next = 1; calc.value = calc_atof(calc.buffer, calc.numBase); break; case TEXT('|'): // bitwise or calc.oper = TEXT('|'); calc.next = 1; calc.value = calc_atof(calc.buffer, calc.numBase); break; case TEXT('^'): // bitwise xor calc.oper = TEXT('^'); calc.next = 1; calc.value = calc_atof(calc.buffer, calc.numBase); break; case TEXT('~'): // bitwise not calc.next = 1; calc.value = ~ (long) calc_atof(calc.buffer, calc.numBase); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); break; case TEXT('+'): calc.operand = calc_atof(calc.buffer, calc.numBase); calc.value += calc.operand; calc_ftoa(&calc, calc.value, calc.buffer); calc.oper = TEXT('+'); calc.newenter = 1; calc.next = 1; break; case TEXT('-'): if (calc.init) { calc.init = 0; calc.operand = calc_atof(calc.buffer, calc.numBase); calc.value = calc.operand; } else { calc.value -= calc.operand; calc_ftoa(&calc, calc.value, calc.buffer); } calc.oper = TEXT('-'); calc.newenter = 1; calc.next = 1; break; case TEXT('*'): if (calc.init) { calc.init = 0; calc.operand = calc_atof(calc.buffer, calc.numBase); calc.value = calc.operand; } else { calc.value *= calc.operand; calc_ftoa(&calc, calc.value, calc.buffer); } calc.oper = TEXT('*'); calc.newenter = 1; calc.next = 1; break; case TEXT('/'): if (calc.init) { calc.init = 0; calc.operand = calc_atof(calc.buffer, calc.numBase); calc.value = calc.operand; } else { calc.value /= calc.operand; calc_ftoa(&calc, calc.value, calc.buffer); } calc.oper = TEXT('/'); calc.newenter = 1; calc.next = 1; break; case TEXT('%'): if (!calc.sciMode) { if (calc.init) { calc.init = 0; calc.operand = calc_atof(calc.buffer, calc.numBase); calc.value = calc.operand; } else { calc.value = (long)calc_atof(calc.buffer, calc.numBase) % (long)calc.operand; calc_ftoa(&calc, calc.value, calc.buffer); } } else { calcfloat r; r = calc_atof(calc.buffer, calc.numBase); calc.next = 1; _stprintf(calc.buffer, FMT_DESC_FLOAT, r * calc.value / (calcfloat)100.0); } calc.oper = TEXT('%'); calc.newenter = 1; calc.next = 1; break; case TEXT('O'): // cos case TEXT('o'): if (calc.numBase == NBASE_DECIMAL) { calcfloat r; calc.next = 1; r = calc_convert_to_radians(&calc); if (calc.hypMode && calc.invMode) calc.value = acosh(r); else if (calc.invMode) calc.value = acos(r); else if (calc.hypMode) calc.value = cosh(r); else calc.value = cos(calc_atof(calc.buffer, calc.numBase)); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); } else { MessageBeep(0); return 0; } break; case TEXT('S'): // sin case TEXT('s'): if (calc.numBase == NBASE_DECIMAL) { calcfloat r = calc_convert_to_radians(&calc); calc.next = 1; if (calc.hypMode && calc.invMode) calc.value = asinh(r); else if (calc.invMode) calc.value = asin(r); else if (calc.hypMode) calc.value = sinh(r); else calc.value = sin(r); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); } else { MessageBeep(0); return 0; } break; case TEXT('T'): // tan case TEXT('t'): if (calc.numBase == NBASE_DECIMAL) { calcfloat r = calc_convert_to_radians(&calc); calc.next = 1; if (calc.hypMode && calc.invMode) calc.value = atanh(r); else if (calc.invMode) calc.value = atan(r); else if (calc.hypMode) calc.value = tanh(r); else calc.value = tan(r); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); } else { MessageBeep(0); return 0; } break; case TEXT('M'): // dms = Degrees Minutes Seconds case TEXT('m'): if (calc.numBase == NBASE_DECIMAL) { calcfloat r2; calcfloat r = calc_atof(calc.buffer, calc.numBase); calc.next = 1; r2 = r - (long)r; r = (long)r + r2 * 0.6; // multiply by 60 and divide by 100 calc.value = r; _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); } else { MessageBeep(0); return 0; } break; case TEXT('V'): // toggle scientic notation like 1.e+2 or 100 case TEXT('v'): calc.displayMode = !calc.displayMode; break; // non-standard keystrokes ... case TEXT('?'): calc.next = 1; if (calc_atof(calc.buffer, calc.numBase) < 0) { calc.err = 1; _tcscpy(calc.buffer, err_invalid); } else { calc.value = sqrt(calc_atof(calc.buffer, calc.numBase)); _stprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); } break; case TEXT('Z'): // +/- { TCHAR s[CALC_BUF_SIZE] = TEXT("-"); if (!_tcscmp(calc.buffer, TEXT("0"))) return 0; if (calc.buffer[0] == TEXT('-')) _tcscpy(s, calc.buffer+1); else _tcscpy(s+1, calc.buffer); _tcscpy(calc.buffer, s); } break; case TEXT('G'): // debug mode case TEXT('g'): calc.next = 1; debug = !debug; break; default: MessageBeep(0); return 0; break; } return 0; } /* case WM_CONTEXTMENU: // need to subclass control and just call WinHelp! WinHelp((HWND) wParam, "c:/windows/help/calc.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)2); return 0; } */