我已经在这个问题上看到了几个类似的问题,但是我似乎可以解决它。
例如,在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
,这是我的主要应用程序窗口,程序启动时将其设置为阿拉伯语:
问题(与其他用户一样)是,尽管页面已正确设置为RTL布局,但工作表却不是。
使工作表本身显示RTL的正确方法是什么?
我尝试使用PreCreateWindow
,但没有区别。我也尝试使用SetProcessDefaultLayout
。不高兴。
答案 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
的结果更改布局。因此,请记住不要意外更改拉丁版本的样式...