c++ - ANSI 项目中的 SetWindowTextW

标签 c++ winapi unicode mfc

我有一个 ANSI 项目。我需要将 CDialog 派生类的标题栏设置为 Unicode 文本。

BOOL CMyDialog::OnInitDialog()
{
    CDialog::OnInitDialog();

    ::SetWindowTextW(GetSafeHwnd(), PathFindFileNameW(filename));

    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}

但是当 unicode 文本包含非 ANSI 字符时,它们显示为问号。我得到类似“??????.doc”的内容。我在使用静态控件时遇到了类似的问题,但奇怪的是,编辑框 SetWindowTextW 可以正常工作。

哦,这个项目是一个无法转换为 Unicode 的大型遗留项目。

最佳答案

SetWindowText()/SetWindowTextA() 和 SetWindowTextW() 都是真正的 WM_SETTEXT,它是创建多字节/Ansi 窗口时受代码页转换影响的少数消息之一。这意味着消息没有 W 和 A 版本。

即便如此,在作为 Ansi/Multibyte 应用程序构建的 Vista/Win7 标题栏中显示 Unicode 还是很容易的。您需要做的就是拦截窗口中的 WM_SETTEXT 消息并将参数传递给 DefWindowProcW() 而不是通常的 DefWindowProcA/DefWindowProc()。这是可行的,因为在内部所有窗口实际上都是 unicode。

请注意,如果您只是将参数传递给 DefWindowProcW(),那么您必须绝对确定该参数确实指向一个 wchar_t 字符串。

在我自己的例子中,所有 char 字符串都被假定为 UTF-8 字符。这意味着普通的 ANSI 字符串仍然像以前一样工作。当我拦截窗口中的 WM_SETTEXT 消息时,我使用 MultiByteToWideChar() 将 UTF-8 字符转换为 wchar_t,然后将结果显式传递给 DefWindowProcW()。

好的副作用是它也会在任务栏上显示 unicode 字符。

XP 有一个问题,即使任务栏显示正确,但标题栏显示不正确。

关于c++ - ANSI 项目中的 SetWindowTextW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410681/

相关文章:

c++ - 计算文本文件C++中的行数

Qt 插件接口(interface)中模板类的 C++ 替代方案

java - 如何验证 CharSequence 的实例是否是 Unicode 标量值序列?

c++ - 在不解析 C++ 的情况下将 html 转换为纯文本?

c++ - 在 C++ 中生成一个字符串映射到 std::list of pointers

winapi - VB4 AddressOf 等效项(向系统菜单添加项目)

c# - Win32 API GetMenuItemInfo 仅返回项目文本的第一个字符

c++ - WTSEnumerateSessions API获取的session ID是否唯一?

python - Python 字符串比较_真正_是如何工作的?

file - 使用 COBOL 将 Unicode 字符串写入文件