基于对话框的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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 特征工程

    特征工程

    2021年5月19日
    97
  • sprintf函数的用法linux,sprintf函数用法解析

    sprintf函数的用法linux,sprintf函数用法解析shortsi=-1;sprintf(s,”%04X”,si);产生“FFFFFFFF”,怎么回事?因为spritnf是个变参函数,除了前面两个参数之外,后面的参数都不是类型安全的,函数更没有办法仅仅通过一个“%X”就能得知当初函数调用前参数压栈时被压进来的到底是个4字节的整数还是个2字节的短整数,所以采取了统一4字节的处理方式,导致参数压栈时做了符号扩展,扩展成了32位的整数…

    2022年6月16日
    43
  • 【cocos2d-x制作别踩白块儿】第九期:游戏计时功能(附源代码)

    【cocos2d-x制作别踩白块儿】第九期:游戏计时功能(附源代码)

    2021年11月15日
    41
  • endnote x9中文版安装教程(vivox9安装未知应用权限在哪)

    endnote x9中文版安装教程(vivox9安装未知应用权限在哪)一、下载在百度中搜索“Endnotex9”,点第一个链接进入下载页面。软件大小为108MB,下载的是一个压缩包,如下图所示,双击解压之后是右侧的图标,解压到文件夹,双击即可安装。二、安装直接安装即可,可以更换安装路径备注:安装成功后使用汉化版,可以将CHS文件夹里的[EndNote.exe]拷贝到EndNote的安装目录下。使用英文版,可以将ENG文件夹里的[EndNote.exe]拷贝到EndNote的安装目录下。不论用的是英文版还是中文版,替换之后即可使用…

    2022年4月18日
    195
  • wireshark抓包使用教程

    wireshark抓包使用教程Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括:1、Wireshark软件下载和安装以及Wireshark主界面介绍。2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析数据包内容。3、Wireshark过滤器使用。通过过滤器可以筛选出想要分析的内容。包括按照协议过滤、端口和主机名过滤、数据包内容过滤。Wireshark软件安装软件下载路径:w…

    2022年9月6日
    4
  • java环境教程_java环境配置的详细教程(图文)

    java环境教程_java环境配置的详细教程(图文)本篇文章给大家带来的内容是关于java环境配置的详细教程(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。JAVA环境变量的配置:Path,JAVA_HOME,CLASSPATH一、右键我的电脑,属性,高级系统设置,点击环境变量二、然后就会弹出环境变量这个窗口,在系统变量编辑JAVA_HOME,如果没有就新建一个,把jkd的路径添加进去,如图三、配置CASSPATH,如果没有…

    2022年7月7日
    28

发表回复

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

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