3

这是一个我从未想过的老问题 - 想知道这里是否有人碰巧知道你脑海中的答案......

在我们软件的某些部分 (MFC/Win32/MBCS) 我的代码只会收到

TTN_NEEDTEXTW

在我们软件的其他部分,我会收到 MBCS 正确消息

TTN_NEEDTEXTA

对我来说完全是无稽之谈。

我知道我们的软件可以编译为 Unicode 或不编译(我们设置为使用多字节字符集)。我有一个模糊的回忆,每个窗口都可以构造成 Unicode 或不构造,虽然这是一个模糊的记忆,没有什么具体的。

有谁知道为什么我们会在代码中的某些地方得到宽版本消息,尽管被编译为多字节?

笔记:

  • 我们绝对不会发送此消息 - 大概是 ToolTip 控件。
  • 我们肯定只在某些地方接收到 (W) 消息,而在其他地方肯定只接收到 (A) 消息。
  • 我确定所有编译模块都使用 MBCS,而不是 Unicode,并且构建目标都指定 MBCS 而不是 Unicode。
  • 这似乎只发生在 CMainFrame 托管的窗口和控件上。即主框架之外的窗口可以使用窄版本(比如在对话框中)。
4

2 回答 2

5

公共控件向您发送一条WM_NOTIFYFORMAT消息,询问您“您希望接收 MBCS 通知还是 Unicode 通知?” 默认是根据窗口是通过CreateWindowExW还是创建的来响应的CreateWindowExA

于 2012-09-25T19:48:08.303 回答
1

使用 MFC ansi 应用程序(处理 unicode 数据),我在 CStatic 派生类和工具提示中遇到了这个问题,我得到的是 TTN_NEEDTEXTA,而不是在我的情况下,是所需的 TTN_NEEDTEXTW。

使用接受的答案,设法获得 TTN_NEEDTEXTW。

BEGIN_MESSAGE_MAP(CStaticDerived, CStatic)
ON_WM_NOTIFYFORMAT()
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnTTNeedText)
END_MESSAGE_MAP()

UINT CStaticDerived::OnNotifyFormat(
    CWnd *pWnd,
    UINT nCommand) {

    if (pWnd->m_hWnd
            == AfxGetModuleThreadState()->m_pToolTip->m_hWnd) {
        // want TTN_NEEDTEXTW for tooltips
        return NFR_UNICODE;
    }

    return __super::OnNotifyFormat(pWnd, nCommand);
}
于 2021-05-06T15:01:42.260 回答