将CMFCPropertySheet设置为RTL

时间:2018-12-09 20:01:31

标签: mfc right-to-left propertysheet

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

例如,在CodeProject上:

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

在SO上

RTL layout issue for Property Sheets (MFC)

因此,我有一个CMFCPropertySheet,这是我的主要应用程序窗口,程序启动时将其设置为阿拉伯语:

Arabic window

问题(与其他用户一样)是,尽管页面已正确设置为RTL布局,但工作表却不是。

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

我尝试使用PreCreateWindow,但没有区别。我也尝试使用SetProcessDefaultLayout。不高兴。

1 个答案:

答案 0 :(得分: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的结果更改布局。因此,请记住不要意外更改拉丁版本的样式...