从加载的dll资源中读取MFC查询读取顺序(RTL)?

从加载的dll资源中读取MFC查询读取顺序(RTL)?,mfc,right-to-left,resource-dll,Mfc,Right To Left,Resource Dll,我们有一个旧的MFC应用程序,我们将其本地化为多种语言。我们有一个语言菜单,允许用户选择语言(需要重新启动应用程序)。当选择阿拉伯语等RTL语言时,主窗口框架和通过调用(如AfxMessageBox)在代码中创建的对话框将保留在LTR中;即使在运行阿拉伯语windows的系统上运行。我想在我们根据加载的资源类型创建的所有窗口上设置WS_EX_layouttl位。有没有办法使用从AfxGetResourceHandle检索到的句柄来查询资源是否为RTL?如果没有,还有其他方法吗 编辑: 我的问题是

我们有一个旧的MFC应用程序,我们将其本地化为多种语言。我们有一个语言菜单,允许用户选择语言(需要重新启动应用程序)。当选择阿拉伯语等RTL语言时,主窗口框架和通过调用(如AfxMessageBox)在代码中创建的对话框将保留在LTR中;即使在运行阿拉伯语windows的系统上运行。我想在我们根据加载的资源类型创建的所有窗口上设置WS_EX_layouttl位。有没有办法使用从AfxGetResourceHandle检索到的句柄来查询资源是否为RTL?如果没有,还有其他方法吗

编辑:

我的问题是,即使加载的资源dll是RTL,我的主窗口框架和所有动态对话框仍然保持在LTR布局中。我在app 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;
}
如果不是这种方法,那么是否有任何函数可用于根据区域设置信息(如三个字母的国家代码或语言ID)确定阅读顺序?在windows7版本上,我可以执行以下操作,但我们需要支持windows xp:(

编辑2:

仍在努力实现这一点。我有以下代码,我认为应该可以工作,但它没有。我知道我正在获取句柄的对话框的LayoutTl设置为true,它有三个项。当以下代码执行时,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
}

谢谢。

嗯,我对此不满意,但我不得不通过一些无聊的事情继续前进。以下是我的有效方法。我用英语和阿拉伯语进行了测试。希望它能帮助其他人。干杯

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;
                    }
                }
            }
        }
    }
}

对于AfxMessageBox,您需要MB_RTLREADING。查询资源是否为RTL是什么意思?您好,FKDev,当应用程序启动时,如果选择了英语以外的语言,它将加载一个已本地化的资源dll。我们正在添加支持的三种语言是阿拉伯语(巴林语),Dari和Pashto。这些都是RTL语言。我正在寻找一种方法来发现加载的资源dll是否包含已本地化为RTL语言的resourced。我走这条路线是因为如果我可以调用AfxGetResourceHandle并使用返回的句柄来查看其中的资源是否已本地化为RTL语言,这会更容易。Th对话框资源应该在RTL DLL中有WS_EX_LayoutTL。是的,资源DLL中的控件在RTL模式下正确显示。但是,我的问题是代码生成的对话框默认为LTR。因此,我想查看加载的资源,确定它们是否为RTL,并在为m代码。如果我只是盲目地将所有内容设置为RTL,那么LTR客户将感到恼火。我需要一种方法来查看PreCreateWindow函数中资源dll的内容,并在适当的时候将WS_EX_RTLREADING | WS_EX_LayoutTL添加到CREATESTRUCT。同样,当我创建消息框时,等等。
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;
                    }
                }
            }
        }
    }
}