我们开发了一个Windows API应用程序,其中有一个带嵌套子菜单的上下文菜单。我们使用多种语言本地化应用程序,包括希伯来语
由于键盘支持对我们来说是必须的,我们需要知道子菜单是应该在右箭头(LTR)还是左箭头(RTL)按键时打开。
我们的开发人员确实使用了here on MSDN所述的TrackPopupMenu()
函数,但他需要知道何时才能设置TPM_LAYOUTRTL
标志。
所以问题是:如何定义当前系统区域设置是LTR还是RTL来正确处理菜单?
答案 0 :(得分:4)
我正在回答,因为我们找到了解决方案(并且评论证实我们的方法是正确的)
为了定义当前系统区域设置是RTL还是LTR,我们应该将GetLocaleInfoEx
与LOCALE_IREADINGLAYOUT
一起使用。 MSDN如下所述:
Windows 7及更高版本:文本的阅读布局。可能的值在下表中定义。
可能的值实际上是:
0
- 从左到右(如英文); 1
- 从右到左(如希伯来语或阿拉伯语); 2
- 从上到下垂直读取,列从右到左,或从左到右读取水平行(如日语); 3
- 从上到下垂直阅读,列从左到右(如蒙古语)。答案 1 :(得分:0)
我们使用以下内部代码:
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;
}