基于对话框的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();
}

 

 

 

 

 

 

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 九某草 X站cms 渗透篇「建议收藏」

    九某草 X站cms 渗透篇「建议收藏」这一套源码与网上那些X站cms都是一致,那么在奇安信社区上看到了这款,那么也来玩玩,这一套源码的话基本的都是存在后台提权、存储xss、反射XSS、弱口令(至于弱口令这块一般安装后直接使用admin、admin或者某cms名称直接进行登录,那么我们登录进行也是直接忽略过爆破这一段)1、爆破篇…

    2022年10月19日
  • 【AssemblyInfo.cs】为程序设置版本和帮助信息

    【AssemblyInfo.cs】为程序设置版本和帮助信息软件编写完成之后,都会在软件中添加一些版权信息,怎样设置这些版权信息呐?C#工程中的AssemblyInfo.cs文件又有什么作用?

  • S3C2440移植uboot之支持NAND启动「建议收藏」

    S3C2440移植uboot之支持NAND启动「建议收藏」上一节S3C2440移植uboot之新建单板_时钟_SDRAM_串口移植uboot初始化了时钟,配置了支持串口,这一节我们继续修改uboot支持NAND启动。

  • Android 修改host文件的3种方法

    Android 修改host文件的3种方法Android修改hosts文件的方法介绍本文介绍三种Android手机修改hosts文件的方法,但修改hosts文件一定要谨慎:Android手机hosts文件的换行符必须是n而不是windows的rn,使用Notepad++打开hosts文件,依次点击菜单中的“视图–显示符号–显示所有字符”,如果行末是LF就没问题,CRLF结束则需要…

    2022年10月10日
  • JavaScript之继承

    JavaScript之继承

    2020年11月19日
  • rfid-rc522模块中文资料_驱动模块

    rfid-rc522模块中文资料_驱动模块文章目录一.S50(M1)卡介绍1.S50(M1)卡基础知识2.内部信息3.存取控制4.数据块的存取控制5.控制块的存取控6.工作原理7.M1与读卡器的通信一.S50(M1)卡介绍1.S50(M1)卡基础知识1.每张卡有唯一的序列号,32位2.卡的容量是8Kbit的EEPROM3.分为16个扇区,每个扇区分为4块,每块16个字节,以块为存取单位4.每个扇区都有独立的一组密码和访问控制…

发表回复

您的电子邮箱地址不会被公开。

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