⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winecalc.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 5 页
字号:
            {
                int i;
                int n;

                calc.digitGrouping = !calc.digitGrouping;

                n = (calc.digitGrouping ? MF_CHECKED : MF_UNCHECKED);

                for (i=0;i<COUNT_MENUS;i++)
                    CheckMenuItem(menus[i], IDM_DIGIT_GROUPING, n);

                calc_buffer_display(&calc);
            }
            return 0;

        case IDM_HELP_TOPICS:
            MessageBox(hWnd, TEXT("No Help Available"), TEXT("Windows Help"), MB_OK);
            return 0;

        case IDM_ABOUT:
            DialogBox( calc.hInst, TEXT("DLG_ABOUT"), hWnd, AboutDlgProc );
            return 0;

        case ID_CALC_NS_HEX:
        case ID_CALC_NS_DEC:
        case ID_CALC_NS_OCT:
        case ID_CALC_NS_BIN:
            {
                int i;
                int w = LOWORD(wParam);

                if (w == ID_CALC_NS_HEX) {
                    if (calc.numBase == NBASE_HEX)
                        return 0;
                    else
                        calc.numBase = NBASE_HEX;
                }
                else if (w == ID_CALC_NS_DEC) {
                    if (calc.numBase == NBASE_DECIMAL)
                        return 0;
                    else
                        calc.numBase = NBASE_DECIMAL;
                }
                else if (w == ID_CALC_NS_OCT) {
                    if (calc.numBase == NBASE_OCTAL)
                        return 0;
                    else
                        calc.numBase = NBASE_OCTAL;
                }
                else if (w == ID_CALC_NS_BIN) {
                    if (calc.numBase == NBASE_BINARY)
                        return 0;
                    else
                        calc.numBase = NBASE_BINARY;
                }

                for (i=0;i<CALC_NS_COUNT;i++)
                    SendMessage(calc.cb[60+i].hBtn, BM_SETCHECK, w == (ID_CALC_NS_HEX + i) ? 1 : 0, 0);

                for (i=2;i<TOGGLE_COUNT;i++) { // skip 0 and 1, always valid
                    if (btn_toggle[w - ID_CALC_NS_HEX ][i]) {
                        if (!IsWindowEnabled((HWND)calc.cb[h[i]].hBtn))
                            EnableWindow((HWND)calc.cb[h[i]].hBtn, TRUE);

                    }
                    else {
                        if (IsWindowEnabled((HWND)calc.cb[h[i]].hBtn))
                            EnableWindow((HWND)calc.cb[h[i]].hBtn, FALSE);
                    }
                }

                if (w == ID_CALC_NS_DEC) {
                    for (i=0;i<CALC_WS_COUNT;i++) {
                        if (IsWindowEnabled((HWND)calc.cb[hws[i]].hBtn)) {
                            ShowWindow((HWND)calc.cb[hws[i]].hBtn, SW_HIDE);
                            EnableWindow((HWND)calc.cb[hws[i]].hBtn, FALSE);
                        }
                    }
                    for (i=0;i<CALC_MS_COUNT;i++) {
                        if (!IsWindowEnabled((HWND)calc.cb[hms[i]].hBtn)) {
                            ShowWindow((HWND)calc.cb[hms[i]].hBtn, SW_SHOWNORMAL);
                            EnableWindow((HWND)calc.cb[hms[i]].hBtn, TRUE);
                        }
                    }
                }
                else {
                    for (i=0;i<CALC_MS_COUNT;i++) {
                        if (IsWindowEnabled((HWND)calc.cb[hms[i]].hBtn)) {
                            ShowWindow((HWND)calc.cb[hms[i]].hBtn, SW_HIDE);
                            EnableWindow((HWND)calc.cb[hms[i]].hBtn, FALSE);
                        }
                    }
                    for (i=0;i<CALC_WS_COUNT;i++) {
                        if (!IsWindowEnabled((HWND)calc.cb[hws[i]].hBtn)) {
                            ShowWindow((HWND)calc.cb[hws[i]].hBtn, SW_SHOWNORMAL);
                            EnableWindow((HWND)calc.cb[hws[i]].hBtn, TRUE);
                        }
                    }
                }

                CheckMenuItem(menus[i], ID_CALC_MS_DEGREES,  MF_CHECKED);

                for (i=1;i<COUNT_MENUS;i++) { // skip the simple Standard calculator mode
                    CheckMenuItem(menus[i], ID_CALC_NS_HEX,     (w == ID_CALC_NS_HEX ? MF_CHECKED : MF_UNCHECKED) );
                    CheckMenuItem(menus[i], ID_CALC_NS_DEC,     (w == ID_CALC_NS_DEC ? MF_CHECKED : MF_UNCHECKED) );
                    CheckMenuItem(menus[i], ID_CALC_NS_OCT,     (w == ID_CALC_NS_OCT ? MF_CHECKED : MF_UNCHECKED) );
                    CheckMenuItem(menus[i], ID_CALC_NS_BIN,     (w == ID_CALC_NS_BIN ? MF_CHECKED : MF_UNCHECKED) );
                }

                if (wParam == ID_CALC_NS_DEC) {
                    SetMenu(hWnd, menus[MENU_SCIMS]);

                }
                else {
                    calc.displayMode = 0;
                    SetMenu(hWnd, menus[MENU_SCIWS]);
                }
            }
            calc_buffer_display(&calc);

            break;

        case ID_CALC_MS_DEGREES:
        case ID_CALC_MS_RADIANS:
        case ID_CALC_MS_GRADS:
            {
                int i;
                int w = LOWORD(wParam);

                if (w == ID_CALC_MS_DEGREES)
                    calc.trigMode = TRIGMODE_DEGREES;
                else if (w == ID_CALC_MS_RADIANS)
                    calc.trigMode = TRIGMODE_RADIANS;
                else if (w == ID_CALC_MS_GRADS)
                    calc.trigMode = TRIGMODE_GRADS;
                else
                    return 0;

                for (i=0;i<CALC_MS_COUNT;i++)
                    SendMessage(calc.cb[64+i].hBtn, BM_SETCHECK, w == (ID_CALC_MS_DEGREES  + i) ? 1 : 0, 0);

                for (i=1;i<COUNT_MENUS;i++) { // skip the simple Standard calculator mode
                    CheckMenuItem(menus[i], ID_CALC_MS_DEGREES, (wParam == ID_CALC_MS_DEGREES) ? MF_CHECKED : MF_UNCHECKED);
                    CheckMenuItem(menus[i], ID_CALC_MS_RADIANS, (wParam == ID_CALC_MS_RADIANS) ? MF_CHECKED : MF_UNCHECKED);
                    CheckMenuItem(menus[i], ID_CALC_MS_GRADS,   (wParam == ID_CALC_MS_GRADS)   ? MF_CHECKED : MF_UNCHECKED);
                }
            }

            SetFocus(hWnd);
            return 0;

        case ID_CALC_WS_QWORD:
        case ID_CALC_WS_DWORD:
        case ID_CALC_WS_WORD:
        case ID_CALC_WS_BYTE:
            {
                int i;
                int w = LOWORD(wParam);

                calc.wordSize = w;

                for (i=0;i<CALC_WS_COUNT;i++)
                    SendMessage(calc.cb[69+i].hBtn, BM_SETCHECK, LOWORD(wParam) == (ID_CALC_WS_QWORD  + i) ? 1 : 0, 0);

                for (i=1; i<COUNT_MENUS; i++) { // skip the simple Standard calculator mode
                    CheckMenuItem(menus[i], ID_CALC_WS_QWORD, (w == ID_CALC_WS_QWORD ? MF_CHECKED : MF_UNCHECKED) );
                    CheckMenuItem(menus[i], ID_CALC_WS_DWORD, (w == ID_CALC_WS_DWORD ? MF_CHECKED : MF_UNCHECKED) );
                    CheckMenuItem(menus[i], ID_CALC_WS_WORD,  (w == ID_CALC_WS_WORD  ? MF_CHECKED : MF_UNCHECKED) );
                    CheckMenuItem(menus[i], ID_CALC_WS_BYTE,  (w == ID_CALC_WS_BYTE  ? MF_CHECKED : MF_UNCHECKED) );
                }
            }

            SetFocus(hWnd);
            return 0;

        case ID_CALC_CB_INV:
            if (calc.invMode)
                calc.invMode = 0;
            else
                calc.invMode = 1;

            SendMessage(calc.cb[67].hBtn, BM_SETCHECK, calc.invMode ? TRUE : FALSE, 0);
            SetFocus(hWnd);
            return 0;

        case ID_CALC_CB_HYP:
            if (calc.hypMode)
                calc.hypMode = 0;
            else
                calc.hypMode = 1;

            SendMessage(calc.cb[68].hBtn, BM_SETCHECK, calc.hypMode ? TRUE : FALSE, 0);
            SetFocus(hWnd);
            return 0;

        default:
            if (HIWORD(wParam) == BN_CLICKED) {

                if (calc.err &&
                    LOWORD(wParam) != ID_CALC_CLEAR_ENTRY &&
                    LOWORD(wParam) != ID_CALC_CLEAR_ALL) {

                    MessageBeep(0);
                    return 0;
                }
                else {
                    calc.err = 0;
                }

                switch (LOWORD(wParam)) {

                case ID_CALC_ZERO:
                case ID_CALC_ONE:
                case ID_CALC_TWO:
                case ID_CALC_THREE:
                case ID_CALC_FOUR:
                case ID_CALC_FIVE:
                case ID_CALC_SIX:
                case ID_CALC_SEVEN:
                case ID_CALC_EIGHT:
                case ID_CALC_NINE:
                    SendMessage(hWnd, WM_CHAR, LOWORD(wParam)+TEXT('0') , lParam);
                    break;

                case ID_CALC_A:
                    SendMessage(hWnd, WM_CHAR, TEXT('a'), lParam);
                    break;

                case ID_CALC_B:
                    SendMessage(hWnd, WM_CHAR, TEXT('b'), lParam);
                    break;

                case ID_CALC_C:
                    SendMessage(hWnd, WM_CHAR, TEXT('c'), lParam);
                    break;

                case ID_CALC_D:
                    SendMessage(hWnd, WM_CHAR, TEXT('d'), lParam);
                    break;

                case ID_CALC_E:
                    SendMessage(hWnd, WM_CHAR, TEXT('e'), lParam);
                    break;

                case ID_CALC_F:
                    SendMessage(hWnd, WM_CHAR, TEXT('f'), lParam);
                    break;

                case ID_CALC_DECIMAL:
                    SendMessage(hWnd, WM_CHAR, TEXT('.'), lParam);
                    break;

                case ID_CALC_BACKSPACE:
                    SendMessage(hWnd, WM_CHAR, TEXT('\b'), lParam);
                    break;

                case ID_CALC_CLEAR_ENTRY:
                    SendMessage(hWnd, WM_KEYDOWN, VK_DELETE , lParam);
                    break;

                case ID_CALC_CLEAR_ALL:
                    SendMessage(hWnd, WM_CHAR, TEXT('\x1b'), lParam);
                    break;

                case ID_CALC_MEM_CLEAR:
                    SendMessage(hWnd, WM_CHAR, 0x0c, lParam);
                    break;

                case ID_CALC_MEM_RECALL:
                    SendMessage(hWnd, WM_CHAR, 0x12, lParam);
                    break;

                case ID_CALC_MEM_STORE:
                    SendMessage(hWnd, WM_CHAR, 0x0d, NUMBER_OF_THE_BEAST); // trying to tell between Return and Ctrl+M
                    break;

                case ID_CALC_MEM_PLUS:
                    SendMessage(hWnd, WM_CHAR, 0x10, lParam);
                    break;

                case ID_CALC_SQRT:
                    SendMessage(hWnd, WM_CHAR, TEXT('?'), lParam); // this is not a wincalc keystroke
                    break;

                case ID_CALC_SQUARE:
                    SendMessage(hWnd, WM_CHAR, TEXT('@'), lParam);
                    break;

                case ID_CALC_PI:
                    SendMessage(hWnd, WM_CHAR, TEXT('p'), lParam);
                    break;

                case ID_CALC_LN:
                    SendMessage(hWnd, WM_CHAR, TEXT('n'), lParam);
                    break;

                case ID_CALC_LOG10:
                    SendMessage(hWnd, WM_CHAR, TEXT('l'), lParam);
                    break;

                case ID_CALC_CUBE:
                    SendMessage(hWnd, WM_CHAR, TEXT('#'), lParam);
                    break;

                case ID_CALC_POWER:
                    SendMessage(hWnd, WM_CHAR, TEXT('y'), lParam);
                    break;

                case ID_CALC_SIN:
                    SendMessage(hWnd, WM_CHAR, TEXT('s'), lParam);
                    break;

                case ID_CALC_COS:
                    SendMessage(hWnd, WM_CHAR, TEXT('o'), lParam);
                    break;

                case ID_CALC_TAN:
                    SendMessage(hWnd, WM_CHAR, TEXT('t'), lParam);
                    break;

                case ID_CALC_LSH:
                    SendMessage(hWnd, WM_CHAR, TEXT('<'), lParam);
                    break;

                case ID_CALC_NOT:
                    SendMessage(hWnd, WM_CHAR, TEXT('~'), lParam);
                    break;

                case ID_CALC_AND:
                    SendMessage(hWnd, WM_CHAR, TEXT('&'), lParam);
                    break;

                case ID_CALC_OR:
                    SendMessage(hWnd, WM_CHAR, TEXT('|'), lParam);
                    break;

                case ID_CALC_XOR:
                    SendMessage(hWnd, WM_CHAR, TEXT('^'), lParam);
                    break;

                case ID_CALC_INT:
                    SendMessage(hWnd, WM_CHAR, TEXT(';'), lParam);
                    break;

                case ID_CALC_FACTORIAL:
                    SendMessage(hWnd, WM_CHAR, TEXT('!'), lParam);
                    break;

                case ID_CALC_RECIPROCAL:
                    SendMessage(hWnd, WM_CHAR, TEXT('r'), lParam);
                    break;

                case ID_CALC_SIGN:
                    SendMessage(hWnd, WM_KEYDOWN, VK_F9, lParam);
                    break;

                case ID_CALC_PLUS:
                    SendMessage(hWnd, WM_CHAR, TEXT('+'), lParam);
                    break;

                case ID_CALC_MINUS:
                    SendMessage(hWnd, WM_CHAR, TEXT('-'), lParam);
                    break;

                case ID_CALC_MULTIPLY:
                    SendMessage(hWnd, WM_CHAR, TEXT('*'), lParam);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -