win10部分字体不能安装-(Win10无法安装字体)

win10部分字体不能安装

(Win10无法安装字体)

#程序员##IT教育##软件开发##软件工程师##cpp#

锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。


背景显示文本是软件常用功能,而显示文本依赖字体,字体的安装卸载有时候很麻烦,内嵌字体资源比较保险。翻译本文,供大家参考学习。

介绍每隔一段时间,我们开发的应用程序就需要用户系统中可能存在也可能不存在的字体。一个常见的解决方案是将字体文件与应用程序设置的其余部分捆绑在一起,并将它们与其他所有内容一起安装。诸如 MSI、NSIS 或 Inno 之类的软件包使这很容易。一个缺点是您的字体在系统范围内永久可见,例如,用户可以随时删除/卸载您的应用程序所依赖的字体。为了防止这种情况,您可以实现代码,在每次运行应用程序时检查字体的状态,如果需要,继续自行终止、警告用户或即时安装字体。

当然,如果您正在动态安装字体,您可以更进一步,将字体的生命周期限制为应用程序的执行。该方法将具有额外的优势,即在一定程度上保护字体的“隐私”,因为它仅在您的应用程序启动时可见。本文介绍了一个简单的类,它封装了这样的功能,即允许应用程序从编译的资源中动态安装/卸载字体,只需几行代码。

使用代码代码的直接使用将遵循以下步骤:

在项目中包含AP_FontInstaller.h和AP_FontInstaller.cpp。将相关字体文件作为资源添加到项目中。将CAP_FontInstaller类标题插入到主对话框的标题中:#include " AP_FontInstaller.h"创建类的对象CAP_FontInstaller:CAP_FontInstaller m_capFontInstaller;在 中OnInitDialog(),将字体资源添加到安装程序并安装字体:m_capFontInstaller .AddFont( _T("Camelot MF"),IDR_FONT_CAMELOT,_T("FONTS") ) .AddFont( _T("Cigno MF"),IDR_FONT_CIGNO,_T("FONTS") ); m_capFontInstaller.InstallAllFonts();确保在应用程序终止之前卸载字体,例如,在OnClose()方法中:m_capFontInstaller.UninstallAllFonts();只有系统中不存在的字体才会被CAP_FontInstaller类安装和卸载。因此,如果您忘记卸载字体,下次运行应用程序时,它会将这些字体标记为已存在,您将无法卸载它们。当然,您也可以修改代码的行为以适应其他用途,这可能不是问题。

兴趣点该类的代码CAP_FontInstaller旨在实现一个相当简单的公式,即保留一个可以安装和卸载的字体列表。要尊重的规则是,如果系统中已经存在任何这些字体,它们将不会被干预。

因此,首要任务是找出已经安装了哪些字体。这是通过调用 API 来完成的,而 APIEnumFontFamiliesEx又依赖于回调函数的实现。代码如下所示:

BOOL CAP_FontInstaller::IsFontAlreadyInSystem( const CString& csFontName ){ HDC hDC = GetDC( NULL ); LOGFONT lf = { 0,ANSI_CHARSET,NULL }; FONT_DETAILS fdFont; fdFont.m_csFontName = csFontName; fdFont.m_bInstalled = FALSE; EnumFontFamiliesEx( hDC,&lf,(FONTENUMPROC)_EnumFontFamExProc,(LPARAM)(LPVOID)&fdFont,0 ); return fdFont.m_bInstalled;}int CALLBACK CAP_FontInstaller::_EnumFontFamExProc( ENUMLOGFONTEX * lpelfe,NEWTEXTMETRICEX * /*lpntme*/,int /*nFontType*/,LPARAM lParam ){ PFONT_DETAILS pfd = (PFONT_DETAILS)lParam; if( pfd->m_csFontName == lpelfe->elfLogFont.lfFaceName ) { pfd->m_bInstalled = TRUE; return FALSE; // Finished } else return TRUE; // Continue}

回调函数_EnumFontFamExProc由系统调用,一次只针对一种字体。请注意,face-name 不必(而且通常不是)与字体文件名相同。如有疑问,请使用字体查看器。

注:这个不相同,意义很大。

如前所述,安装程序会保留要安装/卸载的字体列表。此列表是一个结构数组,其声明如下所示:

typedef struct{ CString m_csFontName; CString m_csInstalledFontFullPath; UINT m_uResID; CString m_csResType; BOOL m_bInstalled; BOOL m_bAlreadyInTheSystem;} FONT_DETAILS,*PFONT_DETAILS;

对于传递给公共方法的每种字体,都会填充一个结构并将其添加到数组中AddFont。

安装涉及从应用程序的编译资源中提取字体并在相应的系统文件夹中创建字体文件(视操作系统版本而异)。代码如下所示:

BOOL CAP_FontInstaller::WriteFontFile( const CString& csInstalledFontFullPath,UINT uResID,const CString& csResType ){ BOOL bSuccess = FALSE; HINSTANCE hInst = AfxGetResourceHandle(); HRSRC hResource = FindResource( hInst,MAKEINTRESOURCE( uResID ),csResType ); if( hResource ) { HGLOBAL hGlobal = LoadResource( hInst,hResource ); if( hGlobal ) { TCHAR* szTemp = (TCHAR*)LockResource( hGlobal ); UINT uSize = (UINT)SizeofResource( hInst,hResource ); DeleteObject( (HGDIOBJ)hGlobal ); CFile cf; if( cf.Open( csInstalledFontFullPath,CFile::modeWrite | CFile::modeCreate ) ) { cf.Write( szTemp,uSize ); cf.Close(); bSuccess = TRUE; } } } return bSuccess;}BOOL CAP_FontInstaller::InstallFont( const CString& csFontName ){ BOOL bSuccess = FALSE; PFONT_DETAILS pfd = NULL; if( FindFontDescription( csFontName,pfd ) && pfd->m_bInstalled == FALSE && pfd->m_bAlreadyInTheSystem == FALSE && WriteFontFile( pfd->m_csInstalledFontFullPath,pfd->m_uResID,pfd->m_csResType ) ) { bSuccess = ( AddFontResource( pfd->m_csInstalledFontFullPath ) != 0 ); pfd->m_bInstalled = bSuccess; } return bSuccess;}

如您所见,提取资源和编写字体文件很简单。如果成功,安装字体需要调用 API AddFontResource。

卸载更简单:首先调用 API RemoveFontResource,然后删除字体文件本身。

BOOL CAP_FontInstaller::UninstallFont( const CString& csFontName ){ BOOL bSuccess = FALSE; PFONT_DETAILS pfd = NULL; if( FindFontDescription( csFontName,pfd ) && pfd->m_bInstalled == TRUE && pfd->m_bAlreadyInTheSystem == FALSE && RemoveFontResource( pfd->m_csInstalledFontFullPath ) ) { _unlink( pfd->m_csInstalledFontFullPath ); pfd->m_bInstalled = FALSE; bSuccess = TRUE; } return bSuccess;}

请记住,如果字体文件被系统锁定,调用_unlink将失败。

笔记Windows 在修改字体方面特别挑剔。因此,让我提醒您,代码按“原样”提供,没有任何明示或暗示的保证。继续需要您自担风险。

用于演示项目的字体(Camelot MF 和 Cigno MF)是 Rick W. Mueller 的财产。

演示应用程序/项目不是很复杂。如果任一字体已安装在您的系统中,则演示将无法安装/卸载字体,因此将无法正常工作。


路由

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

相关推荐


若您在 win10 系统中遇到打开网页时显示的"flash 必要组件未运行"提示,这个问题可以说是比较常见的了,但是还是有许多的小伙伴们碰到了不知道该怎么办。win10家庭版flash组件未正常运行
当我们把计算机设备融入同一个料宅系統里时,资源共享及文件传输等各项事务将会变得愈加便利。然而近期发现许多朋友对于如何顺利地参与此前已经存在的工作组,仍然感到困惑不解。其实这一处理过程并不困难,相当容易
有些用户发现自己的电脑时间不正确,但是不知道win11怎么修改系统时间,其实我们只需要进入设置的时间和区域选项就可以更改系统时间了。win11怎么修改系统时间:
网卡驱动程序在电脑中的作用就是负责管理和控制网络连接的,这个驱动功能十分重要。
升级win10后重装系统怎么恢复 升级windows10后恢复成以前的版本主要有两种方法:一种是返回,一种是重装;两种方法的效果相同但略有区别,返回就是返回原来你用的那个系统,所有软件和应用都不会变,这种方法针对的是
你是否曾经因为Win10默认的录屏保存位置而感到困扰?每次录屏完毕后,都要费劲地去找保存在哪个文件夹里,简直就像在找针在大海中的针一样。别担心,今天我就来告诉你如何轻松地更改Win10的录屏保存位置,让你的录屏
Win10系统无法正常关机怎么办?出现这一问题可能是软件占用电脑的资源并导致无法正常关机,又或者是电脑的硬件问题,比如电源故障、主板故障等,以及系统问题,下面小编带来了解决方法,我们一起来看看吧。
共享硬盘是一种可以让多台计算机共享数据的硬件。因为工作需要,我们一般会创建局域网共享,可以有Win10用户遇到了共享硬盘访问不了的情况,那么应该如何解决呢?我们一起来看看小编带来的Win10无法访问共享硬盘的解
最近许多小伙伴都升级了Windows10最新的更新补丁KB5006670,但是这会引起打印机无法连接共享打印机甚至出错的问题。但是卸载更新又显示无法卸载,那么遇到这种情况我们要怎么解决呢?下面小编就带着大家一起看看吧!
Win10更改账户类型改不了?近期有用户想要修改电脑上的账户类型,但是却发现修改不了,那么应该如何解决呢?出现这样的情况只能通过打开“administrator”管理员账户将原来的账户修改为“标准”,或者新建一个普通账
我们在使用笔记本电脑的时候,一般情况下都是连接wifi来操作的,最近有小伙伴发现自己的win7电脑无线网络列表显示不出来,不知道是怎么回事?那么遇到这种情况我们应该怎么解决?今天小编给大家带来win7无线网络列表显示不出来的解决方法。
win10粘滞键取消了但不管用怎么办?我们在使用电脑的时候经常会不小心按到shift键,特别是转换输入法的时候,但是每次用户们按下shift键就会出现一个对话框,这就让用户们十分的苦恼。接下来就让本站来为用户们来仔细的介绍一下win10粘滞键取消了但不管用问题解
在日常工作中经常会用到打印机来打印,同一个办公室内为了提高工作效率一般会设置共享打印机。但是有win10用户反映电脑提示共享打印机拒绝访问,这该怎么办?下面小编就来教教大家具体的解决办法。
现在大部分的电脑都是安装win10系统,有些用户在电脑中下载了经典游戏红色警戒,但是在玩的过程中出现了严重的卡顿,画面操作等都十分的不流畅,面对这个问题很多玩家都不清楚要如何解决,那么本期的win10教程小编就来和大伙分享几种有用的处理方法,接下来让
win10系统还原点可以删除吗?方法很简单的,用户们可以直接的点击属性下的高级系统设置,然后直接的配置还原设置、管理磁盘空间,并且删除还原点选项来进行操作就可以了。接下来就让本站来为用户们来仔细的介绍一下win10系统还原点怎么删除方法吧。
很多的用户们在操作win10系统的时候发现按下w键就会弹出手写笔,这就让很多的用户们都十分的苦恼,其实关闭的方法很简单的,不清楚的用户们可以根据本站来看看win10一按w键就弹出手写笔怎么关闭的详细攻略吧。
win10远程桌面连接修改密码怎么改?用户们可以直接的点击任务栏下的设置,然后选择账户,之后点击登录选项来进行操作就可以了。那么接下来就让本站来为用户们来仔细的介绍一下win10远程桌面连接怎么修改密码教程吧。
win10右键菜单栏怎么设置?我们在使用电脑的过程中经常会用到鼠标右键的菜单栏,但是也有不少的用户们表示一些功能是用不上的,其中鼠标右键是可以设置的,那么接下来就让本站来为用户们来仔细的介绍一下win10右键菜单栏设置方法吧。
win10鼠标滚轮变成放大缩小怎么办?鼠标是我们日常使用电脑必须要用的一个设备,但是不少的用户们由于错误的设置将鼠标滚轮变成放大缩小了,那么这要怎么办?其实用户们可以通过修改电脑设置来进行操作就可以了。接下来就让本站来为用户们来仔细的介绍一下wi
发现桌面图标变成黑色方块,这是什么回事?一些用户查看网上的处理方法,并没有完全明白怎么操作。今天小编就给大家准备了简单的解决办法,按照以下方法操作基本就能解决了。