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

Mfc 如何使用MBCS来支持没有代码页的语言?,mfc,locale,Mfc,Locale,MFC应用程序需要“编辑泰米尔语言”的“编辑ctrl-in”对话框。 但我发现泰米尔语言在Windows中没有代码页(是的,没有泰米尔系统语言环境),Unicode选项在我的情况下不适用 看到某人的想法 我想创建另一个使用UNICODE选项构建的应用程序,将其窗口嵌入对话框,但失败了。 检查MSDN,SetParent需要一个应用程序中的父窗口和子窗口 那么,我如何实现它呢 @MSalters 我通过重写虚拟BOOL CWinThread::PumpMessage()解决了这个问题,强制消息循环

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

看到某人的想法

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

泰米尔语确实比平常更难。但仍然有一件事是显而易见的:使用Unicode,而不是MBCS。在内部,所有Windows函数都是Unicode。MBCS包装器使用当前代码页将多字节编码转换为UTF-16。例如,当您调用
MessageBoxA(“某些字符串”)
时,当前代码页用于将其转换为调用
MessageBoxW(L“某些字符串”)

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


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

看这里:,这里:和这里:如果只显示Taminl语言,使用DrawTextW就可以完成这项工作。但是需要编辑,我不知道。那只是最后的一个
CreateWindowExW(…MSFTEDIT_CLASS…
调用。@WenboHuang:这本身可能是一个有效的问题,特别是如果你能显示代码的话。但要清楚什么是失败的。添加控件,或在其中使用泰米尔语?我在对话框OnInitDialog方法中添加以下代码://TODO:在此处添加额外初始化LoadLibrary(TEXT(“Msftedit.dll”);CreateWindowExW(0,MSFTEDIT_类,NULL,WS_子项| WS|u可见| ES|u多行| WS|u选项卡,0,0,300,100,this->m|hWnd,NULL,NULL,NULL);当我输入泰米尔语字符时,它会显示“?”。@文波黄:不要在评论中提出问题。您可能希望添加输入该字符的确切方式。