Текст нижнего колонтитула календаря CMonthCalCtrl (сегодняшняя дата) - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь настроить CMonthCalCtrl и не могу понять, как я могу получить текст нижнего колонтитула (текст, который используется для перехода к дате «сегодня»):

enter image description here

Я пытался использовать функцию GetCalendarGridInfo с флагами MCGIP_FOOTER и MCGIF_NAME, но она не возвращает строку:

    CString cText;
    MCGRIDINFO mcFooterInfo = { sizeof(MCGRIDINFO) };
    mcFooterInfo.dwPart = MCGIP_FOOTER;
    mcFooterInfo.dwFlags = MCGIF_NAME;
    mcFooterInfo.pszName = cText.GetBuffer(_MAX_PATH);
    mcFooterInfo.cchName = _MAX_PATH;
    GetCalendarGridInfo(&mcFooterInfo);

    // at this point mcFooterInfo.pszName contains "9" instead of "Сегодня: 12.02.2020"

Это возвращает " 9 "вместо текста нижнего колонтитула.

Я не могу отформатировать дату самостоятельно, потому что мне нужно поддерживать текущий язык пользователя и мне нужно знать, как пишется часть" Сегодня: ".

Кто-нибудь знает, как это решить?

1 Ответ

1 голос
/ 13 февраля 2020

Я собираюсь поделиться одним из способов получения этого текста, хотя я не собираюсь его использовать и не рекомендую никому другому его использовать.

Я нашел эту топи c, который описывает способ получения локализованных windows строк. Я начал играть с этим и обнаружил, что ComCtl32.dll содержит строку ресурса, которая, кажется, та, которую использует элемент управления календаря. Ресурс, содержащий строку «Today:», имеет ID: 4432. Но это не документированная область, поэтому никто не может полагаться на это, и это может изменяться от выпуска к выпуску.

Однако вот пример кода, который извлекает строку «Today:» на разных языках:

    GetTodayString(GetUserDefaultUILanguage()); // Сегодня:
    GetTodayString(MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT)); // Today:
    GetTodayString(MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT)); // Aujourd’hui :
    GetTodayString(MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT)); // Heute:
    GetTodayString(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN)); // Hoy:
    GetTodayString(MAKELANGID(LANG_UKRAINIAN, SUBLANG_DEFAULT)); // Сьогодні:

    CString GetTodayString(LANGID langId)
    {
        HMODULE hComCtl32 = LoadLibrary(_T("comctl32.dll"));
        if (!hComCtl32)
            return _T("");

        UINT nResourceId = 4432; // I don't think that anyone should rely on this
        CString cResourceStr = FindStringResourceEx(hComCtl32, nResourceId, langId);

        FreeLibrary(hComCtl32);

        int delimiterIdx = cResourceStr.Find(_T('\x6'));
        CString cTodayStr = cResourceStr.Left(delimiterIdx);

        return cTodayStr;
    }

    CString FindStringResourceEx(HINSTANCE hinst, UINT uId, UINT langId)
    {
        // Convert the string ID into a bundle number
        LPCWSTR pwsz = NULL;
        HRSRC hrsrc = FindResourceEx(hinst, RT_STRING,
            MAKEINTRESOURCE(uId / 16 + 1),
            langId);
        if (hrsrc) {
            HGLOBAL hglob = LoadResource(hinst, hrsrc);
            if (hglob) {
                pwsz = reinterpret_cast<LPCWSTR>
                    (LockResource(hglob));
                if (pwsz) {
                    // okay now walk the string table
                    for (int i = 0; i < (uId & 15); i++) {
                        pwsz += 1 + (UINT)*pwsz;
                    }

                    pwsz += 1;
                }
            }
        }
        return CString(pwsz);
    }

Как я уже сказал, я не собираюсь использовать этот подход, и, вероятно, я просто опущу текст "Today:" и выведу только отформатированную дату сегодня в нижнем колонтитуле.

...