0

MFC アプリケーションでは、タミル語を編集するためのダイアログで編集 ctrl が必要です。しかし、タミル語には Windows のコード ページがなく (はい、タミル語のシステム ロケールはありません)、Unicode オプションは私の状況にはありません。

SetParentを使用してHWNDを外部プロセスに埋め込むというアイデアを見た

UNICODE オプションで構築された別のアプリケーションを作成し、そのウィンドウをダイアログに埋め込みたいのですが、失敗しました。MSDN を確認してください。SetParent には、1 つのアプリケーションで親ウィンドウと子ウィンドウが必要です。

では、どうすれば実装できますか?

@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

タミル語は確かにいつもより難しいです。しかし、明らかなことが 1 つあります。それは、MBCS ではなく Unicode を使用することです。内部的には、すべての 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 に答える