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


相关推荐

  • excel如何打开100万行以上的csv文件

    excel如何打开100万行以上的csv文件前言正常情况下,2007版本以上的excel打开的csv文件,最多只能显示1048576行数据,如果我们恰好有一个超大csv文件行数超过这个量级,该如何解决呢,可以使用powerquery来解决。步骤1.切换到数据选项卡,依次点击新建查询->从文件->从CSV,然后选择需要导入的超大csv文件2.在出现的窗口里,点击加载->加载到3.选择仅创建连接和将此数据添加到数据模型,点击加载4.等excel加载完数据后,在窗口的右侧会出现一个工作簿查询,点击里面的文件,

    2022年7月21日
    136
  • oracle教程15 PlSql入门和基本用法举例(很齐全)

    oracle教程15 PlSql入门和基本用法举例(很齐全)无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。PLSQL的简介PLSQL的语法结构例子:SETSERVEROUTPUTONBEGIN –打印输出DBMS_OUTPUT.PUT_LINE(‘hel…

    2022年6月5日
    217
  • Python值传递还是引用传递

    Python值传递还是引用传递Python 值传递还是引用传递 Python 作为一门动态语言 变量本身的类型是不固定的 因此更加灵活 那 Python 到底是值传递还是引用传递呢 问题引出本人在本周写代码时 遇到这么一个让我吃惊的问题 问题可以抽象如下 deffunc val1 val2 val1val2 append 1 a 一系列对 a 的操作 b afunc a

    2025年6月11日
    2
  • Nhibernate学习之性能改善1

    Nhibernate学习之性能改善1Nhibernate学习之性能改善1

    2022年4月21日
    46
  • SQL Server中quotename()函数的用法

    SQL Server中quotename()函数的用法原文链接:https://blog.csdn.net/zengcong2013/article/details/43485837首先,sqlserver里的标识符有一定的规则,比如你createtableabc123(…)那么中间含有空格,它不是符合规则的。你会写做createtable[abc123](….)即以[]来定界标识符。quotename…

    2022年7月25日
    5
  • 电磁场与电磁波实验 02 – | 电磁波波长测试实验

    电磁场与电磁波实验 02 – | 电磁波波长测试实验一 实验目的 1 学习了解电磁场电磁波的空间传播特性 2 通过对电磁场电磁波波长 波幅 波节 驻波的测量进一步认识和了解电磁场电磁波 3 了解电磁波的反射特性 利用迈克尔逊干涉现象和相干波原理测量波长二 预习要求 1 什么是迈克尔逊干涉原理 它在实验中有哪些应用 2 驻波的产生原理及其特性 三 实验仪器 HD CB V 电磁场电磁波数字智能实训平台极化天线 1 副金属反射板

    2025年9月30日
    3

发表回复

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

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