Yazıcı cihazı yazı tiplerini kullanma
Yazıcılarda yer alan yazı tipleri bazen yararlı olabilir ve uygulama programı kodunda bu yazı tiplerini kullanmak zor olabilir. Bu makalede, Win32 yazıcı cihazı bağlamında hangi yazıcıda yerleşik cihaz yazı tiplerinin kullanıl kullanabileceğinin nasıl belirlen olduğu açıklanmıştır. Makalede ayrıca, bu yazıcı yazı tiplerini uygulama kodunda kullanmayı deneebilirsiniz.
Özgün ürün sürümü: Win32 yazıcı cihazı
Özgün KB numarası: 201978
Özet
Çoğu durumda, yazılım geliştiricisi işletim sisteminin çizimlerinde kullanılacak yazı tiplerini sağlamasını kullanır. Bunu yapmak için, uygulama programlama arabirimi (API) aracılığıyla veya ortak Yazı Tipi Seç iletişim kutusu aracılığıyla işletim sistemi tarafından sağlanan bir yazı tipini seçebilirsiniz. Öte yandan, uygulama normalde kullanılan belirli yazı tipiyle kaygılanmaz, yalnızca belirli gereksinimleri karşılar ve kullanıcı yazı tipini tercih eder. Bu gereksinimler şunlardır:
- Yazı tipinin belirli bir boyutta olması gerekir.
- Yazı tipi karakter (aksi takdirde karakter) içermelidir.
- Yazı tipinin belirli bir stili olması gerekir.
Normalde, uygulama belgeyi yazdır geldiğinde, yazıcıda uygulamanın hiçbir özel eylemi olmadan yazı tipi (veya ona benzer bir yazı tipi) kullanılır. Bu genellikle uygulama için doğru sonuç olur ve makul hızlarda iyi yazdırılmış sonuçlar üretir.
Ancak bazen bir uygulama geliştiricisi, hedef yazıcıdan özel olarak belirli bir yazı tipi seçmek zorunda olabilir. Daha önce, belirli biçimlendirmeleri elde etmek veya yazdırmayı hızlandırmak için etki türü yazıcılarda (örneğin, nokta vuruşlu yazıcılar) bu gerekliydi.
Bugün, çoğu yazıcı temel olarak raster cihazlar olarak tasarlanmıştır ve bir karakter karakteri kadar kağıdın herhangi bir parçasına bir nokta (piksel) çizebilirsiniz. Çoğu uygulama için, bir karakter karakterinin yazıcıda yerleşik bir tanımdan bütün olarak veya işletim sisteminin sağladığı bir piksel koleksiyonu olarak çizilirse sorun değildir. Bununla birlikte, yalnızca yazıcının sağladığı bir yazı tipini kullanmaya devam etmek istiyor da olabilirsiniz. Örneğin, bu durum, yazı tipinin benzersiz olması ve işletim sisteminde benzer bir yerinin olması nedeniyle veya belki de bir yazı tipi tanımının yazıcıya indirilme yükünü önlemek istediğiniz için ortaya çıkabilir.
Cihaz yazı tipleri
Bu makalenin amacı doğrultusunda, cihaz yazı tipleri tanımı kalıcı olarak veya geçici olarak yazıcının belleğinde yer alan tüm yazı tipleridir. Bu cihaz yazı tipleri, şekli kağıt üzerine mürekkeple yapmak için yazıcının sayfa katleyici donanımı tarafından karakter başına adreslenecek bir karakter karakteri tanımı sağlar.
Cihaz yazı tipleri üç temel türe ayrılmış olabilir:
Doğru cihaz yazı tipleri. Bu makalenin amacı doğrultusunda, bunlar yalnızca yazıcı donanımının sağladığı ve yalnızca yazıcıda kullanabileceğiniz yazı tipleridir.
Cihaz yazı tipi değiştirme. İşletim sisteminde var olan ve yazıcı donanımının da sağladığı yazı tipleri. Bu durumda, işletim sisteminin yazı tiplerinin yerine yazıcı donanımı konabilirsiniz.
İndirilebilir yazı tipleri. İşletim sisteminin sağladığı, ancak tanımı yazıcıya indirilebilen ve yazıcı donanımı tarafından doğrudan sağlanan yazı tipleri gibi yazıcıda kullanılan yazı tipleri.
İndirilebilir yazı tipleri
İşletim sistemi, yumuşak yazı tipleri olarak da bilinen indirilebilir yazı tipleri sağlar. Bir belgeyi yazdırılırken, yazı tipinin tanımı yazdırma işinin bir parçası olarak sağlanır. Yazıcı yazdırma işini işlesin, yazı tipi tanımı yazıcı belleğine yüklenir ve böylelikle yazı tipi tanımı belgenin basılı sayfasına mürekkeple yazılabilir.
Yazıcı yazı tipinin karakter karakterlerini çiziyor diye bazı yazı tipleri cihaz yazı tipleridir. Bununla birlikte, bir yazı tipi tanımı indirilir veya bir karakter bit eşlem aracılığıyla yazıcıya çizilirken, yalnızca bazı ek yük veya yazdırma işi biriktirici boyutu kaydedilir. Bu işlem uygulamaya saydam olarak gerçekleşir ve böylelikle işletim sistemi yazı tipi ekranda ve yazıcıda kullanılabilir. Bu makalede yalnızca yazıcının sağladığı cihaz yazı tiplerinin nasıl kullanımı açık olduğundan, bu makalede indirilebilir yazı tiplerinin nasıl olduğu açık değildir.
Cihaz yazı tipi değiştirme
Cihaz yazı tipi değişikliği, biri işletim sisteminin kullandığı ve biri de yazıcının kullandığı iki farklı yazı tipi tanımı olduğunda gerçekleşir. Başka bir ifadeyle, bir uygulama, ekranda bir belge üzerinde işletim sisteminde yazı tipini seçer ve kullanır. Belgeyi yazdırsanız, yazdırılan çıktı yazıcının sağladığı benzer şekilde tanımlanmış yazı tipi kullanılarak çizilir. Bu nedenle, işletim sisteminde yazı tipi yazıcıda yazıcı tanımlı yazı tipiyle yerini alan yazı tipine sahiptir.
Bu durum normalde, PostScript yazıcılarda yaygın kullanılan bir TrueType Windows tipi kullanılıyorsa oluşur. Buna örnek olarak, çoğu cihaz üzerinde Helvetica yazı tipi için PostScript yazı tipi tanımı kullanılarak yazdırılan TrueType Arial PostScript örneği vardır. Bu, yazı tipi adı farklı olan benzer bir yazı tipi kullanılarak yapılan bir değiştirme örneğidir. Bu durumda, normalde bu benzer yazı tipi tanımını doğrudan bulabilir ve kullanabilirsiniz, çünkü benzer yazı tipi tanımı da doğru bir cihaz yazı tipi olarak ortaya çıkar. Bu makalenin ilerleyen sayfalarında ele alınmıştır.
Cihaz yazı tipi değişikliği, yazıcıda kullanılan yazı tipinin işletim sisteminin sağladığı yazı tipiyle aynı adı sağladığında da ortaya çıkar. Bu durum normalde en çok LaserJet Hewlett-Packard yazıcılarda oluşur. Bu yazıcılar normalde Arial ve Times New Roman Windows yazı tiplerinin kendi sürümlerine sahip olur. Bu yazı tipleri normalde doğru cihaz yazı tipleri bulunarak bulunsa da, bazen yazıcı sürücüleri kendi başına seçim yaptıklarında veya işletim sisteminin sağladığı yazı tipinin kullanıp kullanmayacaklarını seçmeleri nedeniyle bazen garanti edilemez.
Doğru cihaz yazı tipleri
Doğru cihaz yazı tipleri, yazıcıda yalnızca tanımı olan yazı tipleridir. Bir uygulamanın bu yazı tiplerini kullanmanın tek yolu, uygulamanın yazı tipini özel olarak tanımlaması ve yazıcı cihazı bağlamında kullanmak üzere oluşturmasıdır.
Bir cihaz hakkında yeterli bilgi varsa, LOGFONT cihaz yazı tipinin gerçekleştirilmesine neden olacak bir yapıda mantıksal bir yazı tipi açıklaması oluşturabilirsiniz. Özellikle üye, üye ve yazı tipinin lfFacename lfHeight karakter kümesi için doğru bilgileri sağlamak önemlidir. Ayrıca, üyenin lfOutPrecision benzer adlı sistem yazı OUT_DEVICE_PRECIS tipleri yerine cihaz yazı tiplerini seçmek için yazı tipi eşleme işlemini etkilemek için bir bayrak içermesi gerekir.
Yazı tipinin açıklaması bilinmiyorsa, cihaz yazı tiplerini bulmak için yazı tiplerini numaralara yazdırabilirsiniz. Yazıcının desteklediği cihaz yazı tiplerinin listesini almak için, gibi yazı tipi numaralama işlevlerinden birini kullanın EnumFontFamiliesEx. Geri arama işlevine konulan uygulama kodu, cihaz yazı tipini açıklayan yazı tipi örneklerini belirlemek için geri arama işlevine iletilan verileri inceebilir.
Doğru cihaz yazı tiplerini kullanma
Bir cihaz yazı tipini yazıcı cihazı bağlamında kullanma işlemi şu genel adımları izler:
- Yazıcı cihazı bağlamında yazı tiplerinin numaralarını kullanarak gerçek cihaz yazı tiplerini tanımlama.
- Bayraklarla ve eleme işlemiyle belirtilen, yalnızca cihaza
FontTypeuygun yazı tiplerini seçin. - Cihaz yazı tipi kullanılarak çizilen metni
MM_TEXTdoğru bir şekilde yer değiştirmek için, eşleme modunda yazıcıya özgü ölçümleri kullanın.
Yazıcı cihazı bağlamının yazı tiplerini numaralara ekleme
Bir cihaz bağlamında kullanılabilen tüm yazı tiplerinin numaralarını oluşturmak için geri EnumFontFamiliesEx çağırma işlevlerini ve Win32 uygulama programlama arabiriminden (API) işlevi kullanabilirsiniz. Tüm yazı tiplerini bir cihaz bağlamında numaraya almak için, EnumFontFamiliesEx önce iki kez aramanız gerekir: yazı tipi ailelerinin listesini almak için ve ikinci kez de her yazı tipi ailesinde yer alan farklı yazı tiplerinin hepsini almak için.
Tüm cihaz yazı tiplerini yazıcı cihazı bağlamında bulmak için, yazıcı cihazı bağlamının tüm yazı tiplerini numaralayın. Her yazı tipi geri çağırma işlevlerine geçirlendiğinde, bunun bir cihaz yazı tipi olup olmadığını belirlemek için yazı tipi inceler. Aşağıdaki PrinterDeviceFontEnum örnek PrinterDeviceFontFamiliesEnum kodda yer alan ve geri arama işlevleri bu işlemi gerçekleştirir.
// 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;
}
örnek kodda, işlevin iki kez EnumFontFamiliesEx çağrılarak olduğunu görüyoruz. İlk çağrı işlevde PrintDeviceFontList yapılır. İkinci arama geri arama PrinterDeviceFontFamiliesEnum işlevindedir.
PrintDeviceFontList en üst düzey işlevdir. PrintDeviceFontList yazıcı cihazı bağlamında bir yazdırma işi başlatarak EnumFontFamiliesEx ve ardından ilk çağrıyı çağırarak yazı tipi numaralama işlemini başlatarak iki görev gerçekleştirir. Platform Yazılım Geliştirme Seti (SDK) belgelerine göre, LOGFONT lfCharSet DEFAULT_CHARSET EnumFontFamiliesEx yapının üyesini değere ayar her yazı tipi ailesinde numaralar. Yazı tipi numaralama tamamlandıktan sonra, kod yöntemi çağırarak yazdırma işi yönetimi görevini EndDoc tamamlar.
Geri PrinterDeviceFontFamiliesEnum çağırma işlevi, işlev tarafından her yazı tipi ailesi için çağrılır EnumFontFamiliesEx . Bu geri arama işlevinde, kod başlangıçta yazı tipi ailelerini yalnızca parametreyle işaretlenmiş cihaz yazı tiplerini bulmak için ekranlar FontType . Ayrıca, bu yazı tiplerinin indirilebilir yazı tipleri olma TrueType olasılığı olduğundan dolayı işaretlenmiş tüm yazı tiplerini de ekrandan indirir. Cihaz yazı tipi olarak kabul edilen bu yazı tipi aileleri için işlev EnumFontFamiliesEx yeniden çağrılır ENUMLOGFONTEX , ancak geri çağırma işlevinin aldığı yapı geçir edilir. Geri arama parametresinin ikinci numaralama işlevi aramasını giriş parametresi olarak kullanmak, ikinci numaralamanın bu yazı tipi ailesinde tüm farklı yazı tiplerini listeleymesini sağlar.
Cihaz yazı tiplerini seçme
Yazıcı cihazı yazı tiplerinin belirli ölçütlerini kullanarak bu yazı tiplerini numaralara uyan diğer yazı tiplerinden ayırt edebilirsiniz. Özel olarak, geri çağırma DEVICE_FONTTYPE işlevinin FontType DWORD parametresinde değeri arayın. Bu değer kümesiyle geri arama işlevine teslim kullanılan yazı tiplerinin neredeyse tüm yazı tipleri, yazıcı cihazı bağlamında kullanılan cihaz yazı tipleridir (Adobe yazı tipleri hariç).
Örnek kodda, geri PrinterDeviceFontEnum çağırma işlevi, yazı tipi ailesinde her farklı yazı tipi için ikinci numaralama tarafından çağrılır. Geri PrinterDeviceFontEnum çağırma işlevi üç görev gerçekleştirir:
İşlevin yalnızca cihaz yazı tipleri olarak tanınan yazı tiplerini işlemesi için cihaz yazı tipi ölçütlerini yeniden kullanır.
Başka bir yazı tipi numaralama kullanarak, cihazın yazı tipinin de sistemin ekran aygıtı bağlamında kullanıp kullanılmadığnı görmek için, yazı tipini arar.
Yazı tipinin kullanımını göstermek için oluşturulan yazdırma işi üzerine yazı tipinin bir örneğini yazdırır. Bu geri arama işlevi, aşağıdaki örnek kodun
IsSystemFontbir parçası olan , adlı işlevi kullanır:
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;
}
Bu işlev, bir cihaz yazı tipi olarak işaretlenmiş ancak gerçek bir cihaz yazı tipi değilse (bu makalede tanıma göre) bu işlevi algılar. Bu durum, Adobe yazı tipleri Adobe Type Manager aracılığıyla veya Windows 2000 veya Windows XP'de bulunan yerel Adobe rasterleştiricisi aracılığıyla sisteme yüklenirken ortaya çıkar.
Bu durum ortaya çıkarsa, yazı tipi gerçekten de yazıcıya indirilen sistem tarafından sağlanan bir yazı tipidir ve bu da bazen TrueType yazı tiplerinde oluşur. Ne yazık ki, Windows 98, Windows Edition (Ben), Windows 2000 ve Windows XP'de kullanabileceğiniz, bu bayrağın sistemin sağladığı Adobe yazı tipi olduğunu (bayrak içeren TrueType yazı tiplerinden farklı olarak) yoktur. Yapının üyesine dair bir NEWTEXTMETRIC gösterge ntmFlags vardır, ancak bu yalnızca 2000 ve Windows sonra kullanılabilir. Bu nedenle, kod eleme işlemine başvurulabilir. Cihaz yazı tipi hem ekran IsSystemFontdetermines aygıtı bağlamı hem de yazıcı cihazı bağlamı tarafından sağlanıyorsa yazı tipi kaldırılır.
Yazı tipinin tekrar tekrar ölçeklendirilen örneklerini önlemek için, kodda aday yazı tipi zaten kullanılmış olduğunda da not alın. Bunun belirli bir uygulaması, bir yazı tipinin sıralı numaralamalarının aynı yazı tipi ama farklı bir ölçekte olduğunu görmek için yazı tiplerinin numaralama sırasına göre kullanır. Yalnızca farklı ölçekte olan yazı tiplerini kaldırmak için kod bu işlevi CompareLogFontEx kullanır.
Not
Programlama ve işletim Windows, yalnızca ölçekle farklı yazı tipi örneklerinin sıralı olarak sıralan durumuna sahip değildir. Kod örneği bu tekniği kullanır çünkü bu şekilde numaralamanın böyle olduğu görülür ve yazdırılan sayfada örnek çizgi sayısını azaltma, tanıtım kodunun önemli bir özelliği değildir. Aynı yazı tipinin farklı ölçeklerini eleyerek kullanmak için kullanılan cihaz yazı tiplerinin veri yapısını korumanız gerekir. Ardından, programın o anda numaralandı olan yazı tipini bu veri yapısına göre denetlemesi gerekir.
Ölçeklenebilir - Bit eşlem yazı tipleri
Yazıcılarda numaralan iki tür cihaz yazı tipi vardır:
- Bit eşlem veya raster yazı tipleri
- Ölçeklenebilir yazı tipleri
Bit eşlem yazı tipleri, sabit boyutta bir karakter karakteri tanımına sahip yazı tipleridir. Ölçeklenebilir yazı tipleri, herhangi bir boyutta çizilebilen, matematikle ilgili bir tanım olan yazı tipleridir. Başka bir deyişle, boyutları ölçekler.
Bit eşlem yazı tipinin klasik örneği Courier 10 karakter/inç (cpi) biçimidir. Adı da anlaşılacağı gibi bu yazı tipi, yazı tiplerinden etki türü yazıcılara geçişten çok daha uzun bir süredir. Buna bit eşlem yazı tipi denir, çünkü yazı tipinin en yaygın tanımı bir nokta matrisli yazıcının ROM bit eşlem görüntüsünde yer alıyor.
Tipik olarak Helvetica ve Times gibi standart bir PostScript tipi kümesi bulunan çoğu PostScript yazıcıda ölçeklendirilebilir, yazıcıda yerleşik yazı tipleri bulunabilir.
Ölçeklendirilebilir olmayan cihaz yazı tiplerinin geri arama işlevinin FontType parametresinde ayarlanmış birazsı vardır. Bu bit SDK'de simgeyle RASTER_FONTTYPE gösterilir. FontType Geri arama işlevinin parametresinde ayar yoksa, yazı RASTER_FONTTYPEbit tipi ölçeklenebilir bir yazı tipidir. Bunun nasıl belirlenecek bir örnek için, örnek PrinterDeviceFontEnum kodun geri arama işlevine bakın.
Cihaz yazı tiplerini çizme
Cihaz yazı tipleri olan yazı tipleri bulunduktan sonra, örnek bunları numaralamanın tamam bulunduğu yazıcı cihazı bağlamında kullanır. Cihaz yazı tipleri, işlevle mantıksal bir açıklama oluşturarak diğer yazı tiplerinin çok benzer şekilde CreateFontIndirect kullanılır. Bu işlev çağrısı, yazı LOGFONT tipi numaralama geri çağırma işlevine geçirilen çağrıyı verir. HFONT Oluşturulduktan sonra, bunu işlev çağrısıyla cihaz bağlamına göre seçerek yazıcı cihazı bağlamında SelectObject kullanılır.
Cihaz yazı tipinin ölçümleri, işlev çağrısı aracılığıyla GetTextMetrics elde edilir. En iyisi, cihaz bağlamında varsayılan eşleme MM_TEXT modu olan eşleme modunu kullanarak yazıcı cihazı bağlamları üzerinde çalışmanızdır. Eşleme modunu kullanırsanız MM_TEXT , diğer eşleme modlarının birim dönüştürme işlemi sırasında meydana gelebilir matematik hatalarından kaçınabilirsiniz.
Bir cihaz yazı tipini yazıcı cihazı bağlamında kullanıyorsanız, yazı tipi ve dizelerin ölçümlerini diğer cihaz bağlamlarında taşımama konusunda dikkatli olmalısınız. Bu özellikle bellek cihazı bağlamları için de böyledir. Tanım olarak, bellek cihazı bağlamı yazdırma işi değil, raster grafiklerin geçici bellek tamponudur ve dolayısıyla cihaz yazı tipini kullanmaz.
Yazıcı cihazı yazı tiplerini kullanılırken dikkate alınması gereken başka bir nokta da vardır: Yazdırma işinin What-You-Is-What-You-Get türü önizlemesini sağamazsınız. Açıkça, yazıcı donanımında bulunan yazı tipleri ekrana çizilene kadar açamaz. ExtTextOut Yazdırma işini önizlemeye en yakın olanı, bir yazıcı cihazı yazı tipinin genel özelliklerine sahip sistem tarafından sağlanan bir yazı tipini bulmak ve sonra da işlevi kullanarak karakter karakterlerinin yazdırılan sayfada yerleşimini benzetimini kullanarak bu yazı tipinin karakterlerini çizin.
Cihaz yazı tiplerini kullanma sorunları
Cihaz yazı tiplerini kullanırken aşağıdaki sorunlarıyla da birlikte kullanabilirsiniz:
Cihaz yazı tipi var, ancak yazıcı sürücüsü bu yazı tipini numaralara eklemez.
Yazıcı cihazı bağlamında kullanmak üzere kullanılabilen yazı tiplerini numaralara ek olarak belirterek bir cihaz yazı tipini bulamıyorum iki nedenden biri vardır:
- Yazıcı sürücüsü, belirli bir nedenden dolayı o cihazın yazı tipini dışarıda tutmak için yazılmıştır.
- Yazıcı sürücüsü yazı tipini numaralara ayarlar, ancak yazı tipi parametrede düzgün bir şekilde cihaz yazı
FontTypetipi olarak işaret değildir.
Cihaz yazı tipleri olarak numara görünüyor gibi görünen sistem yazı tipleri vardır.
Sistem tarafından sağlanan bir yazı tipi yazıcıya indirilirken bu sorun oluşur.
Bu durum TrueType yazı tiplerinde olduğunda,
TRUETYPE_FONTTYPEDEVICE_FONTTYPEyazı tipi numaralama geri çağırma işlevi parametre üzerinde ayarlanmış bitleri olan bir aramaFontTypealır. Bu, bu bit bileşimlerini içeren yazı tiplerini içermeerek örnek kodda ele alınamaz.Bu sorun, Adobe PostScript yazıcıya indirilen sistemde yüklü olan yazı tiplerinde de ortaya çıkar. Bu yazı tiplerini diğer cihaz yazı tiplerinden ayırmanın bir yolu, bunları hem sistem ekranı cihazı bağlamında hem de yazıcı cihazı bağlamında bakmaktır. Aynı yazı tipi her iki cihaz bağlamında da numaralandı ise, yazı tipi büyük olasılıkla yazıcı cihaz bağlamında kullanılırken yazıcıya indirilir.
Yazıcı sürücüm birkaç ölçeklenebilir cihaz yazı tipine numara yapıyor, ancak boyutları dışında bunlar aynı görünüyor.
Birçok yazıcı sürücüsü, farklı boyutları olan aynı yazı tipinin birkaç farklı örneğini sağlayarak ölçeklendirilebilir bir yazı tipini numaralara ayarlar. Bu, örnek kodda ele alınarak bu yazı tiplerinin işlev kullanılarak ölçeklendirilebilir olduğu kabul edilen çeşitli örnekleri karşılaştırılabilir
CompareLogFontEx.Not
FontTypeGeri arama işlevininRASTER_FONTTYPEbitparametresi ayara sahip olduğunda, birden çok numaralama her boyut için ölçeklenebilir olmayan yazı tiplerinin belirli örneklerinin açıklamalarını sağlar. Her geri arama, bu yazı tipinin kullanılabilir olduğu yalnızca boyutları numaralandırıyor.Bazı yazıcılarda cihaz yazı tipleri görünmüyor.
Bu durum doğrudur. Mürekkep jet türünde yazıcılar olan bazı yazıcılarda cihaz yazı tipleri sağlanmaz. Bu yazıcılar kesinlikle taramalı cihazlardır ve dolayısıyla yazıcıda yerleşik yazı tipi tanımları olmaz.