gpt4 book ai didi

c++ - CMonthCalCtrl日历页脚文本(今天的日期)

转载 作者:行者123 更新时间:2023-12-02 10:20:59 25 4
gpt4 key购买 nike

我正在尝试自定义CMonthCalCtrl,但我不明白如何获取页脚文本(用于导航至“今天”日期的文本):

enter image description here

我尝试将GetCalendarGridInfo函数与MCGIP_FOOTERMCGIF_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”,而不是页脚文本。

我无法自己格式化日期,因为我需要支持当前的用户语言,并且需要知道如何拼写“Today:”部分。

有谁知道如何解决这个问题?

最佳答案

我将分享一种获取文本的方法,即使我不打算使用它,也不建议任何人使用它。

我发现this topic描述了获取本地化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:”文本,而只在页脚中显示今天格式化的日期。

关于c++ - CMonthCalCtrl日历页脚文本(今天的日期),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60191692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com