绝对赠送100分.要求在VB下实现。
我的MSN:[email protected]  oicq:6188538 
tel:13660602211
提示:
我只找到关于VC下的例子,如下:
=====================
     取得字符点阵主要用GetGlyphOutline函数:DWORD GetGlyphOutline( UINT nChar, UINT nFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lPBuffer, const MAT2 FAR* lpmat2 )它需要类型为GLYPHMETRICS、MAT2的变量;MAT2 结构要手动填充, GLYPHMETRICS结构则由GetGlyphOutline填充;GLYPHMETRICS包含了点阵数据的一些有用的信息:typedef struct _GLYPHMETRICS {    UINT    gmBlackBoxX;      //点阵数据轮廓矩形的宽    UINT    gmBlackBoxY;     //点阵数据轮廓矩形的高    POINT   gmptGlyphOrigin;            short   gmCellIncX;    short   gmCellIncY;} GLYPHMETRICS, FAR *LPGLYPHMETRICS;       GetGlyphOutline函数要调用两次,第一次调用将LPVOID lpBuffer指定为NULL,函数将返回点阵数据需要的缓冲区大小(以字节为单位),将它传给cbBuffer参数,并依此值申请内存,将内存指针传给lpBuffer,再次调用GetGlyphOutline函数,lpBuffer缓冲区将被填充。CClientDC DC(this);. . . . . . //获取本字符需要的缓冲区大小cbBuffer=DC.GetGlyphOutline(nChar,GGO_BITMAP,&lpgm,0,NULL,&mat2);if(cbBuffer <0 ) return NULL;      //调用失败将返回负数//开辟缓冲区lpVBuffer=new BYTE[cbBuffer];//填充字符图像缓冲区lpvBuffercbBuffer=DC.GetGlyphOutline(nChar,GGO_BITMAP,&lpgm,cbBuffer,lpvBuffer,&mat2);              lpBuffer缓冲区内的数据是DWORD对齐的,即如果取得点阵宽度是12位,只需要三个字节存放一行数据(一个位对应一个点),但实际要占用四个字节;再如,如果点阵宽度是17位,则一行数据占用8个字节。数据的提取方式因应用的不同而不同,再次不再赘述。注:以上只针对点阵数据提取,即UINT nFormat 的值是GGO_BITMAP,轮廓提取请参考MSDN。       以上用法VC6/SP5 WIN XP/SP2下测试通过,欢迎交流!================================还有如下:
====================================
HDIB ConvertCharToDIB(UINT nChar,LOGFONT lfont) 
{ CClientDC DC(this); 
SelectObject(DC.GetSafeHdc(),CreateFontIndirect(&lfont)); //定义输出HDIB 
HDIB hDib; //输出图像的高和宽 
int iHeight , iWidth; //定义GLYPHMETRICS 
GLYPHMETRICS lpgm; //定义MAT 
MAT2 mat2; 
mat2.eM11.value=1; 
mat2.eM11.fract=0; 
mat2.eM12.value=0; 
mat2.eM12.fract=0; 
mat2.eM21.value=0; 
mat2.eM21.fract=0; 
mat2.eM22.value=1; 
mat2.eM22.fract=0; //缓冲区大小 
int cbBuffer; //定义字符图像数据缓冲区 
BYTE *lpvBuffer; //DIB像素缓冲区指针 
LPSTR lpBitsDst; //取得当前字体信息 
TEXTMETRICA tm; 
GetTextMetrics(DC.GetSafeHdc(),&tm); //获取本字符需要的缓冲区大小 
cbBuffer=DC.GetGlyphOutline(nChar,GGO_BITMAP,&lpgm,0,NULL,&mat2); 
if(cbBuffer <0 ) return NULL; 
//开辟缓冲区 
lpvBuffer=new BYTE[cbBuffer]; 
//填充字符图像缓冲区lpvBuffer 
cbBuffer=DC.GetGlyphOutline(nChar,GGO_BITMAP,&lpgm,cbBuffer,lpvBuffer,&mat2); //取得目的DIB的高和宽 
iHeight = tm.tmHeight; 
iWidth = lpgm.gmBlackBoxX; // 图像每行的字节数 
LONG lLineBytes; // 计算图像每行的字节数 
lLineBytes = WIDTHBYTES(iWidth * 8); BYTE * lpSrc; //开辟DIB像素位缓冲区 
BYTE * pBitsBuf = new BYTE[iHeight*lLineBytes]; 
memset(pBitsBuf,0,iHeight*lLineBytes); int i,j; 
BYTE tdata=0; //由于字符图像数据是4字节对其,所以要根据字符宽度计算每一行占用字节数 
int iLineWidth = (iWidth/32 + (int)(fmodl(iWidth,32)>0?1:0))*4; //定义起始行,使得字体矩形在字符高度 下对齐 
int upline = tm.tmHeight-lpgm.gmBlackBoxY; //遍历所有字符图像数据,填充DIB像素位 
//列数从upline开始,到字体矩形高度为止 
for(j=upline;j<upline+(int)lpgm.gmBlackBoxY;j++) 

for(i=0;i<iWidth;i++) 

tdata = *(lpvBuffer+(j-upline)*iLineWidth+i/8); 
lpSrc = (unsigned char*)pBitsBuf + lLineBytes * (iHeight - 1 - j) + i; 
if (GetBit(tdata,7-(int)fmodl(i,8))) 
*lpSrc =255; 

} //定义DIB头 
BITMAPINFOHEADER bmih; bmih.biSize = 40; 
bmih.biWidth = iWidth; 
bmih.biHeight = iHeight; 
bmih.biPlanes = 1; 
bmih.biBitCount = 8; 
bmih.biCompression = BI_RGB; 
bmih.biSizeImage = iHeight * lLineBytes; 
bmih.biXPelsPerMeter = 0; 
bmih.biYPelsPerMeter = 0; 
bmih.biClrUsed = 0; 
bmih.biClrImportant = 0; //定义调色板缓冲区 
RGBQUAD rgb[256]; 
for(i=0;i<256;i++) 

rgb[i].rgbBlue = rgb[i].rgbRed = rgb[i].rgbGreen = i; 
rgb[i].rgbReserved=0; 
} //计算DIB大小 
DWORD dwBitsSize = iHeight*lLineBytes + sizeof(rgb) + sizeof(BITMAPINFOHEADER); //为DIB申请内存 
hDib = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize); 
ASSERT(hDib!=0); //锁定缓冲区 
lpBitsDst = (LPSTR) ::GlobalLock(hDib); 
memcpy(lpBitsDst,&bmih,sizeof(BITMAPINFOHEADER)); 
memcpy(lpBitsDst+sizeof(BITMAPINFOHEADER),(LPSTR)rgb,sizeof(rgb)); 
memcpy(lpBitsDst+sizeof(BITMAPINFOHEADER)+sizeof(rgb),pBitsBuf,iHeight*lLineBytes); 
::GlobalUnlock(hDib); delete [] pBitsBuf; 
delete [] lpvBuffer; 
return hDib; }
==========================================

解决方案 »

  1.   

    回Modest(塞北雪貂) :我要得到字符"A"的点阵,要在VB下实现。
    够清楚吗?
    这个问题大到有关统一台湾的。实现了这个功能就统一两岸文字了。
      

  2.   

    哇!!没这么严重吧??
    给你个本办法,把A打印到一个DC上,然后再分析。
      

  3.   

    自己看吧:
    http://www.activevb.de/rubriken/ausschreibungen/02_12_17_getglyphoutline/downloads/GetGlyphOutline.zip
      

  4.   

    我很满意rainstormmaster(暴风雨 v2.0) 给出的例子,先给68分。
    但Modest(塞北雪貂) 没有实例,经我测试,能否实现还是个问题,但给18分。
    但我还有以下问题:
    A:如何理解lPBuffer的值呢?我很难在MSDN找到这样的技术资料。
    B:请看http://community.csdn.net/Expert/TopicView.asp?id=4589947再次感谢您们赋出的努力