1

我在这个主题上看到了几个类似的问题,但我似乎可以解决它。

例如,在 CodeProject 上:

https://www.codeproject.com/Messages/2873837/Re-How-to-set-RTL-layout-for-a-CPropertySheet.aspx

在这样的情况下:

属性表 (MFC) 的 RTL 布局问题

所以,我有一个CMFCPropertySheet主应用程序窗口,它在程序启动时设置为阿拉伯语:

阿拉伯语窗口

与其他用户一样,问题在于,虽然页面被正确设置为 RTL 布局,但工作却没有。

让工作表本身显示 RTL 的正确方法是什么?

我尝试使用PreCreateWindow,它没有任何区别。我也试过用SetProcessDefaultLayout。没有喜悦。

4

1 回答 1

1

理想情况下,应在OnNcCreate窗口开始创建和定位其子控件之前更改窗口样式。这样,子选项卡以及子按钮将相应定位(确定/取消/应用按钮也将与左侧对齐)。

例子:

BEGIN_MESSAGE_MAP(...)
    ON_WM_NCCREATE()
    ...
END_MESSAGE_MAP()

BOOL CMyPropertySheet::OnNcCreate(LPCREATESTRUCT pc)
{
    BOOL res = CMFCPropertySheet::OnNcCreate(pc);

    SetWindowLongPtr(m_hWnd, GWL_EXSTYLE,
            WS_EX_LAYOUTRTL | GetWindowLongPtr(m_hWnd, GWL_EXSTYLE));

    return res;
}

或者,在 中执行此操作OnInitDialog,用于::FindWindowEx(m_hWnd, 0, WC_TABCONTROL, 0)查找选项卡控件的句柄并更改其样式。这样按钮就不会重新定位。例子:

BOOL CMyPropertySheet::OnInitDialog()
{
    BOOL res = CMFCPropertySheet::OnInitDialog();

    SetWindowLongPtr(m_hWnd, GWL_EXSTYLE,
        WS_EX_LAYOUTRTL | GetWindowLongPtr(m_hWnd, GWL_EXSTYLE));

    HWND htabctrl = ::FindWindowEx(m_hWnd, 0, WC_TABCONTROL, 0);
    SetWindowLongPtr(htabctrl, GWL_EXSTYLE,
        WS_EX_LAYOUTRTL | GetWindowLongPtr(htabctrl, GWL_EXSTYLE));

    return res;
}

边注:

您也可以SetProcessDefaultLayout(LAYOUT_RTL)在流程开始时调用(例如在 中CMyWinApp::InitInstance)。然后根据结果更改布局GetProcessDefaultLayout。所以你记得不要不小心改变了拉丁版本的风格......

于 2018-12-09T20:25:49.173 回答