大家好,又见面了,我是你们的朋友全栈君。
操作系统使用阿拉伯语时,微软操作系统为了适应阿拉伯语地区和希伯来语地区自右向左的阅读习惯,提供了独特的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账号...