定义当前系统语言环境是 RTL 还是 LTR
Defining whether the current system locale is RTL or LTR
我们开发了一个 Windows API 应用程序,其中有一个带有嵌套子菜单的上下文菜单。我们将应用程序本地化为多种语言,包括希伯来语。
由于键盘支持对我们来说是必须的,我们需要知道子菜单是否应该在右箭头 (LTR) 或左箭头 (RTL) 按键时打开。
我们的开发人员确实使用 here on MSDN 描述的 TrackPopupMenu()
函数,但他需要知道 何时 设置 TPM_LAYOUTRTL
标志。
所以问题是:如何定义当前系统语言环境是 LTR 还是 RTL 以正确处理菜单?
我正在回答,因为我们已经找到了解决方案(并且评论确认我们的方法是正确的)。
为了定义当前系统语言环境是RTL还是LTR,我们应该使用GetLocaleInfoEx
with LOCALE_IREADINGLAYOUT
。 MSDN 对此有如下说明:
Windows 7 and later: The reading layout for text. Possible values are defined in the following table.
实际可能的值是:
0
— 从左到右(如英语);
1
— 从右到左(如希伯来语或阿拉伯语);
2
— 要么从上到下垂直阅读,列从右到左阅读,要么水平行从左到右阅读(如日语);
3
— 从上到下垂直阅读,列从左到右(如蒙古语)。
我们使用以下内部代码:
bool IsCurrentInputLanguageRTL ( void )
{
bool ret=false;
auto layout = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
auto lcid=MAKELCID(LOWORD(layout),SORT_DEFAULT);
LOCALESIGNATURE localesig;
// Windows XP and higher.
// Unicode subset bit fields: https://msdn.microsoft.com/en-us/library/windows/desktop/dd374090(v=vs.85).aspx
// Bit 123: Windows 2000 and later - Layout progress, horizontal from right to left.
if(GetLocaleInfoW(lcid,LOCALE_FONTSIGNATURE,(LPWSTR)&localesig,sizeof(localesig)/sizeof(WCHAR)) != 0)
ret = (localesig.lsUsb[3] & 0x08000000)!=0;
return ret;
}
我们开发了一个 Windows API 应用程序,其中有一个带有嵌套子菜单的上下文菜单。我们将应用程序本地化为多种语言,包括希伯来语。
由于键盘支持对我们来说是必须的,我们需要知道子菜单是否应该在右箭头 (LTR) 或左箭头 (RTL) 按键时打开。
我们的开发人员确实使用 here on MSDN 描述的 TrackPopupMenu()
函数,但他需要知道 何时 设置 TPM_LAYOUTRTL
标志。
所以问题是:如何定义当前系统语言环境是 LTR 还是 RTL 以正确处理菜单?
我正在回答,因为我们已经找到了解决方案(并且评论确认我们的方法是正确的)。
为了定义当前系统语言环境是RTL还是LTR,我们应该使用GetLocaleInfoEx
with LOCALE_IREADINGLAYOUT
。 MSDN 对此有如下说明:
Windows 7 and later: The reading layout for text. Possible values are defined in the following table.
实际可能的值是:
0
— 从左到右(如英语);1
— 从右到左(如希伯来语或阿拉伯语);2
— 要么从上到下垂直阅读,列从右到左阅读,要么水平行从左到右阅读(如日语);3
— 从上到下垂直阅读,列从左到右(如蒙古语)。
我们使用以下内部代码:
bool IsCurrentInputLanguageRTL ( void )
{
bool ret=false;
auto layout = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
auto lcid=MAKELCID(LOWORD(layout),SORT_DEFAULT);
LOCALESIGNATURE localesig;
// Windows XP and higher.
// Unicode subset bit fields: https://msdn.microsoft.com/en-us/library/windows/desktop/dd374090(v=vs.85).aspx
// Bit 123: Windows 2000 and later - Layout progress, horizontal from right to left.
if(GetLocaleInfoW(lcid,LOCALE_FONTSIGNATURE,(LPWSTR)&localesig,sizeof(localesig)/sizeof(WCHAR)) != 0)
ret = (localesig.lsUsb[3] & 0x08000000)!=0;
return ret;
}