如何判断指定字库中是否有该字

tang688 2011-08-29 06:08:17
我的程序因为美观的需要,要显示各种字体,但因为字库的原因(不是所有的字库都跟宋体一样几乎包含现在用到的字),有很多字会显示不了。
无法显示的汉字它就显示一个空格。
但宋体肯定都(目前系统默认可以打出的汉字,它都可以显示)可以显示。
我看到过有些文档,当这个字体没有的时候,它不会不显示,而是自动显示为宋体。
也就是说,其它的汉字本都显示为我设置的字体,但这个显示不出来的汉字显示的是宋体。
这个在VB中要如何实现?
就是需要有一个判断该汉字是否存在于该字库中的程序。来决定当该汉字不在该字库中时,显示为宋体。


...全文
609 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tang688 2011-09-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 veron_04 的回复:]
为了美观,何不使用图片?先做好图片,载入即可。
[/Quote]
哎~~!打印时图片就惨不忍睹了。
美观主要还是为了打印啊!
字变成图片后再打印,与直接打印字是完全二种不同的效果,不知道你们打印过没。
我自己慢慢研究吧!
散分!
赵4老师 2011-08-30
  • 打赏
  • 举报
回复
还可以用下面的代码人工查看一下用到的字体哪些字符是空白,记录到一个数组中。使用时查数组。
#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, "宋体");
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;
}
贝隆 2011-08-30
  • 打赏
  • 举报
回复
为了美观,何不使用图片?先做好图片,载入即可。
worldy 2011-08-30
  • 打赏
  • 举报
回复
试试API函数:
GetCharWidth32
无·法 2011-08-30
  • 打赏
  • 举报
回复
过滤了下所有含font的api函数,楼主继续折腾看看吧。
1.Declare Function AddFontResource Lib "gdi32" Alias "AddFontResourceA" (ByVal lpFileName As String) As Long

2.Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long

3.Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal H As Long, ByVal W As Long, ByVal E As Long, ByVal O As Long, ByVal W As Long, ByVal I As Long, ByVal u As Long, ByVal S As Long, ByVal C As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, ByVal PAF As Long, ByVal F As String) As Long

4.Declare Function CreateScalableFontResource Lib "gdi32" Alias "CreateScalableFontResourceA" (ByVal fHidden As Long, ByVal lpszResourceFile As String, ByVal lpszFontFile As String, ByVal lpszCurrentPath As String) As Long

5.Declare Function GetFontData Lib "gdi32" Alias "GetFontDataA" (ByVal hdc As Long, ByVal dwTable As Long, ByVal dwOffset As Long, lpvBuffer As Any, ByVal cbData As Long) As Long

6.Declare Function RemoveFontResource Lib "gdi32" Alias "RemoveFontResourceA" (ByVal lpFileName As String) As Long

7.Declare Function EnumFontFamilies Lib "gdi32" Alias "EnumFontFamiliesA" (ByVal hdc As Long, ByVal lpszFamily As String, ByVal lpEnumFontFamProc As Long, ByVal lParam As Long) As Long

8.Declare Function EnumFontFamiliesEx Lib "gdi32" Alias "EnumFontFamiliesExA" (ByVal hdc As Long, lpLogFont As LOGFONT, ByVal lpEnumFontProc As Long, ByVal lParam As Long, ByVal dw As Long) As Long

9.Declare Function GetTextCharsetInfo Lib "gdi32" Alias "GetTextCharsetInfo" (ByVal hdc As Long, lpSig As FONTSIGNATURE, ByVal dwFlags As Long) As Long

10.Declare Function GetFontLanguageInfo Lib "gdi32" Alias "GetFontLanguageInfo" (ByVal hdc As Long) As Long

11.Declare Function ImmGetCompositionFont Lib "imm32.dll" Alias "ImmGetCompositionFontA" (ByVal himc As Long, lpLogFont As LOGFONT) As Long

12.Declare Function ImmSetCompositionFont Lib "imm32.dll" Alias "ImmSetCompositionFontA" (ByVal himc As Long, lpLogFont As LOGFONT) As Long

13.Declare Function ChooseFont Lib "comdlg32.dll" Alias "ChooseFontA" (pChoosefont As CHOOSEFONT) As Long

14.Declare Function EnumFonts Lib "gdi32" Alias "EnumFontsA" (ByVal hDC As Long, ByVal lpsz As String, ByVal lpFontEnumProc As Long, ByVal lParam As Long) As Long
无·法 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dingyanwei 的回复:]

打包的时候把字体打进去不就得了。
[/Quote]人家说的显然不是缺少相应的ttf字体文件,只是某字库做的汉字不全,所以有缺字现象,我开始想的方法和4楼一样,我也觉得这个方法很不实际,楼主找找所以跟字体相关的api函数,看看有没有相关功能的。
dingyanwei 2011-08-30
  • 打赏
  • 举报
回复
打包的时候把字体打进去不就得了。
赵4老师 2011-08-29
  • 打赏
  • 举报
回复
可以先picturebox1.print到一个隐藏的picturebox1上然后用picturebox1.Point函数逐点检查是否空白。(此法速度比较慢)
无·法 2011-08-29
  • 打赏
  • 举报
回复
应该是可以的吧
tang688 2011-08-29
  • 打赏
  • 举报
回复
就没有其它办法了吗?比如API
WORD就有这个功能,但我的VB实现不了。
ningweidong 2011-08-29
  • 打赏
  • 举报
回复
这个比较麻烦
tang688 2011-08-29
  • 打赏
  • 举报
回复
晕,4楼的方法好象在程序里是不可被接受的。
虽然也是能把它判断出来,但是不要说几千字,估计几十个字时这的速度都无法让人接受。
还有别的方法吗?
v2.1151 1. 解决EnumWindow有时候会卡死的问题 2. KeyDownStr KeyUpStr KeyPressStr更名KeyDownChar KeyUpChar KeyPressChar 增加付费接口KeyPressStr 3. 去掉属性dx.public.keypad.patch,dx.public.keypad.sync和dx.public.mouse.sync. 增加收费接口EnableKeypadPatch EnableKeypadSync EnableMouseSync 4. 解决后台特征码失效的BUG。(上一个版本的问题) 5. 优化FindXXXX等的查询速度. 同时接口FindIntEx FindFloatEx FindDoubleEx FindStringEx FindDataEx参数变更. 6. 解决FindMultiColor和FindMultiColorEx在某些时候会找不到的BUG 7. 加强绑定模式1. 增加付费接口DmGuard 8. 增加付费接口FaqCaptureFromFile 【插件特色】 1. 文识别领域,目前插件界,识别速度和准确率No.1 7000汉,全屏识别,只需要几百毫秒,性能强劲! 2. 后台键鼠方面,目前插件界功能最齐全,最强悍的后台键鼠 3. 图色方面,高速找图找色,取色 4. 支持MASM Call代码嵌入执行 【功能特点】 文识别方面 1. 所有文识别接口都支持后台gdi 后台gdi2 后台dx 后台dx2 后台dx3 以及前台normal 2. 支持RGB HSV颜色识别 3. 支持RGB HSV差色识别 4. 支持多种颜色混合识别(最多10种) 5. 支持连体识别 6. 支持背景色识别 7. 支持点阵模糊识别(防杂点干扰) 8. 支持查找指定符串在屏幕的坐标 9. 支持查找指定符串在屏幕上的所有坐标 10. 支持在未知文的情况下进行词组识别 11. 支持在没有的情况下,进行词组范围识别 12. 支持多,最多10个。方便针对不同的情况制作. 13. 完全兼容91OCR(txt,mdb不支持) 14. 支持自定义加密解密 15. 支持识别指定图片的文 16. 支持在代码添加 图色方面 1. 所有图色接口都支持后台gdi 后台gdi2 后台dx 后台dx2 后台dx3 以及前台normal 2. 支持颜色查找,多种颜色查找,并可指定搜索的方向以及相似度 3. 支持图形查找,多个图形查找,并可指定搜索的方向以及相似度 4. 支持直接获取某点的颜色(RGB,HSV) 5. 支持直接对某点的颜色进行比较,可指定相似度 6. 可直接对任意区域进行截图,并保存为bmp(24位色) 7. 可获取某范围的RGB和HSV颜色均值 8. 支持图片透明色 9. 支持多图查找 10. 支持直接获取图像数组,方便二次开发 11. 支持多点找色 键鼠方面 1. 所有键鼠接口都支持windows消息模拟,dx以及前台 2. 前台完全模拟,功能和按键自带的完全一样 3. 后台windows消息模拟(类似于按键自带的后台键鼠) 4. dx键盘几乎支持所有游戏后台组合键.(首创) 5. 后台dx (首创,支持大型的3D以及2D游戏键鼠的模拟) 后台方面 1. 两个函数,搞定前后台的切换,非常简单快捷. 窗口方面 1. 支持任意绘制的信息提示窗口,可以随着游戏窗口的移动而移动 2. 信息提示窗口可以鼠标拖动,更加方便快捷 3. 支持获取通过正常手段获取不到的窗口句柄,比如QQ系列游戏 4. 支持枚举窗口 5. 支持获取窗口各种状态 6. 支持对窗口进行各种操作,关闭,最小化等等 内存方面 1. 支持CE格式的内存读取 2. 支持各种数据类型的搜索,以及多次搜索(类似CE) 3. 强力内存接口,按键自带的读不到,可以试试这个 4. 强力的内存写接口(简单游版本不支持) 汇编方面(简单游版本不支持) 1. 支持MASM语法的汇编语句,支持本进程以及目标进程的汇编代码嵌入执行(俗语Call) 2. 支持机器码和MASM语句的互转 答题器 1. 支持前后台的截图发送到服务端 2. 支持前后台的截取动画发送到服务端

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧