- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 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/
我有一个 ANSI 项目。我需要将 CDialog 派生类的标题栏设置为 Unicode 文本。 BOOL CMyDialog::OnInitDialog() { CDialog::OnIni
在 MFC 中没有定义为 CWnd::SetWindowTextA/CWnd::SetWindowTextW 的方法,但是下面的代码将根据 Unicode 设置正确编译和运行: //UNICODE i
我遇到一个问题,即 unicode 文件名在我的编辑框中显示为问号。 当我在编辑框中粘贴 unicode 字符时,例如阿拉伯语或泰语,它们会正确显示,但在我运行此代码后,它们变成了问号。怎么会? WC
我是一名优秀的程序员,十分优秀!