动态设置对话框的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();

除了遍历对话框控件外,还能有什么办法可以实现对话框内部控件也跟着自动排版呢
...全文
553 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切换窗口函数
内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度”展开研究,利用Matlab代码实现优化算法的仿真与复现。研究重点在于通过改进的秃鹰搜索算法(Bald Eagle Search Algorithm, BESA)解决微电网群在运行过程中的经济调度问题,提升算法的收敛速度与全局寻优能力,以实现对分布式能源、储能系统及负荷的高效协调管理。文中详细阐述了微电网群的系统架构、数学建模过程、目标函数设计(如运行成本最小化、碳排放降低等),并结合智能优化算法进行求解,验证了改进算法相较于传统方法在调度精度和效率方面的优越性。同时,研究还探讨了算法在多场景下的适应性,为微电网群的智能化、低碳化运行提供了技术支持与实践参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能优化算法相关工作的工程技术人员。; 使用场景及目标:① 学习并掌握改进秃鹰算法在复杂优化问题中的应用方法;② 实现微电网群经济调度模型的构建与求解;③ 对比不同智能算法在电力系统优化中的性能表现;④ 为科研论文复现、课题研究或工程项目提供算法支持与代码参考。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块分析,重点关注算法改进策略与调度模型的耦合实现方式,同时可尝试在不同参数设置或场景条件下进行仿真实验,以加深对算法性能与调度效果的理解。
内容概要:本文围绕多旋翼无人机姿态估计算法的开发与性能评估展开系统性研究,重点对比了线性与非线性滤波算法在复杂飞行环境下的表现。通过构建基于扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)等先进算法的姿态估计器,融合IMU、磁力计、视觉传感器等多源数据,有效提升了姿态解算的精度与鲁棒性。研究涵盖了静态悬停、高速机动及磁干扰等多种典型飞行场景,利用MATLAB/Simulink平台完成仿真实验,并结合实测飞行数据与VICON高精度运动捕捉系统提供的真值进行定量分析。结果表明,非线性滤波器在动态工况下具有显著优势,尤其在抑制漂移和抵抗外部干扰方面优于传统线性方法。文章还提出了传感器融合、自适应建模、冗余配置等一系列降低偏差影响的技术路径,为高可靠性无人机导航系统的设计提供了理论依据与实践指导。; 适合人群:具备控制理论、信号处理及状态估计基础知识,从事无人机导航、控制算法研发或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于开发高精度无人机姿态解算模块;②为多传感器融合算法的设计、实现与验证提供参考案例;③服务于复杂环境下无人系统状态估计的教学演示与科研攻关; 阅读建议:建议结合文中所述MATLAB/Simulink仿真模型与实测数据集进行复现与调试,重点关注EKF与UKF的数学推导、实现细节及关键参数调优过程,深入理解非线性系统建模、状态估计与工程实际之间的平衡与折衷。

15,976

社区成员

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

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