2015-11-06 56 views
1

我們開發了一個Windows API應用程序,其中有一個帶有嵌套子菜單的上下文菜單。我們以多種語言本地化應用程序,包括希伯來語。
由於鍵盤支持對我們來說是必須的,我們需要知道子菜單是否應該在右箭頭(LTR)或左箭頭(RTL)鍵按下時打開。
我們的開發者確實使用TrackPopupMenu()功能描述了here on MSDN,但是他需要知道來設置TPM_LAYOUTRTL標誌。
所以問題是:如何定義當前的系統區域設置是LTR還是RTL來正確處理菜單?定義當前系統區域設置是否爲RTL或LTR

+0

http://blogs.msdn.com/b/oldnewthing/archive/2011/12/22/10250164.aspx – chris

+0

沒錯,謝謝您!幾分鐘前我們發現了同樣的解決方案:) –

回答

3

我在回答,因爲我們找到了解決方案(並且評論證實我們的方法正確)。
爲了定義當前系統區域設置是否爲RTL或LTR,我們應該使用GetLocaleInfoExLOCALE_IREADINGLAYOUT。 MSDN對此有以下說明:

Windows 7及更高版本:文本的閱讀版式。下表中定義了可能的值。

可能的值實際上是:

  • 0 - 左到右(如英語);
  • 1 - 從右到左(如希伯來語或阿拉伯語);
  • 2 - 可以從上到下垂直讀取,列從右到左或水平行從左到右讀取(如在日語中);
  • 3 - 從上到下垂直讀取,列從左到右(如蒙古語)。
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; 
}