电网智能调度IDAMMI界面单元设计.doc
《电网智能调度IDAMMI界面单元设计.doc》由会员分享,可在线阅读,更多相关《电网智能调度IDAMMI界面单元设计.doc(17页珍藏版)》请在三一办公上搜索。
1、IDAMMI界面单元设计项目名称:电网智能调度项目编号:JYF-IDA主管部门:电网自动化事业部当前版本:1.0目录一QT-OpenGL环境下中文字符的显示11字体引擎和绘制22字体编码转换33字体文件定位43.1Windows平台字体文件定位43.2Unix平台字体到字体文件的映射6二 智能调度人机界面整体设计91描述92MMI框架主要分布和功能设计103人机界面主体和场景管理:123.1术语解释:123.2MMI窗口与场景管理方案13一QT-OpenGL环境下中文字符的显示摘要OpenGL下中文显示是基于OpenGL环境应用开发必须面对的问题,本文提供了在Qt-OpenGL环境下显示中文字
2、符的综合解决方案。目标:在OpenGL环境下,实现人机会话图形文本的任意显示,能兼容Qt的字体设置和格式设置 约束显示的字符能随图形一起缩放、旋转、变形,满足人机界面字符输出的要求能跨平台,采用矢量字体,缩放操作不会产生明显的效果下降主要技术难点1 字体引擎和绘制2 字体的编码转换3字体文件的查找与定位4 字体风格的实现5 字体缓存1 字体引擎和绘制OpenGL环境下绘制字体,必须能读取字体信息,并能使用OpenGL函数绘制在指定的位置,经过考察对比,引入开源项目FTGL作为OpenGL环境下的文字绘制引擎,FTGL使用另一个开源项目FreeType作为字体引擎,读取字体文件。FTGL的版本采
3、用的是2.1,FreeType版本是2.3.5。FTGL和FreeType可以支持TTF字体的读取与绘制,但是目前的FTGL实现存在一个缺陷,即无法直接读取TTC字体文件中的第二个字体,比如在WindowsXP 环境中,字体“宋体”和“新宋体”使用的是同一个字体文件,FTGL只能读取默认的第一个字体,FreeType提供的接口,可以读取默认的字体,然后得到字体文件中的总数目,继续读取其他字体,在此可以考虑重新实现FTGL的部分字体绘制类,在指定字体文件的时候可以同时指定字体文件中的字体索引。FTGL文字绘制,默认的字符方向:原点在左下侧,轴向右为正,轴向上为正。一般的采用的是左上为原点,轴向右
4、为正,轴向下为正,因此进行文字绘制之前,可以改变坐标系,进行镜像变换:glScale(1.0f,-1.0f,1.0f);在字体绘制过程中,可能出现部分字体小字号无法读取的问题,为此可以采用一种间接的方法,在制定字体的时候,采用实际字体的一个特定倍数,使实际设置的字体位于3072之间,并返回这个倍数,在进行坐标系镜像变换时,同时变换放大倍数,使实际绘制满足制定的尺寸,此时镜像变换变为:glScale(k,-k, k);为时FTGL满足应用需求,进行如下修改:1 修改FTFace、FTFont、FTPolygonFont等类,使打开字体文件添加一个传入字体索引的功能,保证能支持TTC类型的字体文件
5、(一个字体文件中包含多个字体);2 修改FTPolygonFont的加载字体的方法,由原来的 FTLoad_NO_HINT 添加标志 No_Bitmap,保证使用多边形类型的字体忽略字体文件中内嵌的位图字体文件。在读取WindowsXP环境下 楷体_GB2312 字体时,发现无法正常显示,具体表现为字体上添加一个没有规则的曲线,导致轮廓字体和多边形字体都无法正常显示。比较该字体和其他能正常显示的字体文件(使用FontLibStudio5)发现,该字体的控制点都不在笔画轮廓曲线中,一般的字体都是在两个线上控制点之间一个线外控制点,跟踪FreeType发现,在读入字库文件,并进行贝塞尔差插值产生中
6、间笔画点过程中,以最后一个线上控制点作为终止条件,在楷体这种情况下,无法正常终止,添加了许多人意曲线。修改该部分代码,读入控制点时,同时标志或点数目作为终止条件,可以解决该问题。2 字体编码转换FTGL的字体绘制类提供两种参数类型的接口,一个是Render( const char* string ),另一个是Render( const wchar_t* string ),当进行非英文字符输出时,只能采用wchar_t类型,QT内部采用的是Unicode编码方式保存文字信息,因此,可以直接使用QString进行文字转换。可能的几种转换方式如下:从单字节字符串得到QString:QString s
7、tr = QString:fromLocal8Bit(char*);从Unicode字符串得到QString:QString u_str = QString:fromUcs2(wchar_t*);从QString得到单字节C风格字符串:const char* buf = QString.local8Bit.data();从QString 得到Unicode字符串:const wchar_t* u_buf = QString.ucs2();在Unix平台上,wcha_tr的长度是4个字节,而在Windows平台上,wchar_t是2个字节,Qt336版本QString内部使用2个字节保存Unic
8、ode编码的字符串,在进行转换时必须针对不同的操作系统进行处理,在Windows平台,直接通过QString:ucs2()可以转换成 wchar_t* 类型的指针,在Unix平台,通过字符串转换类进行转换。跨平台转换宏定义如下:#ifdef _unix #define JQSTRING2WCHAR(s) JWcharConverter(s).wcharData()#else#define JQSTRING2WCHAR(s) (wchar_t*)s.ucs2()#endif其中的JWcharConverter为数据类型转化类,其核心的实现代码如下:wchar_t* d;d = new wchar
9、_tqs.length()+1;wchar_t * p = d;const unsigned short* ucsBuf = qs.ucs2();for(uint k=0;kRender(JQSTRING2WCHAR(text);要正常使用wchar_t和unsigned short之间进行转换,VS2005 工程设置中,不能把wchar_t视为内部类型,具体设置方法为:工程 - 属性 - 配置属性 - C/C+ - 语言:将wchar_t视为内部类型:否如果不进行上述设置,在传递unsigned short 作为wchar_t时,会提示错误。3 字体文件定位FreeType加载字体,必须提供
10、字体文件路径,而Qt没有提供直接访问操作系统字体文件的方法,因此这部分工作必须应用程序实现。编写一个专门的字体文件管理类,可以根据QFont查找字体文件的物理存储路径,实际的查找过程采用跨平台方法,即同样声明的函数,通过采用平台预处理命令来进行不同的实现,比如在Windows平台上,采用#if dfined(WIN32)来实现条件编译。不同的平台实现的方法各不相同,针对特定的平台,搜集相关资料,不断完善这一函数,最终实现系统跨平台运行。负责该字体到字体文件映射的函数声明为:bool GetFileNameFromFont(const QFont& targetFont, QString& fo
11、ntFilePath,int& faceIndex, bool& need_bold, bool& need_italic,bool& exact_match);该函数的输入为QFont,输出为字体文件的路径以及是否绘制环节进行特殊的字体绘制风格处理,如是否需要斜体、是否需要粗体等等,以及所得到的字体文件是否精确匹配。该函数的实现采用跨平台方式,通过条件编译语句控制函数体的具体实现,现分别描述3.1 Windows平台字体文件定位Windows 平台上要定位字体文件需要解决三个问题:A. 系统字体文件保存路径,虽然默认的字体文件夹是 %SYSTEMDIR%Fonts,但是不能以此作为程序的依据
12、;B. 字体名称到字体文件名称的对应;C. 字体家族、风格到字体名称的对应。字体文件保存路径可以通过Windows平台的API得到,具体使用的API是:SHGetSpecialFolderLocation():得到特殊文件夹的IDSHGetPathFromIDList():根据ID得到文件夹的字符串描述这两个的函数声明位于头文件:使用参数CSIDL_FONTS调用第一个函数,得到一个ID,根据第二个函数得到字体文件的保存文件夹。上述函数调用时,需要使用TCHAR作为参数,这是Windows平台为了适应单字节字符和Unicode编码而定义的数据类型,通过UNICODE宏定义来分别处理char和w
13、char_t,相关的定义和处理函数生命位于头文件 和,TCHAR与QString转换代码为:TCHAR szPath MAX_PATH;QString path;#ifdef UNICODEpath = QString:fromUcs2(szPath);#elsepath = QString:fromLocal8Bit(szPath);#endif字体名称到字体文件名称的对应Windows平台,字体名称和字体文件的名称可以从注册表中查找,根据Windows版本不同,存储的位置不同,WindowsNT及之后的系统,注册表存储位置为:HKEY_LOCAL_MACHINESoftwareMicros
14、oftWindows NTCurrentVersionFontsWindowsNT之前的系统,注册表位置为:HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionFonts存储的形式是名称和字符串值,名称是字体的名称,字符串是字体文件的文件名称或者全路径。比如:方正舒体 (TrueType)=FZSTK.TTF要根据字体名称查找字体文件,使用Windows注册表访问函数,遍历该处的所有键名称和键值,通过名称的比较得到合适的字符串。还有两个注册表键需要进一步研究:FontDPIFontLinkFontMapperFontSubsitute
15、sHKEY _ NTCurrent VersionFontSubstitutes当程序调用对常见系统或对话框字体, FontSubsitution 映射用来查找有关计算机的系统区域设置相应字体字体家族、风格到字体名称的对应对于英文字体,每个家族中可能存在多个独立的字体文件,比如:Arial (TrueType)=ARIAL.TTFArial Bold (TrueType)=ARIALBD.TTFArial Bold Italic (TrueType)=ARIALBI.TTFArial Italic (TrueType)=ARIALI.TTF这类文件中,字体名称体现了家族、风格和字体文件类型,可
16、以根据字体家族名称和风格,按照一定的规则形成字体名称,在字体列表中查找;有些字体文件中包含多个字体,命名为TTC,比如:宋体 & 新宋体 (TrueType)=SIMSUN.TTCMS Mincho & MS PMincho (TrueType)=MSMINCHO.TTCMS Gothic & MS PGothic & MS UI Gothic (TrueType)=MSGOTHIC.TTCGulim & GulimChe & Dotum & DotumChe (TrueType)=gulim.ttcBatang & BatangChe & Gungsuh & GungsuhChe (True
17、Type)=batang.ttcSimSun & NSimSun (TrueType)=simsun.ttcMingLiU & PMingLiU (TrueType)=mingliu.ttcCambria & Cambria Math (TrueType)=CAMBRIA.TTC这类字体文件,采用“&”符号连接字体文件中的所有字体,可以通过在打开字体文件时指定字体的序号来确定加载字体。对于字体文件的搜索,可以按照下列逻辑:首先根据家族名称和风格名称形成字符串:“家族名称 Bold Italic”查找匹配的记录,如果没有,则把家族名称后面添加一个空格“家族名称 ” 然后查找所有的字体名称,如果找
18、到,判断位置是否在名称的开始位置,如果是开始位置,直接可以使用对应的字体文件名称。如果不在开始位置,重新根据家族名称,得到字符串:“& 家族名称 ” 搜索上述字符串,如果找到,截取其左边的子串,查找“&”的个数(包括被找到的这个),该字体在字体文件中的索引即所有“&”的个数。对于中文字体,往往只有一个字体文件对应一个家族,没有专门的粗体和斜体字体文件,Windows是如何实现这类字体的斜体和粗体的,目前还没有查找清楚。3.2 Unix平台字体到字体文件的映射Unix操作系统有许多平台实现,每种实现中字体文件的保存位置都不相同,在XWindows标准中,XLib提供核心字体管理的操作函数,这些函
19、数能查找匹配字体,并能生成虚拟字体,满足绘制的需求台,XWidnow核心字体管理的主要内容是字体搜索路径以及每个路径中保存有字体文件名和逻辑名(LFDP)对应关系的fonts.dir文件,对于矢量字体,还有fonts.scale文件,以及字体的别名文件fonts.alias,通过路径和这些文件,XWindows实现了对字体文件的管理。Qt字体信息中没有字体文件信息,只有在具有XFT选项的Qt内部,有对字体文件的信息的管理。但是Qt对字体的应用以及XWindows提供的对字体的操作,仅限于对光栅化之后字体显示和操作的管理,不能完全依赖之实现对OpenGL字体绘制的实现,因此具决定采用XLib函数
20、自行进行矢量字体信息的访问。3.2.1 字体保存路径和字体文件的定位首先需要确定要查找的字体存放路径,XLib函数库中的函数:XGetFontPath()可以用来访问所有的字体搜索路径,该函数需要Display*作为参数,调用方式如下:int result=0;char * fontPath = XGetFontPath(QPaintDevice:x11AppDisplay(),&result);在对字符串使用完毕后,需要调用XFreeFontPath(fontPath)来释放返回的内存区域。之后通过查找字体路径是否含有fonts.scale,以此作为是否矢量字体的标志,如果存在该文件,则读取
21、该文件,得到该目录下所有字体的XLFD到文件名的映射,如果存在fonts.alias,读取之建立简单名到XLFD的映射。提取文件名中的扩展选项,如“:”中间的内容,分离文件名本身和扩展内容,主要是获得字模序号,即在TTC、OTC类型的字体文件中,所使用字体在其中的编号,根据后台字体引擎的不同,编号的格式可能是“:n:”或者“:fn=n:”,通过正则表达式匹配查询搜索是否具有该类型的选项。在XLFD规范中,字体名称的特定字段为0表示矢量字体,包括:PIXEL_SIZE、POINT_SIZE、RESOLUTION_X、RESOLUTION_Y、AVERAGE_WIDTH,通过检查这些属性是否为0可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电网 智能 调度 IDAMMI 界面 单元 设计

链接地址:https://www.31ppt.com/p-2391182.html