0

MFC 应用程序需要在对话框中使用编辑 ctrl 来编辑泰米尔语。但是我发现泰米尔语在 Windows 中没有代码页(是的,没有泰米尔语系统区域设置),并且 Unicode 选项不适合我的情况。

看到有人的想法,使用 SetParent 将 HWND 嵌入到外部进程中

我想创建另一个使用 UNICODE 选项构建的应用程序,将其窗口嵌入到对话框中,但失败了。查看 MSDN,SetParent 需要父子窗口在一个应用程序中。

那么,我该如何实施呢?

@MSalters

我通过覆盖虚拟 BOOL CWinThread::PumpMessage() 解决了它,强制消息循环使用 W 版本 API。

BOOL CtamildlgApp::PumpMessage()
{
    _AFX_THREAD_STATE *pState = AfxGetThreadState();

    if ( !::GetMessageW( &( pState->m_msgCur ), NULL, NULL, NULL ) )
    {
        // Note: prevents calling message loop things in 'ExitInstance'
        // will never be decremented
        return FALSE;
    }

    // process this message

    if ( pState->m_msgCur.message != WM_KICKIDLE )
    {
        ::TranslateMessage( &( pState->m_msgCur ) );
        ::DispatchMessageW( &( pState->m_msgCur ) );
    }

    return TRUE;
}

然后 CreateWindowExW(... MSFTEDIT_CLASS ...)

4

1 回答 1

0

泰米尔语确实比平时更难。但仍有一件事很明显:使用 Unicode,而不是 MBCS。在内部,所有 Windows 函数都是 Unicode。MBCS 包装器使用当前代码页将多字节编码转换为 UTF-16。例如,当您调用时MessageBoxA("Some String"),当前代码页用于将其转换为MessageBoxW(L"Some String").

现在,这直接意味着您不能调用MessageBoxA("Narrow Tamil String"),因为没有代码页可以将其转换为适当的宽字符串。您必须直接调用 Unicode 函数MessageBoxW("Narrow Tamil String")

MFC 不能神奇地解决这个问题。它可以为某些调用提供更好的语法,将 Win32 惯用语包装在类、构造函数和析构函数中。但它不能凭空创建缺失的代码页。

于 2012-09-21T07:35:59.210 回答