如何使用打印机设备字体

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 201978
概要
驻留在打印机的字体有时会非常有用且难于在应用程序代码中使用。本文介绍如何确定哪种字体驻留在打印机的设备可供使用 Win32 打印机设备上下文中。此外介绍了当您尝试使用应用程序代码中的那些打印机字体时可能发生的几个问题。
更多信息
在大多数情况下,软件开发依赖于操作系统提供的字体,将使用为其绘图。若要执行此操作,您可以选择通过应用程序编程接口 (API) 或通用的选择字体对话框操作系统提供的字体。但是,应用程序通常不关注用特定字体的使用,只有它满足某些要求和用户首选字体。这些要求包括 ︰
  • 字体必须是一定大小。
  • 字体必须包含字符 (也称为标志符号)。
  • 字体必须具有某些样式。
通常情况下,当应用程序打印文档时,字体 (或类似的字体) 用于打印机,没有提供从应用程序的任何特定操作。此值通常为该应用程序,正确的结果,这将产生良好的打印的效果,以合理的速度。

然而,有时应用程序开发人员可能需要专门从目标打印机中选择仅某些字体。从历史上看,这是必要的影响类型的打印机 (例如,点阵打印机) 以获得特定格式或以提高打印速度。

今天,大多数打印机光栅设备作为主要设计并可以绘制一个圆点 (像素) 纸张的任何部分只是有效地为所有字符标志符号。对于大多数应用程序,它不是问题是否字符标志符号来自驻留在打印机的定义为整个窗体或绘制为操作系统提供的像素的集合。但是,您可能仍要使用的打印机提供的字体。例如,这可能是因为该字体是唯一的因为要避免下载到打印机的字体定义的开销已在操作系统中或可能没有类似替代。

对于这篇文章的目的,"设备字体"是其定义打印机的内存中存在能够在临时或永久的任何字体。这些设备可以向墨迹形状放在纸张的打印机的页光栅化程序硬件寻址每字符的字符标志符号定义。

设备字体可分为三种基本类型 ︰
  • 为设备字体。对于这篇文章的目的,它们只有打印机硬件提供的字体,可以只在打印机上使用。
  • 设备字体替换。在操作系统中的存在和打印机硬件还提供的字体。在这种情况下,打印机硬件可以替换操作系统的字体。
  • 可下载字体。可以下载到打印机和打印机上使用,就像打印机硬件直接提供字体操作系统提供,但其定义的字体。

可下载字体

操作系统提供可下载的字体,也被称为软字体。当您打印文档时,字体的定义可作为打印作业的一部分。当打印机处理打印作业时,以便可以拖到文档的打印页墨迹字体定义打印机内存中安装的字体定义。

一些人认为因为打印机在绘制字符标志符号的字体,这些字体为设备字体。但是,当下载字体定义或到打印机通过位图绘制字形,被保存某些开销或打印作业假脱机的大小。此过程透明地对应用程序以便在屏幕和打印机上,则可以使用操作系统中的字体。本文重点介绍如何使用设备字体的打印机提供的因为这篇文章找到有关使用可下载字体。

设备字体替换

有两个,当设备字体替换不同的字体定义 ︰ 操作系统使用,其中一个,另一个打印机使用。也就是说,应用程序选择,并在屏幕上使用操作系统在一个文档中的字体。当打印文档时,打印的输出使用的打印机提供的同样定义字体绘制。因此,操作系统中的字体被代替,打印机上的打印机定义的字体。

这通常发生在 PostScript 打印机上使用时常见的 Windows TrueType 字体。一种是通常由 PostScript 字体定义用于大多数 PostScript 设备 helvetica 打印 TrueType Arial 字体。这是一个替换的示例通过使用相似的字体,字体名称是实际不同。在这种情况下,您通常可以查找并直接使用此相似字体定义,因为类似的字体定义还公开为 true 的设备字体。这将在本文稍后部分进行讨论。

在打印机上的字体与操作系统提供的字体具有相同的名称时,也会发生设备字体替换。这通常发生在如惠普 LaserJet 打印机的打印机上。这些打印机通常具有他们自己版本的 Windows 核心字体 arial 字体和 Times New Roman 等。虽然寻找真正的设备字体,通常还可以找到这些字体,它们的使用有时无法保证因为打印机驱动程序经常在他们自己选择或用户设置通过选择是否使用操作系统而提供的字体。

设备字体

真正的设备字体是那些只有在打印机上定义的字体。应用程序可以使用这些字体的唯一方法是为应用程序专用于标识字体并创建打印机设备上下文中使用。

如果您知道有关设备的足够信息,您可以在LOGFONT结构中的设备字体的实现可能会导致创建逻辑字体说明。特别是,务必要提供正确的信息, lfFacename成员的lfHeight成员,以及该字体的字符集。另外, lfOutPrecision成员应包含 OUT_DEVICE_PRECIS 标志来影响选择而不是相似的系统字体的设备字体的字体映射过程。

如果不知道该字体的说明,您可以枚举发现设备字体的字体。若要获取打印机支持的设备字体的列表,请使用如EnumFontFamiliesEx这类字体枚举函数之一。放置在回调函数中的应用程序代码可以检查传递给回调函数,以确定哪些字体实例介绍用设备字体数据。

使用 True 设备字体

使用设备字体的打印机设备上下文中的过程执行以下常规步骤 ︰
  1. 标识由枚举的打印机的设备上下文中的字体为设备字体。
  2. 选择设备仅指示由FontType标志和排除法的字体。
  3. 在 MM_TEXT 映射模式下使用特定于打印机的规格准确地放置使用设备字体绘制的文本。

枚举字体的打印机的设备上下文

枚举所有的设备上下文中可用的字体,您可以使用回调函数和EnumFontFamiliesEx函数从 Win32 应用程序编程接口 (API)。若要枚举的所有字体的设备上下文,您必须调用EnumFontFamiliesEx两次 ︰ 第一次以获取字体系列和第二次来获取所有不同的字体中每个字体系列的列表。有关完整枚举系统字体的详细信息,请参阅本文的"参考"部分。

若要查找所有设备的字体在打印机的设备上下文,必须枚举的所有字体的打印机的设备上下文。当每个字体传递到回调函数时,字体将检查,以确定它是否用设备字体。下面的代码示例中的PrinterDeviceFontEnumPrinterDeviceFontFamiliesEnum回调函数执行此操作。
// Data structure to pass data through the font enumeration callbacks.typedef struct PrintEnumFontData{    HDC             hPrinterDC;    HDC             hEnumDC;    int             curx, cury;    ENUMLOGFONTEX   elf;} PRINTENUMFONTDATA;int CALLBACK PrinterDeviceFontEnum(  ENUMLOGFONTEX *lpelfe,    // logical-font data  NEWTEXTMETRICEX *lpntme,  // physical-font data  DWORD FontType,           // type of font  LPARAM lParam             // application-defined data){    // Crack the data out of the enumeration parameter.    PRINTENUMFONTDATA *     ppeft = (PRINTENUMFONTDATA*) lParam;    // Printing information    TEXTMETRIC              tm;    HFONT                   hfont, holdfont;    int                     pagecx, pagecy;    // Data to determine where this font came from    ENUMEDFONT      df = { FontType, lpelfe };  // To look for a system version    // What is the printable area of the page?    pagecx = GetDeviceCaps(ppeft->hPrinterDC, HORZRES);    pagecy = GetDeviceCaps(ppeft->hPrinterDC, VERTRES);    // Is it a device font?    // If it is, make sure that it is also not a TrueType font because    // that is most likely a downloaded font.    // Also, look for any system-provided fonts that are also     // masquerading as printer device fonts. This implies that they will be     // downloaded to the printer as is the case with Adobe Type 1 fonts.    // If they are downloaded, you do not want to include them in this demonstration.    if (FontType & DEVICE_FONTTYPE &&         !(FontType & TRUETYPE_FONTTYPE) &&        !IsSystemFont(&df))    {        TCHAR           Buffer[MAX_PATH];           // description of font        LPTSTR          szFontType;                 // description of type        LPTSTR          pStyle = "Regular";         // Fonts Style defaults to Regular         // At this point in this code, the lpelfe parameter has been examined        // and found to describe a printer device font.        // Do something interesting with it as follows:                // Build a sample string that describes the font.        if (lpelfe->elfLogFont.lfItalic)        {            pStyle = "Italic";            if (lpelfe->elfLogFont.lfWeight > FW_NORMAL)                pStyle = "Bold Italic";        }        else if (lpelfe->elfLogFont.lfWeight > FW_NORMAL)            pStyle = "Bold";        // Determine if the font is scalable or a bitmap font.        if (FontType & RASTER_FONTTYPE)            szFontType = TEXT("Bitmap Font");        else        {            // This is an instance of a scalable font,             // use 12 pt because it is easy to read.            szFontType = TEXT("Scalable Font");            lpelfe->elfLogFont.lfHeight = MulDiv(12, GetDeviceCaps(ppeft->hPrinterDC, LOGPIXELSY), 72);            lpelfe->elfLogFont.lfWidth = 0;        }        // Skip all fonts after this font that are the same scale as the last one.        // However, let different sizes of 'bitmap' fonts through.        // This is a cheat that relies on enumeration order.        // Really, you should keep a 'used' list and compare against the list.        if (FontType & RASTER_FONTTYPE || !CompareLogFontEx(&ppeft->elf, lpelfe))        {            hfont = CreateFontIndirect(&lpelfe->elfLogFont);            holdfont = (HFONT)SelectObject(ppeft->hPrinterDC, hfont);            GetTextMetrics(ppeft->hPrinterDC, &tm);                        // If beyond bottom of page, get a new page.            if (pagecy < ppeft->cury + tm.tmExternalLeading + tm.tmHeight)            {                EndPage(ppeft->hPrinterDC);                StartPage(ppeft->hPrinterDC);                ppeft->cury = 0;            }            // Draw our sample text.            wsprintf(Buffer, "%s %s [%s]  FontType: %s", lpelfe->elfFullName, pStyle, lpelfe->elfScript, szFontType);            ppeft->cury += tm.tmExternalLeading;            TextOut(ppeft->hPrinterDC, ppeft->curx, ppeft->cury, Buffer, lstrlen(Buffer));            ppeft->cury += tm.tmHeight;            // Clean up.            SelectObject(ppeft->hPrinterDC, holdfont);            DeleteObject(hfont);            // Make a note of the font that you used so that the next time            // this callback is called, you can skip different scales of             // the same font.            CopyMemory(&ppeft->elf, lpelfe, sizeof(ENUMLOGFONTEX));        }    }    // Otherwise, continue enumeration without doing anything with this    // particular font.    return 1;}int CALLBACK PrinterDeviceFontFamiliesEnum(  ENUMLOGFONTEX *lpelfe,    // logical-font data  NEWTEXTMETRICEX *lpntme,  // physical-font data  DWORD FontType,           // type of font  LPARAM lParam             // application-defined data){    PRINTENUMFONTDATA * ppeft = (PRINTENUMFONTDATA*) lParam;    ZeroMemory(&ppeft->elf, sizeof(ppeft->elf));    // Is it a device font?    // If it is, make sure that it is also not a TrueType font because    // that is most likely a downloaded font.    if (FontType & DEVICE_FONTTYPE && !(FontType & (TRUETYPE_FONTTYPE)))    {            // Enumerate all of the font instances that are part of this         // font family.        return EnumFontFamiliesEx(ppeft->hEnumDC,             &lpelfe->elfLogFont,             (FONTENUMPROC)PrinterDeviceFontEnum,             lParam,             0);    }    // Otherwise, if you are not interested in this particular font,     // continue enumeration so that you can find more.    return 1;}BOOL CALLBACK AbortProc(HDC hdc, int iError)/*    This minimal AbortProc implementation stops the print    job when an error occurs. */ {    if (iError)        return FALSE;    return TRUE;}BOOL PrintDeviceFontList(HDC hPrinterDC){    int ret;    LOGFONT             lf;     // Describes the start of the font enumeration    PRINTENUMFONTDATA peft =     {         hPrinterDC,             // Device Context on which to print        hPrinterDC,             // Device Context to enumerate         0, 0,                   // Current print location        NULL                    // Last device font that is used to print    };    DOCINFO di;                 // Description of the print job    // Start the print job.    ZeroMemory(&di, sizeof(di));    di.cbSize = sizeof(di);    di.lpszDocName = TEXT("Printer Font List");    // Set a minimal AbortProc because there should always be one.    ret = SetAbortProc(hPrinterDC, (ABORTPROC) AbortProc);    if (ret < 1) return false;    ret = StartDoc(hPrinterDC, &di);    if (ret < 1) return false;    ret = StartPage(hPrinterDC);    if (ret < 1)    {        AbortDoc(hPrinterDC);        return false;    }    // Enumerate everything to start, weed out non-device fonts,     // and then print non-device fonts during enumeration.    ZeroMemory(&lf, sizeof(lf));    lf.lfCharSet = DEFAULT_CHARSET;    // Call the enumeration with your callback function that prints    // the device fonts that it finds.    ret = EnumFontFamiliesEx(hPrinterDC,         &lf,         (FONTENUMPROC)PrinterDeviceFontFamiliesEnum,         (LPARAM)&peft,         0);    // The value 1 is returned by the callback functions to continue    // the enumeration. When the enumeration completes, EnumFontFamiliesEx    // returns the last value that the callback returns.    // Therefore, you succeed if you get 1. Let it print.    if (ret == 1)    {        EndPage(hPrinterDC);        EndDoc(hPrinterDC);        return true;    }    // Otherwise, exit because you failed somewhere in the process.    AbortDoc(hPrinterDC);    return false;}				
您可以看到在示例代码中将调用EnumFontFamiliesEx函数的两倍。第一次调用PrintDeviceFontList函数中进行。在PrinterDeviceFontFamiliesEnum回调函数是第二次调用。

PrintDeviceFontList是顶级的函数。PrintDeviceFontList通过启动打印作业的打印机的设备上下文,然后调用EnumFontFamiliesEx首次调用来启动字体枚举进程执行两个任务。根据平台软件开发工具包 (SDK) 文档中,当您将LOGFONT结构的lfCharSet成员设置为DEFAULT_CHARSET的值, EnumFontFamiliesEx枚举的所有字体系列。字体枚举已完成后,代码将通过调用EndDoc方法完成的打印作业管理任务。

PrinterDeviceFontFamiliesEnum回调函数由EnumFontFamiliesEx函数调用的每个字体系列。在该回调函数,代码最初屏幕查找由FontType参数标记的设备字体的字体系列。它还过滤出任何因为这些字体很可能是可下载字体标记为 TrueType 字体。对于那些被认为是设备字体的字体系列, EnumFontFamiliesEx函数再次调用,但传递回调函数接收到的ENUMLOGFONTEX结构。使用 callback 参数作为第二个枚举函数调用的输入参数将导致要列出所有的不同的字体,该字体系列中的第二个枚举。

选择设备字体

可以使用某些标准的打印机设备字体来区分这些枚举的任何其他字体的字体。具体来说,查找FontType回调函数的 dword 值参数中的DEVICE_FONTTYPE值。几乎所有被传递给回调函数中设置此值的字体都设备字体的打印机的设备上下文 (使用 Adobe 的字体除外)。

在示例代码中, PrinterDeviceFontEnum回调函数调用的每个不同字体的字体系列中的第二个枚举。PrinterDeviceFontEnum回调函数执行三项任务 ︰
  • 再次使用设备字体条件,以确保该函数只能处理识别为设备字体的字体。
  • 搜索使用另一种字体枚举系统的屏幕设备上下文中是否也使用设备字体的字体。
  • 打印到打印作业创建以展示字体字体的示例。
此回调函数使用一个名为IsSystemFont,这是下面的代码示例部分函数 ︰
BOOL CompareLogFontEx(  CONST ENUMLOGFONTEX * Destination,   // copy destination  CONST ENUMLOGFONTEX * Source  // memory block)/*    Returns true if the two ENUMLOGFONTEX buffers compare.    Return false if the two buffers differ in someway as described by the     criteria below. */ {    // Compare the string descriptions:    if (lstrcmpi((LPCTSTR )Destination->elfFullName, (LPCTSTR )Source->elfFullName) != 0)        return false;    if (lstrcmpi((LPCTSTR )Destination->elfScript, (LPCTSTR )Source->elfScript) != 0)        return false;    if (lstrcmpi((LPCTSTR )Destination->elfStyle, (LPCTSTR )Source->elfStyle) != 0)        return false;    // Height and Width are not compared because they will change    // based upon the device on which the font is enumerated.    //  LONG lfHeight;     //  LONG lfWidth;     // Compare the LOGFONT properties:    //  LONG lfEscapement;     if (Destination->elfLogFont.lfEscapement != Source->elfLogFont.lfEscapement) return false;    //  LONG lfOrientation;     if (Destination->elfLogFont.lfOrientation != Source->elfLogFont.lfOrientation) return false;    //  LONG lfWeight;     if (Destination->elfLogFont.lfWeight != Source->elfLogFont.lfWeight) return false;    //  BYTE lfItalic;     if (Destination->elfLogFont.lfItalic != Source->elfLogFont.lfItalic) return false;    //  BYTE lfUnderline;     if (Destination->elfLogFont.lfUnderline != Source->elfLogFont.lfUnderline) return false;    //  BYTE lfStrikeOut;     if (Destination->elfLogFont.lfStrikeOut != Source->elfLogFont.lfStrikeOut) return false;    //  BYTE lfCharSet;     if (Destination->elfLogFont.lfCharSet != Source->elfLogFont.lfCharSet) return false;    //  BYTE lfOutPrecision;     if (Destination->elfLogFont.lfOutPrecision != Source->elfLogFont.lfOutPrecision) return false;    //  BYTE lfClipPrecision;     if (Destination->elfLogFont.lfClipPrecision != Source->elfLogFont.lfClipPrecision) return false;    //  BYTE lfQuality;     if (Destination->elfLogFont.lfQuality != Source->elfLogFont.lfQuality) return false;    //  BYTE lfPitchAndFamily;     if (Destination->elfLogFont.lfPitchAndFamily != Source->elfLogFont.lfPitchAndFamily) return false;    //  TCHAR lfFaceName[LF_FACESIZE];     if (lstrcmpi((LPCTSTR )Destination->elfLogFont.lfFaceName, (LPCTSTR )Source->elfLogFont.lfFaceName) != 0) return false;    // Conclusion: the two LOGFONT enumeration buffers are comparable.    return true;}typedef struct structEnumedFont{    DWORD FontType;    ENUMLOGFONTEX * elfx;} ENUMEDFONT;int CALLBACK FindSystemFontEnum(  ENUMLOGFONTEX *lpelfe,    // logical-font data  NEWTEXTMETRICEX *lpntme,  // physical-font data  DWORD FontType,           // type of font  LPARAM lParam             // application-defined data){    ENUMEDFONT  *   pdf  = (ENUMEDFONT *)lParam;    ENUMLOGFONTEX * lpelfeSrc = pdf->elfx;    lpelfe->elfLogFont.lfHeight = lpelfeSrc->elfLogFont.lfHeight;    lpelfe->elfLogFont.lfWidth = lpelfeSrc->elfLogFont.lfWidth;    if (CompareLogFontEx(lpelfeSrc, lpelfe) && FontType == pdf->FontType)        return 0;       // System font found. Stop enumeration.    return 1;}BOOL IsSystemFont(ENUMEDFONT *pdf)/*    Utility function that takes a font that is enumerated from a printer device    that is in the pdf parameter and that looks for it on a Screen Device    Context to conclude that the font passed in that came from the     printer is really supplied by the system. */ {    HDC hScreenDC = GetDC(NULL);    // Get the screen device context.    // If the enumeration stops by returning zero (0),    // the font was found on the screen device context so it is a     // system-supplied font.    BOOL fFound = !EnumFontFamiliesEx(hScreenDC,         &pdf->elfx->elfLogFont,         (FONTENUMPROC)FindSystemFontEnum,         (LPARAM)pdf,         0);    // Cleanup    ReleaseDC(NULL, hScreenDC);    return fFound;}				
此函数检测时的字体为设备字体标记,但不是真正的设备字体 (按照本文中的定义)。Adobe 字体安装到系统中通过任一 Adobe 类型管理器或通过 Microsoft Windows 2000 或 Windows XP 中存在本机 Adobe 光栅时,将发生这种情况。

在这种情况下,字体实际上是系统提供的字体下载到打印机,这有时会使用 TrueType 字体。遗憾的是,没有任何标志,您可以使用 Windows 98、 Windows 操作系统版本 (Me)、 Windows 2000 和 Windows XP 中,指示字体为 Adobe 字体 (而不像 TrueType 字体,其中包括一个标志) 系统提供跨。在NEWTEXTMETRIC结构的ntmFlags成员,指示,但在 Windows 2000 及更高版本,此窗口才可用。因此,代码必须求助于排除法。IsSystemFont确定设备字体由屏幕设备上下文和打印机设备上下文时,将删除字体。

为了避免重复可缩放字体的示例,代码还说明时已使用候选字体。此特定的实现依赖于枚举顺序来查看字体的顺序枚举时相同的字体的字体,但以不同的比例。若要删除字体的不同刻度,该代码使用CompareLogFontEx函数。

注意︰ 编程的 Windows 操作系统的文档未写明,只是规模不同字体实例将被按顺序枚举。因为枚举发现使用这种方法,并示例打印页上的行数的减少不是一项重要功能的演示代码,该代码示例使用此方法。如果您想要依赖消除不同比例的相同的字体,必须保持一种数据结构所使用的设备字体。然后程序必须检查该数据结构与当前枚举字体。

可扩展性与位图字体

有两种类型的设备字体可枚举的打印机 ︰
  • 位图或光栅字体
  • 可缩放的字体
位图字体是具有固定大小的字符标志符号定义。可缩放的字体是有打印机中的基于数学的定义,以便它们可以绘制任意大小的字体。换句话说,它们的大小缩放。

位图字体的典型示例是快递 10 cpi。顾名思义,这种字体是保留通过从打字机到影响类型打印机的过渡。因为最常用的字体定义所在的点阵打印机 ROM 的位图图像,则称为位图字体。

可扩展的打印机驻留字体的示例可在多数 PostScript 打印机通常没有一套标准 PostScript 字体黑体和时间等。

设备字体不可伸缩的稍有回调函数的FontType参数中设置的。由RASTER_FONTTYPE在 SDK 中的符号表示该位。如果回调函数的FontType参数没有设置了RASTER_FONTTYPE位,字体是可缩放字体。有关如何确定这一点的示例,请参见PrinterDeviceFontEnum回调函数的示例代码。

图形设备字体

为设备字体的字体被发现后,该示例将使用它们在其执行枚举的打印机设备上下文中。设备字体使用得多像其他字体使用CreateFontIndirect函数创建逻辑的说明。此函数调用被传递到字体枚举回调函数传递了LOGFONTHFONT创建后,它是选择到设备上下文中与SelectObject函数调用使用打印机设备上下文中。

设备字体的指标是通过GetTextMetrics函数调用获得的。最好使用 MM_TEXT 映射模式,它是一个设备上下文的默认映射模式对打印机设备上下文操作。当您使用 MM_TEXT 映射模式时,您可以避免数学其他映射模式的单位转换过程中可能发生的错误。

使用设备字体的打印机设备上下文中时,您必须注意不要传输的字体和为其他设备上下文字符串的度量值。这是特别的内存设备上下文,则返回 true。根据定义,内存设备上下文不是打印作业但临时内存缓冲区的光栅图形,因此无法使用设备字体。

还有另一个重要考虑因素时使用打印机设备字体 ︰ 不能提供所得类型预览打印作业。显然,字体驻留在打印机的硬件中无法绘制到屏幕上。最近你能参加到预览打印作业是打印机的查找设备字体的系统提供具有的一般特征的字体,然后在屏幕上绘制该字体的标志符号,使用ExtTextOut函数来模拟打印页上的字符标志符号的位置。

使用设备字体的问题

使用设备字体时,您可能会遇到以下问题 ︰
  • 设备字体,但打印机驱动程序不枚举。

    有两个原因为什么您可能无法通过枚举可用的打印机上使用的字体的设备上下文查找设备字体 ︰
    • 打印机驱动程序编写旨在排除由于某种原因该设备字体。
    • 打印机驱动程序枚举字体,但是字体为设备字体FontType参数中未正确标记。
  • 有似乎列举为设备字体的系统字体。

    系统提供的字体下载到打印机,则会发生此问题。

    在这种情况使用 TrueType 字体,字体枚举回调函数接收与TRUETYPE_FONTTYPEFontType参数设置的DEVICE_FONTTYPE位调用。这被处理在示例代码中不包括任何字体包含这些位的组合。

    这也是使用 Adobe PostScript 字体安装在系统中下载到打印机。一种方法来区分这些从其他设备字体的字体是系统屏幕设备上下文和打印机设备上下文中查找它们。如果在这两个设备上下文,可以枚举相同的字体,该字体将有可能下载到打印机,打印机设备上下文中使用时。
  • 我的打印机驱动程序枚举几种可扩展设备字体,但它们看起来相同,但它们的大小。

    许多打印机驱动程序枚举提供不同大小的几个不同实例的相同的字体是可缩放字体。通过比较这些假定为使用CompareLogFontEx函数可缩放的字体的各种实例,这是在代码示例中处理。

    注意︰ 当指向回调函数的FontType参数设置了RASTER_FONTTYPE位时,多次枚举提供每个大小非可缩放的字体的特定实例的说明。每次回调枚举该字体可只大小。
  • 某些打印机不起来有设备字体。

    也是如此。某些打印机而言,即油墨喷墨型打印机,不提供设备字体。这些打印机严格是光栅设备,因此没有打印机驻留字体定义。
参考
有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
99672 信息 ︰ 完成枚举系统字体
75469 为准确地显示在屏幕上内容的打印方式
230342 如何确定字体创建成功
字样的 DC

警告:本文已自动翻译

属性

文章 ID:201978 - 上次审阅时间:06/12/2016 10:23:00 - 修订版本: 5.0

  • kbdswgdi2003swept kbgdi kbhowto kbmt KB201978 KbMtzh
反馈