绝对赠送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; }
==========================================
我的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; }
==========================================
解决方案 »
- 求助:大侠们帮忙写个取得网页内容然后发送到邮箱代码?
- 请教:如何用vb操作OLE 中的Excel.
- XP系统下用VB6和VB.NET2005编写的DLL,在应用程序中用WITHEVENTS 调用DLL中自己编写的事件无响应是怎么回事?把DLL改写成ACTIVEX控件就可以响应
- 请问WIN2003下,生成DLL的时候,提示“权限被拒绝”的解决办法?感激不尽!
- 请问VB怎样调用INTERBASE数据库(.gdb)?谢谢!在线等待!
- 这样的SQL语句如何写(急在线等待)
- 怎么读出条形码扫描仪扫描的条形码数据?
- 如何捕捉mshflexgrid中用鼠标改变单元宽窄的事件?
- 请大家帮忙,自定义控件的问题。
- 请教高手帮我写一下数据库报表的制作过程,例子用VB中的BIBLIO.MDB好了!多谢
- (非技术贴)上次发我写的可自定义表格打印控件得到了很多人的意见和建议。第2版完成。
- 急!!!关于水晶报表打印报错的问题
够清楚吗?
这个问题大到有关统一台湾的。实现了这个功能就统一两岸文字了。
给你个本办法,把A打印到一个DC上,然后再分析。
http://www.activevb.de/rubriken/ausschreibungen/02_12_17_getglyphoutline/downloads/GetGlyphOutline.zip
但Modest(塞北雪貂) 没有实例,经我测试,能否实现还是个问题,但给18分。
但我还有以下问题:
A:如何理解lPBuffer的值呢?我很难在MSDN找到这样的技术资料。
B:请看http://community.csdn.net/Expert/TopicView.asp?id=4589947再次感谢您们赋出的努力