ANSI项目中的SetWindowTextW

sas*_*alm 3 c++ unicode winapi 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
}
Run Code Online (Sandbox Code Playgroud)

但是,当unicode文本包含非ANSI字符时,它们将显示为问号.我得到像"?????.doc"之类的东西.我有静态控件的类似问题,但奇怪的是,编辑框SetWindowTextW工作.

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

Tom*_*son 6

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有一个问题,即使任务栏是,标题栏也无法正确显示.