如何使用MBCS来支持没有代码页的语言?

时间:2012-09-21 07:06:42

标签: mfc locale

MFC应用程序需要在对话框中编辑ctrl以编辑Tamil语言。 但我发现泰米尔语在Windows中没有代码页(是的,没有泰米尔语系统语言环境),并且Unicode选项不在我的情况下。

看到某人的想法,Embedding HWND into external process using SetParent

我想创建另一个使用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 ...)

1 个答案:

答案 0 :(得分: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无法神奇地解决这个问题。它可以为某些调用提供更好的语法,在类,构造函数和destuctors中包装Win32惯用语。但它不能凭空创造缺失的代码页。