首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 等级考试 > 复习指导 >

C++实用技巧二十一

2009-01-11 
汉字笔画计算代码

    通过提取楷体的字形轮廓可以获得汉字笔画。只不过选用的字体必须是楷体。其他字体不行。
  这功能没什么用途吧,我只是好玩而已。
  int GetCharStrokes(UINT ch)
  {
  HFONT hFont;
  { // create font;
  LOGFONT lfFont;
  memset(&lfFont, 0, sizeof(lfFont));
  lstrcpy(lfFont.lfFaceName, "楷体_GB2312");
  lfFont.lfHeight = 72;
  lfFont.lfWeight = FW_NORMAL;
  lfFont.lfItalic = FALSE;
  lfFont.lfStrikeOut = FALSE;
  lfFont.lfCharSet = DEFAULT_CHARSET;
  lfFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
  lfFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  lfFont.lfQuality = DRAFT_QUALITY;
  lfFont.lfPitchAndFamily = DEFAULT_PITCH;
  hFont = CreateFontIndirect(&lfFont);
  }
  HDC hDC = GetDC(NULL);
  if (hDC==NULL) return 0;
  HGDIOBJ hOldFont = SelectObject(hDC,hFont);
  MAT2 mat;
  memset(&mat,0,sizeof(mat));
  mat.eM11.value = 1;
  mat.eM22.value = -1;
  GLYPHMETRICS gm;
  memset(&gm,0,sizeof(gm));
  DWORD dwSize = GetGlyphOutline(hDC,ch,GGO_NATIVE,&gm,0,NULL,&mat);
  int cnt = 0;
  LPVOID pBuff = NULL;
  if (dwSize>0)
  {
  pBuff = malloc(dwSize);
  memset(&gm,0,sizeof(gm));
  DWORD res = GetGlyphOutline(hDC,ch,GGO_NATIVE,&gm,dwSize,pBuff,&mat);
  if (res!=dwSize)
  {
  free(pBuff);
  pBuff = NULL;
  }
  }
  if (pBuff)
  {
  BYTE * ptr = (BYTE *)pBuff;
  while (dwSize>0)
  {
  TTPOLYGONHEADER * header = (TTPOLYGONHEADER *)ptr;
  cnt ++;
  ptr += header->cb;
  dwSize -= header->cb;
  }
  free(pBuff);
  }
  SelectObject(hDC,hOldFont);
  ReleaseDC(NULL,hDC);
  return cnt;
  }
  测试:
  union {
  UINT ch;
  char szText[4];
  } a;
  char * szText = "疆";
  a.ch = 0;
  a.szText[1] = szText[0];
  a.szText[0] = szText[1];
  int cnt = GetCharStrokes(a.ch);
  TRACE("\"%s\"的笔画%d\n",szText,cnt);
  运行结果:
  "疆"的笔画19

 

3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/

热点排行