Установка CMFCPropertySheet как RTL - PullRequest
0 голосов
/ 09 декабря 2018

Я видел несколько похожих вопросов на эту тему, но я могу решить их.

Например, на CodeProject:

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

И на SO:

Ошибка макета RTL для листов свойств (MFC)

Итак, у меня есть CMFCPropertySheet, которое является моим основным окном приложения, и оно установлено на арабский, когдаЗапускается программа:

Arabic window

Проблема, как и в случае других пользователей, заключается в том, что в то время как страницы правильно настроены на макет RTL, лист - это не так.

Как правильно отобразить RTL для самого листа?

Я пытался использовать PreCreateWindow, и это не имело значения.Я пытался использовать SetProcessDefaultLayout тоже.Радости нет.

1 Ответ

0 голосов
/ 09 декабря 2018

В идеале стиль окна должен быть изменен в OnNcCreate до того, как окно начнет создавать и позиционировать свои дочерние элементы управления.Таким образом, дочерняя вкладка, а также дочерние кнопки будут расположены соответствующим образом (кнопка OK / Отмена / Применить будет также выровнена по левой стороне).

Пример:

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.Таким образом, вы помните, чтобы не случайно изменить стиль для латинской версии ...

...