(急盼赐教)使用getGlyphOutline取得的位图应如何使用?

xtuzhxing 2006-01-02 03:03:04
望各位大侠赐教:
我调用pdc->GetGlyphOutline(uChar,GGO_BITMAP,&glyph,cbBuf,pBuf,&mat)获得字模点阵,使用汉子“二”。glyph.gmBlackBoxY=10,glyph.gmBlackBoxX=29。如何输出这个点阵?我想在32×32的点阵中输出,如何确定点阵左上角的坐标?glphy.gmptGlyphOrigin具体是怎么用的?
我设置字体宽和高是16×16,点阵却是29×10。有办法得到16×16的点阵吗?或者我的方法不对?
是要保存在位图中再处理吗?可是我对位图使用还一无所知。
最好能给出一个vc6.0的实例,哪位大侠有使用getGlyphOutline的GGO_BITMAP,然后利用所得点阵输出字的例子请发给我,万分感激!保证给分!


...全文
334 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xing_xing_xing 2006-01-07
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/library/en-us/dnvbdev00/html/rodfig3.jpg
xing_xing_xing 2006-01-07
  • 打赏
  • 举报
回复
试试如下代码
void CDlgDlg::OnButton2()
{
CDC *pDC = GetDC();
CFont font;
VERIFY(font.CreateFont(
72, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet ANSI_CHARSET DEFAULT_CHARSET
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
"宋体")); // lpszFacename
pDC->SelectObject(&font);

int c = 0xbbf0; //火

GLYPHMETRICS gm;
MAT2 mat2;
memset(&mat2,0,sizeof(mat2));
mat2.eM11.value = 1;
mat2.eM12.value = 0;
mat2.eM21.value = 0;
mat2.eM22.value = 1;
int len;
len = pDC->GetGlyphOutline(c,GGO_BITMAP,&gm,0,0,&mat2);
if(len == -1)return;
char *buf = new char[len];
pDC->GetGlyphOutline(c,GGO_BITMAP,&gm,len,buf,&mat2);

unsigned char *pData = (unsigned char*)buf;
unsigned int cnt = gm.gmBlackBoxX / 32 + (gm.gmCellIncX % 32 ? 1 : 0);
cnt *= 4;

int xoffset;
int yoffset;

OUTLINETEXTMETRIC otm;
memset(&otm,0,sizeof(otm));
otm.otmSize = sizeof(otm);
pDC->GetOutlineTextMetrics(sizeof(otm),&otm);

xoffset = gm.gmptGlyphOrigin.x; //x的偏移量
//y的偏移量 字的顶部 - y方向原点 都是相对于baseline
yoffset = otm.otmAscent - gm.gmptGlyphOrigin.y;

for(unsigned int row = 0; row < gm.gmBlackBoxY; row++)
{
for(unsigned int col = 0; col < cnt;col++)
{
for(unsigned int i = 0; i < 8; i++)
{
if((*pData) & (0x80 >> i))
{
pDC->SetPixel(xoffset + (col * 8 + i),yoffset + row,0);
}
}
pData++;
}
}

delete []buf;

ReleaseDC(pDC);
}
xuzheng318 2006-01-07
  • 打赏
  • 举报
回复
http://support.microsoft.com/kb/q97340/
xtuzhxing 2006-01-07
  • 打赏
  • 举报
回复
怎样确定合适的位置显示点阵啊?比如“日”字,32×32点阵,他的左边第一点总是(0,3),总是靠近左边框?字要居中才好看。那篇文章讲得不是很清楚
handsomerun 2006-01-02
  • 打赏
  • 举报
回复
帮你google了一把
就找到这个资料

http://blog.csdn.net/hazy/archive/2005/06/22/400602.aspx
xtuzhxing 2006-01-02
  • 打赏
  • 举报
回复
那篇文章我看过,但输出的点阵并不是你想要的.比方说我要16×16的点阵,gm.gmBlackBoxX
比16大,尽管设置字体是16×16的。
vcmute 2006-01-02
  • 打赏
  • 举报
回复
int cbBuffer = dc.GetGlyphOutline(nChar,GGO_BITMAP,&gm,0L,NULL,&m2);
DWORD dwErr = GetLastError();
lpvBuffer=new char[cbBuffer];
cbBuffer=pdc->GetGlyphOutline(nChar,GGO_BITMAP,&gm,cbBuffer,lpvBuffer,&m2);
int nStride = cbBuffer / gm.gmBlackBoxY;
for(int y=0;y<gm.gmBlackBoxY;++y)
for(int x=0;x<nStride;++x)
for(int k=0;k<8;++k)
if((lpvBuffer[y*nStride+x]>>(7-k))&1)
pdc->SetPixel(8*x+k,y,RGB(255,0,0));


参见 http://community.csdn.net/Expert/topic/4182/4182636.xml?temp=.2751276

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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