0

複数の言語にローカライズした古い MFC アプリがあります。ユーザーが言語を選択できる言語メニューがあります (アプリの再起動が必要です)。アラビア語などの RTL 言語が選択されている場合、メイン ウィンドウ フレーム、および AfxMessageBox などの呼び出しを介してコードで作成されたダイアログは、LTR のままです。アラビア語でウィンドウを実行するシステムで実行した場合でも。ロードされるリソースの種類に基づいて、作成するすべてのウィンドウに WS_EX_LAYOUTRTL ビットを設定したいと考えています。AfxGetResourceHandle から取得したハンドルを使用して、リソースが RTL であるかどうかを照会する方法はありますか? そうでない場合、これを行う別の方法はありますか?

編集:

明確にするために、私の問題は、ロードされたリソースdllがRTLであっても、メインウィンドウフレームとすべての動的ダイアログがLTRレイアウトのままであることです。ユーザーが言語メニューのドロップダウンから言語を選択して設定したレジストリに保存されている 3 文字のコードに基づいて、アプリの initinstance 関数で最初にリソース dll を読み込みます。dll からのすべてのリソースは正常に動作します。メイン フレームと、エラーが発生したときにメッセージ ボックスなどを読み込む一般的なダイアログに問題があるだけです。おそらく、このコード スニペットは、私が探しているものを説明するのに役立ちます。

BOOL CWinGFMainFrame::PreCreateWindow( CREATESTRUCT& cs )
{
    HINSTANCE hInst = AfxGetResourceHandle ();
    if( hInst )
    {
        //Add some logic here to determine if the loaded resource dll is RTL
        cs.dwExStyle |= WS_EX_RTLREADING | WS_EX_LAYOUTRTL;
    }

    if( !CFrameWnd::PreCreateWindow( cs ) )
    {
        return FALSE;
    }

    cs.style = WS_OVERLAPPED  | WS_CAPTION  | FWS_ADDTOTITLE
             | WS_THICKFRAME  | WS_SYSMENU  | WS_MINIMIZEBOX 
             | WS_MAXIMIZEBOX | WS_MAXIMIZE;

    return TRUE;
}

この方法ではない場合、3 文字の国コードや言語 ID などのロケール情報に基づいて読み上げ順序を決定するために使用できる関数はありますか? Windows7 ビルドでは、次のことができますが、Windows XP をサポートする必要があります :(.

int nResult = GetLocaleInfo ( lcid, LOCALE_IREADINGLAYOUT, NULL, 0 );
TCHAR* szReadingLayout = new TCHAR[ nResult ];
nResult = GetLocaleInfo ( lcid, LOCALE_IREADINGLAYOUT, szReadingLayout, nResult );

EDIT2:

まだこれを行おうとしています。動作するはずの次のコードがありますが、動作しません。ハンドルを取得しているダイアログのlayoutrtlがtrueに設定されており、3つの項目があることを知っています。次のコードを実行すると、dwextendstyle は 0 で、cdit も 0 ですが、3 である必要があります。AfxGetResourceHandle がアラビア語リソースへのハンドルを返すことを確認しました。

HINSTANCE hInst = AfxGetResourceHandle ();
if( hInst )
{
    //Make sure I'm looking at the right file.
    char szPath[ MAX_PATH ];
    DWORD result = ::GetModuleFileName( hInst, szPath, MAX_PATH );
    if( result )
    {
        ATLTRACE( "Setting resource handle to %s\n", szPath );
    }

    // Locate the dialog box resource
    HRSRC hRes = FindResource( hInst, MAKEINTRESOURCE( IDD_ABOUTBOX ), RT_DIALOG );
    if ( hRes )
    {
        // Load the dialog box
        HGLOBAL hResLoad = LoadResource( hInst, hRes );
        if ( hResLoad )
        {
            // Get a real pointer to the resource
            LPVOID lpResLock = LockResource( hResLoad );
            if (lpResLock )
            {
                // Cast the raw bits to something useful
                LPDLGTEMPLATE pDlgTemplate = (LPDLGTEMPLATE)lpResLock;
                if( pDlgTemplate )
                {
                    if( pDlgTemplate->dwExtendedStyle & WS_EX_RTLREADING || 
                        pDlgTemplate->dwExtendedStyle & WS_EX_LAYOUTRTL )
                    {
                        cs.dwExStyle |= WS_EX_RTLREADING | WS_EX_LAYOUTRTL;
                    }
                }
            }
        }
    }
}

私のリソースファイルでは、アバウトダイアログはこのように定義されていますが、コード内のEXSTYLEを手に入れることができないようです...

100 DIALOGEX 0, 0, 257, 83, 0
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_DLGFRAME
EXSTYLE WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_LAYOUTRTL
CAPTION "حول جهاز التدريب على طلب المساندة في إطلاق النيران"
LANGUAGE LANG_ARABIC, SUBLANG_ARABICNEUTRAL
FONT 8, "Tahoma"
{
     ICON   128, -1, 7, 8, 20, 20
     DEFPUSHBUTTON   "موافق", 1, 178, 7, 50, 14, WS_GROUP, WS_EX_LEFT |  WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_LAYOUTRTL
     CTEXT   "معلومات عن الإصدار", 1692, 44, 10, 130, 48, SS_NOPREFIX, WS_EX_LEFT |  WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_LAYOUTRTL
}

ありがとう。

4

1 に答える 1

0

まあ、私はそれについて満足していませんが、先に進むために少しいじる必要がありました. これが私が持っているものです。英語とアラビア語でテストしました。うまくいけば、それは他の誰かを助けるでしょう。乾杯。

HINSTANCE hInst = AfxGetResourceHandle ();
if( hInst )
{
    // Locate the dialog box resource
    HRSRC hRes = FindResource( hInst, MAKEINTRESOURCE( IDD_ABOUTBOX ), RT_DIALOG );
    if ( hRes )
    {
        // Load the dialog box
        HGLOBAL hResLoad = LoadResource( hInst, hRes );
        if ( hResLoad )
        {
            // Get a real pointer to the resource
            LPVOID lpResLock = LockResource( hResLoad );
            if ( lpResLock )
            {
                // Do some raw bit manipulations
                BYTE* pRaw = (BYTE*)lpResLock;
                WORD signature = *(WORD*)( pRaw + sizeof( WORD ) );
                bool isDialogEx = ( signature == 0xFFFF );
                if( isDialogEx )
                {
                    size_t offset = sizeof( WORD ) + sizeof( WORD ) + sizeof( DWORD );
                    DWORD exStyle = *(DWORD*)( pRaw + offset );
                    if( exStyle & WS_EX_RTLREADING || exStyle & WS_EX_LAYOUTRTL )
                    {
                        cs.dwExStyle |= WS_EX_RTLREADING | WS_EX_LAYOUTRTL;
                    }
                }
            }
        }
    }
}
于 2013-05-10T05:40:19.890 に答える