基于对话框的MFC程序实现RTL风格的一种方式[通俗易懂]

基于对话框的MFC程序实现RTL风格的一种方式[通俗易懂]操作系统使用阿拉伯语时,微软操作系统为了适应阿拉伯语地区和希伯来语地区自右向左的阅读习惯,提供了独特的RTL的界面风格。怎么才能实现应用程序和操作系统保持一致的RTL风格呢?搜索了一些关于RTL界面实现的资料,网上大多数是通过遍历程序窗口,依次调用ModifyStyleEx系统API来实现的。基于对话框的MFC程序的窗口样式是通过资源文件预先定义的。基于对话框的…

大家好,又见面了,我是你们的朋友全栈君。

       操作系统使用阿拉伯语时,微软操作系统为了适应阿拉伯语地区和希伯来语地区自右向左的阅读习惯,提供了独特的RTL的界面风格。

基于对话框的MFC程序实现RTL风格的一种方式[通俗易懂]

       怎么才能实现应用程序和操作系统保持一致的RTL风格呢?搜索了一些关于RTL界面实现的资料,网上大多数是通过遍历程序窗口,依次调用ModifyStyleEx系统API来实现的。基于对话框的MFC程序的窗口样式是通过资源文件预先定义的。基于对话框的MFC程序创建窗口时,程序通过加载资源中对应的窗口资源(就是编程中常见的IDD_DIALOG_XXX)来实现窗口显示样式。这里注意一下,我这里说的创建方式仅仅包括通过CDialog::Domodal()或者CDialog::Create()等可以指定窗口资源ID的方法(Domodal方式使用头文件中语言设置好的资源ID)。

       既然定义了窗口样式的资源信息已经预先加载到了系统内存中,那么这样就给我们提供了一个机会,在窗口创建之前修改MFC资源中关于窗口显示样式的定义部分。

       首先创建一个函数,查找窗口资源并修改窗口样式:

 

BOOL XXXApp::SetDialogRTLStyle(int nDialogID)
{
	HGLOBAL hResLoad; 
	HRSRC	hRes;
	LPVOID	lpResLock;

	hRes = FindResource(NULL, MAKEINTRESOURCE(nDialogID), RT_DIALOG);
	if (hRes == NULL)
	{
	        return FALSE;
	}

       hResLoad = LoadResource(NULL, hRes);
	if (hResLoad == NULL)
	{
		return FALSE;
	}
	
	lpResLock = LockResource(hResLoad);
	if (lpResLock == NULL)
	{
		return FALSE;
	}

       //在内存中直接修改对话框样式
	typedef struct {
		WORD      dlgVer;
		WORD      signature;
		DWORD     helpID;
		DWORD     exStyle;
	} DLGTEMPLATEEX;
	DLGTEMPLATEEX* pDlgTemplate = (DLGTEMPLATEEX*)lpResLock;
	pDlgTemplate->exStyle |= (WS_EX_LAYOUTRTL | WS_EX_RTLREADING);

	return TRUE;
}

 

 

 

      创建一个类成员函数,统一设置进程的RTL界面风格:

void XXXApp::SetRTLUI(void)
{
	SetProcessDefaultLayout(LAYOUT_RTL);
	//界面部分
	SetDialogRTLStyle(IDD_DIALOG_XXX1);
        SetDialogRTLStyle(IDD_DIALOG_XXX2);
        SetDialogRTLStyle(IDD_DIALOG_XXX3);
}

 

     

      在开始创建窗口之前调用SetRTLUI函数,统一设置资源文件中的样式:

 

BOOL CIPSApp::InitInstance()
{
     ......
     SetRTLUI();
     .....

     xxxDlg dlg;
     dlg.Domodal();
}

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161725.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 回文串「建议收藏」

    回文串「建议收藏」1.1.最长回文串LeetCode:给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。注意:假设字符串的长度不会超过1010。回文串:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。——百度百科地址:https://baike.baid…

    2025年8月20日
    3
  • linux如何配置maven环境变量,ubuntu配置maven环境变量「建议收藏」

    linux如何配置maven环境变量,ubuntu配置maven环境变量「建议收藏」下载maven使用wget命令下载maven二进制文件。wgethttps://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz下载完成后将文件解压缩到/opt/maven目录中:安装maven创建文件夹sudomkdir/opt/maven解压文件sudotar-zxv…

    2022年6月18日
    23
  • iPhone 开发分辨率 持续更新

    iPhone4s:320*480iPhone5s/SE:320*568iPhone6/6s/7/8:375*667iPhone6/6s/7/8Plus414*736iPhoneX375*812以上是开发分辨率,不是物理分辨率。

    2022年4月8日
    112
  • Java核心技术卷一学习笔记1

    Java核心技术卷一学习笔记1在搞本科生毕设之余,闲下来看看书,写写博客。由于研究生学习要做一个数据可视化的项目,需要用到Java。所以拿了一本《Java核心技术卷一》正在一步步复习之前所学的Java知识。   3.9大数值   如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。

    2025年8月7日
    2
  • Excel宏的录制和解密

    Excel宏的录制和解密本篇演示的Excel版本:Excel2019本篇演示一个简单的宏的录制。实现的效果是将Sheet1的A列复制到到Sheet2的A列。宏的录制和保存步骤打开Excel点击上方菜单的“视图”,点击“宏”,在下拉菜单中选择录制宏。在弹出对话框中,给宏取个名字后点击“确定”在Sheet1中选择A列,复制后粘贴到sheet2的A列,在到“宏”菜单中点击“停止录制”在点击保存的时候会弹出一个提示框,注意:如果要保存宏,要点击“否

    2022年6月28日
    50
  • 苹果ipa软件包破解笔记

    苹果ipa软件包破解笔记

    2021年11月16日
    1.1K

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号