MFC 应用程序需要在对话框中进行编辑 ctrl 才能编辑泰米尔语。但是我发现泰米尔语在Windows中没有代码页(是的,没有泰米尔语系统区域设置),并且Unicode选项不在我的情况下。
看到有人的想法,使用 SetParent 将 HWND 嵌入到外部进程中
我想创建另一个使用 UNICODE 选项构建的应用程序,将其窗口嵌入到对话框中,但失败了。检查 MSDN,SetParent 需要在一个应用程序中的父窗口和子窗口。
那么,我该如何实现它呢?
@MSalters
我通过覆盖虚拟 BOOL CWinThread::P umpMessage() 来解决它,强制消息循环使用 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;
}
然后创建窗口ExW(...MSFTEDIT_CLASS...
泰米尔语确实比平时更难。但仍然有一件事是显而易见的:使用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 习惯用法包装在类、构造函数和 destuctor 中。但它不能凭空创建缺少的代码页。