例如,我想知道,某些越南文字字符,在不在“宋体”字体库中存在,有什么API函数可以判断? |
|
3分 |
仅供参考:
EnumFontFamiliesEx The EnumFontFamiliesEx function enumerates all fonts in the system that match the font characteristics specified by the LOGFONT structure. EnumFontFamiliesEx enumerates fonts based on typeface name, character set, or both. int EnumFontFamiliesEx( lpEnumFontFamExProc Remarks If lfCharset is DEFAULT_CHARSET and lfFaceName is an empty string, the function enumerates one font in every face in every character set. If lfFaceName is not empty, the function enumerates every font in the specified typeface regardless of character set. If lfCharset is a valid character set value and lfFaceName is an empty string, the function enumerates every font in the specified character set. If lfFaceName is not empty, the function enumerates every font having the specified typeface and character set. QuickInfo See Also
|
3分 |
再供参考
#pragma comment(lib,"gdi32") #include <windows.h> #include <stdio.h> int main() { const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128; PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2); pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); pbmi->bmiHeader.biWidth = uWidth; pbmi->bmiHeader.biHeight = uHeight; pbmi->bmiHeader.biPlanes = 1; pbmi->bmiHeader.biBitCount = 1; pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight; pbmi->bmiColors[0].rgbBlue = 0; pbmi->bmiColors[0].rgbGreen = 0; pbmi->bmiColors[0].rgbRed = 0; pbmi->bmiColors[1].rgbBlue = 255; pbmi->bmiColors[1].rgbGreen = 255; pbmi->bmiColors[1].rgbRed = 255; HDC hDC = CreateCompatibleDC (0); void * pvBits; HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0); SelectObject (hDC, hBitmap); HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体"); // HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体"); SelectObject (hDC, hFont); BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS); char c[4]; int i, j; for (i = 128; i < 256; i++) { sprintf (c, "%02X", i); TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2); } for (j = 0; j < 256; j++) { sprintf (c, "%02X", j); TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2); } for (i = 128; i < 256; i++) { for (j = 0; j < 256; j++) { c[0] = (char) i; c[1] = (char) j; TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2); } } for (i = 0; i < 130; i++) { MoveToEx (hDC, 0, i * 17, NULL); LineTo (hDC, uWidth, i * 17); } for (j = 0; j < 258; j++) { MoveToEx (hDC, j * 17, 0, NULL); LineTo (hDC, j * 17, uHeight); } BITMAPFILEHEADER bmfh; bmfh.bfType = *(PWORD) "BM"; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2; bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage; HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); if (hFile != INVALID_HANDLE_VALUE) { DWORD dwWritten; WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL); WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL); WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL); CloseHandle (hFile); } DeleteObject (hFont); DeleteObject (hBitmap); DeleteDC (hDC); LocalFree (pbmi); return 0; } |
楼上的代码,看完了,没用。
|
|
3分 |
你不会参考2楼代码将你要检测的字符显示出来,然后用GetPixel函数逐像素判断显示内容是否空白或□或?或??吗? |
3分 |
TextOut
The TextOut function writes a character string at the specified location, using the currently selected font, background color, and text color. BOOL TextOut( If the function fails, the return value is zero. Windows NT: To get extended error information, callGetLastError. |
3分 |
不得不佩服赵老师 |
这方法
我只是想判断一下一个字符在不在字体库中存在,感觉你方法绕了过多弯路。 有简单点的么?
|
|
TextOut返回值失败,有很多情况吧,并不一定就是字符不在字体库中这种情况
|
|
3分 |
去该字符的自摸(GetGlyphOutlineW())看他是不是为空。为空就不存在 |
1分 |
所以你要GetLaskError()啊。
当然最稳妥还是4楼的方法了。 提醒:有时字库里面有这个字符,只不过你调用CreateFont时候给的dwCharSet参数不对。 要不参考一下 Microsoft SDK\samples\multimedia\Gdi\Fonts\FontView\*.* 或 MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\FONTS\FONTVIEW\*.* http://bbs.csdn.net/topics/390374955 |
1分 |
或者参考
windows_2000_source_code\win2k\private\windows\shell\accesory\ucharmap\*.* |
GetTextFace 获取字体的字样名
|
|
怎么感觉要用到map来处理呢
|
|
GetFontUnicodeRanges函数可以
|