动态设置对话框的WS_EX_LAYOUTRTL属性无效

凌乱哥 2019-08-22 11:10:06
主要是想实现程序在英语和阿拉伯语之间动态切换实现UI的实时布局。

用了ModifyStyleEx和SetWindowLong两种办法来动态设置属性,结果都是只有标题栏变了,对话框内部控件还是没反应,如图:



于是我又扩充了一些代码还是不行:

SetProcessDefaultLayout(LAYOUT_RTL);
//ModifyStyleEx(0, WS_EX_LAYOUTRTL | WS_EX_RTLREADING | WS_EX_RIGHT);
SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) |
(WS_EX_LAYOUTRTL | WS_EX_RTLREADING | WS_EX_RIGHT));
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
UpdateWindow();

除了遍历对话框控件外,还能有什么办法可以实现对话框内部控件也跟着自动排版呢
...全文
409 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
凌乱哥 2019-08-24
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
遍历下也不麻烦
引用 2 楼 worldy 的回复:
每种语言创建一个窗口函数,切换直接掉 SetWindowLong切换窗口函数
引用 3 楼 hhhh63 的回复:
做两个对话框,我后切换。
引用 4 楼 schlafenhamster 的回复:
WS_EX_RIGHT The window has generic right-aligned properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
引用 5 楼 Eleven 的回复:
针对每种语言,做个对话框的资源~
感谢各位,我自己摸索到了一个好办法。根据MSDN的描述: WS_EX_LAYOUTRTL 0x00400000L If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the horizontal origin of the window is on the right edge. Increasing horizontal values advance to the left. 也就是说初始情况下x坐标是从窗口左边缘往右递增的,当设置了WS_EX_LAYOUTRTL之后,x坐标就变成了从窗口右边缘往左递增了。所以,在设置了WS_EX_LAYOUTRTL之后再设置一遍控件的位置就行了。 简单来说就是把控件位置和文本的设置都写在一个函数内,窗口初始化的时候调用此函数,切换语言的时候再调用一次就OK了
Eleven 2019-08-23
  • 打赏
  • 举报
回复
针对每种语言,做个对话框的资源~
zgl7903 2019-08-22
  • 打赏
  • 举报
回复
遍历下也不麻烦

BOOL ChangeContrlFun(HWND hParent, BOOL bRightRead, BOOL bRightText)
{
  BOOL bRet = FALSE;

  //扩展风格
  DWORD dwExStyleClrMask = (WS_EX_LTRREADING|WS_EX_RTLREADING|WS_EX_LEFT|WS_EX_RIGHT);
  DWORD dwExSytleSetMask = 0;
  if(bRightRead)
    dwExSytleSetMask |= WS_EX_RTLREADING;
  else
    dwExSytleSetMask |= WS_EX_LTRREADING;
  if(bRightText)
    dwExSytleSetMask |= WS_EX_RIGHT;
  else
    dwExSytleSetMask |= WS_EX_LEFT;

  if(IsWindow(hParent))
  {
    DWORD dwExStyle;
    
    //遍历子窗口
    HWND hChild = GetWindow(hParent, GW_CHILD);
    while(hChild != NULL)
    {
      //修改扩展风格
      dwExStyle = (GetWindowLong(hChild, GWL_EXSTYLE) & (~dwExStyleClrMask)) | dwExSytleSetMask;
      SetWindowLong(hChild, GWL_EXSTYLE, dwExStyle);
      
      //按类修改属性
      TCHAR szClass[64] = {0};
      if(GetClassName(hChild, szClass, 64))
      {
        DWORD dwStyle = GetWindowLong(hChild, GWL_STYLE);

        DWORD dwClrMask = 0;
        DWORD dwSetMask = 0;

        //Static
        if(_tcsicmp(szClass, _T("Static")) == 0)
        {
          dwClrMask = SS_RIGHT | SS_CENTER | SS_LEFT;
          if(bRightText)
            dwSetMask = SS_RIGHT;
          else
            dwSetMask = SS_LEFT;
        }

        //Edit
        if(_tcsicmp(szClass, _T("Edit")) == 0)
        {      
          dwClrMask = (ES_RIGHT | ES_CENTER | ES_LEFT);
          if(bRightText)
            dwSetMask |= ES_RIGHT;
        }

        //button
        if(_tcsicmp(szClass, _T("Button")) == 0)
        {
          dwClrMask = (BS_LEFT | BS_RIGHT);
          if(bRightText)
            dwSetMask |= BS_RIGHT;
          else
            dwSetMask |= BS_LEFT;
        }

        /*
        //
        if(_tcsicmp(szClass, _T("xxxx")) == 0)
        {
          dwClrMask = ;
          if(bRightText)
            dwSetMask = ;
          else
            dwSetMask = ;
        }
        */

        SetWindowLong(hChild, GWL_STYLE, (dwStyle & (~dwClrMask)) | dwSetMask);
      }

      //获取下一个控件
      hChild = GetWindow(hChild, GW_HWNDNEXT);
    }

    //修改主窗口扩展风格
    dwExStyle = (GetWindowLong(hParent, GWL_EXSTYLE) & (~dwExStyleClrMask))
      | dwExSytleSetMask;
    SetWindowLong(hParent, GWL_EXSTYLE, dwExStyle);
    
    //刷新窗口
    InvalidateRect(hParent, NULL, TRUE);
    
    bRet = TRUE;
  }

  return bRet;
}

void CDlg1Dlg::OnButton1() 
{
  static BOOL m_bRight = FALSE;
  m_bRight = ! m_bRight;
  ChangeContrlFun(m_hWnd, m_bRight, m_bRight);
}

schlafenhamster 2019-08-22
  • 打赏
  • 举报
回复
WS_EX_RIGHT
The window has generic right-aligned properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
hhhh63 2019-08-22
  • 打赏
  • 举报
回复
做两个对话框,我后切换。
worldy 2019-08-22
  • 打赏
  • 举报
回复
每种语言创建一个窗口函数,切换直接掉
SetWindowLong切换窗口函数

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧