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

📄 nums.c

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

    /* if is not success, add new value to list and select them */
    if(nRetCode == CB_ERR)
    {
        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),
                     CB_ADDSTRING,
                     MAX_FIELD_SEP_SAMPLES+1,
                     (LPARAM)wszFieldSep);
        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),
                     CB_SELECTSTRING,
                     -1,
                     (LPARAM)(LPCSTR)wszFieldSep);
    }
}

/* Init number of fractional symbols control box */
VOID
InitNumOfFracSymbCB(HWND hwndDlg)
{
    int nCBIndex;
    int nRetCode;

    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
    WCHAR wszFracNum[MAX_SAMPLES_STR_SIZE];
    WCHAR wszFracCount[MAX_SAMPLES_STR_SIZE];

    /* Get current number of fractional symbols */
    GetLocaleInfoW(LOCALE_USER_DEFAULT,
                   LOCALE_IDIGITS,
                   wszFracNum,
                   dwValueSize);

    /* Clear all box content */
    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),
                 CB_RESETCONTENT,
                 (WPARAM)0,
                 (LPARAM)0);

    /* Create standart list of fractional symbols */
    for(nCBIndex=0;nCBIndex<MAX_FRAC_NUM_SAMPLES;nCBIndex++)
    {
        /* convert to wide char */
        _itow(nCBIndex,wszFracCount,DECIMAL_RADIX);

        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),
                     CB_ADDSTRING,
                     nCBIndex,
                     (LPARAM)wszFracCount);
    }

    /* Set current item to value from registry */
    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),
                           CB_SETCURSEL,
                           (WPARAM)_wtoi(wszFracNum),
                           (LPARAM)0);
}

/* Init num decimal separator control box */
VOID
InitNumDecimalSepCB(HWND hwndDlg)
{
    WCHAR wszNumSepSamples[MAX_NUM_SEP_SAMPLES][MAX_SAMPLES_STR_SIZE]=
    {
        L",",
        L"."
    };

    int nCBIndex;
    int nRetCode;

    DWORD dwValueSize=MAX_SAMPLES_STR_SIZE*sizeof(WCHAR)+EOLN_SIZE;
    WCHAR wszNumSep[MAX_SAMPLES_STR_SIZE];

    /* Get current decimal separator */
    GetLocaleInfoW(LOCALE_USER_DEFAULT,
                   LOCALE_SDECIMAL,
                   wszNumSep,
                   dwValueSize);

    /* Clear all box content */
    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),
                 CB_RESETCONTENT,
                 (WPARAM)0,
                 (LPARAM)0);

    /* Create standart list of decimal separators */
    for(nCBIndex=0;nCBIndex<MAX_NUM_SEP_SAMPLES;nCBIndex++)
    {
        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),
                     CB_ADDSTRING,
                     nCBIndex,
                     (LPARAM)wszNumSepSamples[nCBIndex]);
    }

    /* Set current item to value from registry */
    nRetCode = SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),
                           CB_SELECTSTRING,
                           -1,
                           (LPARAM)(LPCSTR)wszNumSep);

    /* if is not success, add new value to list and select them */
    if(nRetCode == CB_ERR)
    {
        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),
                     CB_ADDSTRING,
                     MAX_NUM_SEP_SAMPLES+1,
                     (LPARAM)wszNumSep);
        SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),
                     CB_SELECTSTRING,
                     -1,
                     (LPARAM)(LPCSTR)wszNumSep);
    }
}

/* Set units system */
BOOL
SetNumUnitsSys(HWND hwndDlg)
{
    WCHAR wszUnitsSys[MAX_SAMPLES_STR_SIZE];
    INT nCurrSel;

    /* Get setted units system */
    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMUNITSSYS_COMBO),
                          CB_GETCURSEL,
                          (WPARAM)0,
                          (LPARAM)0);

    /* convert to wide char */
    _itow(nCurrSel,wszUnitsSys,DECIMAL_RADIX);

    /* Save units system */
    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IMEASURE, wszUnitsSys);

    return TRUE;
}

/* Set elements list separator */
BOOL
SetNumListSep(HWND hwndDlg)
{
    WCHAR wszListSep[MAX_SAMPLES_STR_SIZE];

    /* Get setted list separator */
    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMELEMLISTSEP_COMBO),
                 WM_GETTEXT,
                 (WPARAM)MAX_SAMPLES_STR_SIZE,
                 (LPARAM)(LPCSTR)wszListSep);

    /* Save list separator */
    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SLIST, wszListSep);

    return TRUE;
}

/* Set leading zero */
BOOL
SetNumLeadZero(HWND hwndDlg)
{
    WCHAR wszLeadZero[MAX_SAMPLES_STR_SIZE];
    INT nCurrSel;

    /* Get setted leading zero format */
    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMLEADZERO_COMBO),
                          CB_GETCURSEL,
                          (WPARAM)0,
                          (LPARAM)0);

    /* convert to wide char */
    _itow(nCurrSel,wszLeadZero,DECIMAL_RADIX);

    /* Save leading zero format */
    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ILZERO, wszLeadZero);

    return TRUE;
}

/* Set negative sum format */
BOOL
SetNegSumFmt(HWND hwndDlg)
{
    WCHAR wszNegSumFmt[MAX_SAMPLES_STR_SIZE];
    INT nCurrSel;

    /* Get setted negative sum format */
    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGFMT_COMBO),
                          CB_GETCURSEL,
                          (WPARAM)0,
                          (LPARAM)0);

    /* convert to wide char */
    _itow(nCurrSel,wszNegSumFmt,DECIMAL_RADIX);

    /* Save negative sum format */
    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_INEGNUMBER, wszNegSumFmt);

    return TRUE;
}

/* Set negative sign */
BOOL
SetNumNegSign(HWND hwndDlg)
{
    WCHAR wszNegSign[MAX_SAMPLES_STR_SIZE];

    /* Get setted negative sign */
    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMNEGSIGN_COMBO),
                 WM_GETTEXT,
                 (WPARAM)MAX_SAMPLES_STR_SIZE,
                 (LPARAM)(LPCSTR)wszNegSign);

    /* Save negative sign */
    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SNEGATIVESIGN, wszNegSign);

    return TRUE;
}

/* Set number of digidts in field  */
BOOL
SetFieldDigNum(HWND hwndDlg)
{
    WCHAR wszFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]=
    {
        L"0;0",
        L"3;0",
        L"3;2;0"
    };

    int nCurrSel;

    /* Get setted number of digidts in field */
    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDIGFIELD_COMBO),
                          CB_GETCURSEL,
                          (WPARAM)0,
                          (LPARAM)0);

    /* Save number of digidts in field */
    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SGROUPING, wszFieldDigNumSamples[nCurrSel]);

    return TRUE;
}

/* Set field separator */
BOOL
SetNumFieldSep(HWND hwndDlg)
{
    WCHAR wszFieldSep[MAX_SAMPLES_STR_SIZE];

    /* Get setted field separator */
    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFIELDSEP_COMBO),
                 WM_GETTEXT,
                 (WPARAM)MAX_SAMPLES_STR_SIZE,
                 (LPARAM)(LPCSTR)wszFieldSep);

    /* Save field separator */
    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, wszFieldSep);

    return TRUE;
}

/* Set number of fractional symbols */
BOOL
SetFracSymNum(HWND hwndDlg)
{
    WCHAR wszFracSymNum[MAX_SAMPLES_STR_SIZE];
    INT nCurrSel;

    /* Get setted number of fractional symbols */
    nCurrSel=SendMessageW(GetDlgItem(hwndDlg, IDC_NUMFRACSYBMS_COMBO),
                          CB_GETCURSEL,
                          (WPARAM)0,
                          (LPARAM)0);

    /* convert to wide char */
    _itow(nCurrSel,wszFracSymNum,DECIMAL_RADIX);

    /* Save number of fractional symbols */
    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, wszFracSymNum);

    return TRUE;
}

/* Set num decimal separator */
BOOL
SetNumDecimalSep(HWND hwndDlg)
{
    WCHAR wszDecimalSep[MAX_SAMPLES_STR_SIZE];

    /* Get setted decimal separator */
    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMDECIMALSEP_COMBO),
                 WM_GETTEXT,
                 (WPARAM)MAX_SAMPLES_STR_SIZE,
                 (LPARAM)(LPCSTR)wszDecimalSep);

    /* Save decimal separator */
    SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, wszDecimalSep);

    return TRUE;
}

/* Update all numbers locale samples */
static
VOID
UpdateNumSamples(HWND hwndDlg,
                        LCID lcidLocale)
{
    WCHAR OutBuffer[MAX_FMT_SIZE];

    /* Get positive number format sample */
    GetNumberFormatW(lcidLocale,
                     0,
                     SAMPLE_NUMBER,
                     NULL,
                     OutBuffer,
                     MAX_FMT_SIZE);

    SendMessageW(GetDlgItem(hwndDlg, IDC_NUM_EDIT),
                 WM_SETTEXT,
                 0,
                 (LPARAM)OutBuffer);

    /* Get positive number format sample */
    GetNumberFormatW(lcidLocale,
                     0,
                     SAMPLE_NEG_NUMBER,
                     NULL,
                     OutBuffer,
                     MAX_FMT_SIZE);

    SendMessageW(GetDlgItem(hwndDlg, IDC_NEGNUM_EDIT),
                 WM_SETTEXT,
                 0,
                 (LPARAM)OutBuffer);
}

/* Numbers options setup page dialog callback */
INT_PTR
CALLBACK
NumsOptsSetProc(HWND hwndDlg,
                UINT uMsg,
                WPARAM wParam,
                LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(hwndDlg);
    switch(uMsg)
    {
        case WM_INITDIALOG:
        {
            /* Init combo boxes */
            InitNumDecimalSepCB(hwndDlg);
            InitNumOfFracSymbCB(hwndDlg);
            InitNumFieldSepCB(hwndDlg);
            InitFieldDigNumCB(hwndDlg);
            InitNegSignCB(hwndDlg);
            InitNegNumFmtCB(hwndDlg);
            InitLeadingZeroesCB(hwndDlg);
            InitListSepCB(hwndDlg);
            InitUnitsSysCB(hwndDlg);

            UpdateNumSamples(hwndDlg, LOCALE_USER_DEFAULT);
        }
        break;

        case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
                case IDC_NUMDECIMALSEP_COMBO:
                case IDC_NUMFRACSYBMS_COMBO:
                case IDC_NUMFIELDSEP_COMBO:
                case IDC_NUMDIGFIELD_COMBO:
                case IDC_NUMNEGSIGN_COMBO:
                case IDC_NUMNEGFMT_COMBO:
                case IDC_NUMLEADZERO_COMBO:
                case IDC_NUMELEMLISTSEP_COMBO:
                case IDC_NUMUNITSSYS_COMBO:
                case IDC_NUMREGDIG_COMBO:
                case IDC_NUMDIGREPL_COMBO:
                {
                    if (HIWORD(wParam) == CBN_SELCHANGE ||
                        HIWORD(wParam) == CBN_EDITCHANGE)
                    {
                        /* Set "Apply" button enabled */
                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                    }
                }
                break;
            }
        }
        break;

        case WM_NOTIFY:
        {
            LPNMHDR lpnm = (LPNMHDR)lParam;
            /* If push apply button */
            if (lpnm->code == (UINT)PSN_APPLY)
            {
                if(!SetNumDecimalSep(hwndDlg)) break;
                if(!SetFracSymNum(hwndDlg)) break;
                if(!SetNumFieldSep(hwndDlg)) break;
                if(!SetFieldDigNum(hwndDlg)) break;
                if(!SetNumNegSign(hwndDlg)) break;
                if(!SetNegSumFmt(hwndDlg)) break;
                if(!SetNumLeadZero(hwndDlg)) break;
                if(!SetNumListSep(hwndDlg)) break;
                if(!SetNumUnitsSys(hwndDlg)) break;

                /* Update sum format combo boxes */
                InitLeadingZeroesCB(hwndDlg);
                InitNegNumFmtCB(hwndDlg);

                /* FIXME: */
                Sleep(15);
                /* Update sum format samples */
                UpdateNumSamples(hwndDlg, LOCALE_USER_DEFAULT);
            }
        }
        break;
  }
  return FALSE;
}


/* EOF */

⌨️ 快捷键说明

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