获取TTF字体的点阵信息还是使用GetGlyphOutline
看代码
CClientDC dc(this); HDC hDC = dc.GetSafeHdc(); //创建字体 CFont font; VERIFY(font.CreateFont(32, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋体")); CFont *pOldFont = dc.SelectObject(&font); // 定义并初始化变换矩阵 MAT2 mat2; memset(&mat2, 0, sizeof(mat2)); mat2.eM11.value = 1; mat2.eM22.value = -1; // 我这里写-1, 字体会倒置, 结合BMP的格式 GLYPHMETRICS metrics; // 保存字符相关信息 DWORD dwDataSize = 0; // 初始化字符数据缓冲区大小 //…… // 通过函数GetGlyphOutline()确定存储字符结构的空间 wchar_t nChar = L'我'; ::TextOut(dc.m_hDC, 0, 0, "我", 2); dwDataSize = ::GetGlyphOutlineW(dc.m_hDC, (UINT)nChar, GGO_BITMAP, &metrics, 0, NULL, &mat2); if ((dwDataSize != 0) && (dwDataSize != GDI_ERROR)) { CMYBitmap myBitmap; myBitmap.Create(1, metrics.gmBlackBoxX, metrics.gmBlackBoxY, true); dwDataSize = ::GetGlyphOutlineW(dc.m_hDC, (UINT)nChar,GGO_BITMAP,&metrics, myBitmap.m_lBITMAPDATALen, myBitmap.m_pBITMAPDATA, &mat2); char chTemp[MAX_PATH]; sprintf(chTemp, "E:\\我.bmp"); CMYBitmapReader::SaveBitmap(chTemp, myBitmap); }
点阵数据就是BMP格式的数据, 构建好BMP相关的信息头后即可显示在DC或者保存在BMP文件中
GGO_BITMAP 1位位图
其他的你可以使用8位位图保存, 但注意颜色表的构建.
那些LED显示条, 一个字有16*16点, 有32*32点 等等.
记得以前做过一个程序, 输入文字, 把该文字的转成对应点阵格式. 对于16*16或者32*32的点阵屏, 使用TTF字体的数据提取并不是最好的. 因为提取出来的文字, 特别是中文, 点阵的范围不是很固定(例如你设置字体高度是32, 但提取出来的点阵信息并不一定是32*32的, 有些29, 有些31等等).
16*16或者32*32点阵屏可以找DOS系统中的点阵文件来提取. 如果大于32*32就可以考虑使用TTF来提取, 但是要做一些处理来对齐文字的显示.