将 CMFCPropertySheet 设置为 RTL

Setting a CMFCPropertySheet as RTL

我已经看到几个关于这个主题的类似问题,但我似乎可以解决它。

例如,在 CodeProject 上:

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

然后:

RTL layout issue for Property Sheets (MFC)

所以,我有一个 CMFCPropertySheet 这是我的主要应用程序 window 并且在程序启动时设置为阿拉伯语:

与其他用户一样,问题是虽然页面已正确设置为 RTL 布局,但 sheet 并非如此。

让 sheet 本身显示 RTL 的正确方法是什么?

我尝试使用 PreCreateWindow,但没有任何区别。我也尝试使用 SetProcessDefaultLayout 。不开心。

理想情况下,window 样式应该在 window 开始创建和定位其子控件之前在 OnNcCreate 中更改。这样,子选项卡以及子按钮将相应定位(OK/Cancel/Apply 按钮也将与左侧对齐)。

示例:

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 的结果更改布局。所以大家切记不要不小心把拉丁文的样式给改了...