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

📄 sciset.c

📁 计算器源代码c。和windows自带的功能差不多。很多科学计算还没有加入。
💻 C
字号:
/**************************************************************************/
/*** SCICALC Scientific Calculator for Windows 3.00.12                  ***/
/*** By Kraig Brockschmidt, Microsoft Co-op, Contractor, 1988-1989      ***/
/*** (c)1989 Microsoft Corporation.  All Rights Reserved.               ***/
/***                                                                    ***/
/*** sciset.c                                                           ***/
/***                                                                    ***/
/*** Functions contained:                                               ***/
/***    SetRadix--Changes the number base and the radiobuttons.         ***/
/***    SetBox--Handles the checkboxes for inv/hyp.                     ***/
/***                                                                    ***/
/*** Functions called:                                                  ***/
/***    none                                                            ***/
/***                                                                    ***/
/*** History:
 ***    12-Dec-1996 JonPa   -   Added SetMaxIntDigits
 ***    Whenever-97 ToddB   -   Removed SetMaxIntDigits
 ***/
/**************************************************************************/

#include "scicalc.h"
#include "unifunc.h"

extern TCHAR    szBlank[6];
extern INT      gcIntDigits;
extern TCHAR    *rgpsz[CSTRINGS];
extern TCHAR    szDec[];
extern RECT     rcDeg[6];
extern HMENU    g_hDecMenu;
extern HMENU    g_hHexMenu;

long oldRadix = (unsigned)-1;

void ActivateButtons()
{
    static int  aDecOnlyKeys[] = { IDC_FE, IDC_DMS, IDC_SIN, IDC_COS, IDC_TAN, IDC_EXP, IDC_PI };   // controls used only in Decimal mode

    if (oldRadix != nRadix)
    {
        int i;
        BOOL bDecMode = (nRadix == 10);
        
        // Only send messages to the the "Decimal Only keys" if this change in
        // base effects those keys

        if ((oldRadix == 10) || bDecMode)
        {
            // we are changing to or from decimal mode
            for ( i = 0; i <= ARRAYSIZE(aDecOnlyKeys) ; i++ )
            {
                EnableWindow( GetDlgItem(g_hwndDlg, aDecOnlyKeys[i]), 
                              bDecMode );
            }
        }

        // insure that nRadix is within the allowed range
        ASSERT( (nRadix >= 2) && (nRadix <= 16) );
        
        // turn on digit keys less than nRadix and turn off digit keys >= nRadix
        for (i=2; i<nRadix; i++)
            EnableWindow( GetDlgItem(g_hwndDlg, IDC_0+i), TRUE );

        for ( ; i<16; i++ )
            EnableWindow( GetDlgItem(g_hwndDlg, IDC_0+i), FALSE );
    }
    oldRadix = nRadix;
}

// SetRadix sets the display mode according to the selected button.
// ToddB:  As a hack to allow setting other bases, wRadix can be one of
//         the base buttons OR it can be the desired nRadix.

// MAXIUM: for Dec the precision is limited to the nPrecision, 
//  otherwise it is limited to the word size.

VOID NEAR SetRadix(DWORD wRadix)
{
    static INT  nRadish[4]={2,8,10,16}; /* Number bases.               */

    int   id=IDM_DEC;

    // convert special bases into symbolic values
    switch ( wRadix )
    {
    case 2:
        id=IDM_BIN;
        break;

    case 8:
        id=IDM_OCT;
        break;

    case 10:
        id=IDM_DEC;
        break;

    case 16:
        id=IDM_HEX;
        break;

    case IDM_HEX:
    case IDM_DEC:
    case IDM_OCT:
    case IDM_BIN:
        id=wRadix;
        wRadix = nRadish[IDM_BIN - wRadix];
        break;
    }

    // we select which group of toggles we are setting, decimal mode gets the
    // angular notation buttons (deg, rad, grad) otherwise we get the word size 
    // buttons (dword, word, byte)

    SwitchModes(wRadix, nDecMode, nHexMode);

    CheckMenuRadioItem(GetSubMenu(GetMenu(g_hwndDlg),1),IDM_HEX,IDM_BIN,id,
                       MF_BYCOMMAND);

    CheckRadioButton(g_hwndDlg,IDM_HEX, IDM_BIN, id);

    nRadix = wRadix;

    // inform ratpak that a change in base or precision has occured
    BaseOrPrecisionChanged();
    
    // update the UI elements to the correct state
    ActivateButtons();

    // display the correct number for the new state (ie convert displayed 
    //  number to correct base)
    DisplayNum();
}


// Check/uncheck the visible inverse/hyperbolic

VOID NEAR SetBox (int id, BOOL bOnOff)
{
    CheckDlgButton(g_hwndDlg, id, (WORD) bOnOff);
    return;
}

//
// Description:
//   This will switch the displayed/enabled mode buttons.  This also updates
//   The switches the menu under view and sets the correct state.
//
void
SwitchModes(DWORD wRadix, int nDecMode, int nHexMode)
{
    int iID, id;

    if (10 == wRadix)
    {
        id=IDM_DEG+nDecMode;

        if (NULL != g_hDecMenu)
            SetMenu(g_hwndDlg, g_hDecMenu);

        CheckMenuRadioItem(g_hDecMenu, IDM_DEG, IDM_GRAD, id, MF_BYCOMMAND);
        CheckRadioButton(g_hwndDlg,IDC_DEG, IDC_GRAD, id);
    }
    else
    {
        id=IDM_QWORD+nHexMode;

        if (NULL != g_hHexMenu)
            SetMenu(g_hwndDlg, g_hHexMenu);

        CheckMenuRadioItem(g_hHexMenu, IDM_QWORD, IDM_BYTE, id, MF_BYCOMMAND);
        CheckRadioButton(g_hwndDlg,IDC_QWORD, IDC_BYTE, id);
    }

    for (iID = IDC_QWORD; iID <= IDC_BYTE; iID++)
    {
        EnableWindow( GetDlgItem( g_hwndDlg, iID ), (wRadix != 10) );
        ShowWindow( GetDlgItem( g_hwndDlg, iID ),
                    (wRadix == 10) ? SW_HIDE : SW_SHOW );
    }

    for (iID = IDC_DEG; iID <= IDC_GRAD; iID++)
    {
        EnableWindow( GetDlgItem( g_hwndDlg, iID ), (wRadix == 10) );
        ShowWindow( GetDlgItem( g_hwndDlg, iID ), 
                    (wRadix != 10) ? SW_HIDE : SW_SHOW );
    }
}


⌨️ 快捷键说明

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