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