谢过先
如何获得汉字字符的内码及其点阵

解决方案 »

  1.   

    到我的网站来看看,刚好更新了那一部分:
    http://kacarton.yeah.net
      

  2.   

    真麻烦,又被干掉了。还是贴出来吧。
    获取Windows汉字点阵图
    编程语言:Borland C++ Builder
    作者:Conch
    发布日期:2002-12-28 
    在DOS下取字符点阵的讨论就见得多了,Windows的字体比DOS的强多了,现在来让我们取它的点阵图。 这是函数原型声明,放在DLL里的。
    extern "C" __declspec(dllexport) unsigned long __stdcall GetCHNFontEx(
                char * lpszOutString,       //pointer to output string输出内容
                char * lpszBuffer,          //pointer to buffer for return data缓冲区
                char * lpszStringName,      //pointer to the ouput string name输出内容的名称
                char * lpszFontName,        //pointer to font name字体名称
                int    nHeight,             //logical height of font字体逻辑高度
                int    nWidth,              //logical average character width字体逻辑宽度
                bool   ftbBold,             //bold attribute flag粗体
                bool   ftbItalic,           //italic attribute flag斜体
                bool   ftbUnderline,        //underline attribute flag下划线
                bool   ftbStrikeOut,        //strikeout attribute flag删除线
                int    nAngle,              //orientation angle旋转角度(逆时针)
                DWORD  ftwCharSet,          //character set字符集
                DWORD  fdwOutputPrecision,  // output precision输出精度
                DWORD  fdwClipPrecision,    // clipping precision剪切精度
                DWORD  fdwQuality,          // output quality输出质量
                DWORD  fdwPitchAndFamily    // pitch and family间距和族
                );//---------------------------------------------------------------------------unsigned long __stdcall GetCHNFontEx(
                char * lpszOutString,       char * lpszBuffer,
                char * lpszStringName,      char * lpszFontName,
                int    nHeight,             int    nWidth,
                bool   ftbBold,             bool   ftbItalic,
                bool   ftbUnderline,        bool   ftbStrikeOut,
                int    nAngle,              DWORD  ftwCharSet,
                DWORD  fdwOutputPrecision,  DWORD  fdwClipPrecision,
                DWORD  fdwQuality,          DWORD  fdwPitchAndFamily
                )//根据输入的字串,取字符点阵,返回点阵的十六进制字串到缓冲区中
    {
        if (lpszOutString==NULL || Trim((AnsiString)lpszOutString)=="") return 0;   //空字串,返回    HDC hDC;
        HBITMAP hBitmap,hOldBMP;
        HFONT hFont,hOldFont;
        SIZE size1;    if ((hDC=GetDC(0))==NULL) return 2; //不能取得DC句柄
        if ((hDC=CreateCompatibleDC(hDC))==NULL) return 3;  //不能建立内存图形设备CreateCompatibleDC
        if ((hFont=CreateFont(
                                nHeight, nWidth, nAngle, nAngle,
                                (ftbBold?700:0), ftbItalic, ftbUnderline, ftbStrikeOut,
                                ftwCharSet, fdwOutputPrecision, fdwClipPrecision,
                                fdwQuality, fdwPitchAndFamily, lpszFontName
                              ))==NULL)
            return 1;   //不能创建逻辑字体
        if ((hOldFont=SelectObject(hDC,hFont))==NULL) return 1;    GetTextExtentPoint32(hDC,lpszOutString,StrLen(lpszOutString),&size1);
        unsigned int nOneLineSize = (size1.cx/8+(size1.cx%8?1:0));
      //这里乘了8是因为本函数返回的是点阵的十六进制字串
      //若只需点阵请自行修改
        if (lpszBuffer==NULL)
        {
         //若缓冲区为空,返回所需缓冲区的大小
            return (nOneLineSize * 2 * size1.cy + StrLen(lpszStringName) +
                    Trim(IntToStr(nOneLineSize*size1.cy)).Length() +
                    Trim(IntToStr(nOneLineSize)).Length();
                   );
        }    if ((hBitmap=CreateCompatibleBitmap(hDC,size1.cx,size1.cy))==NULL)
        {   //不能创建位图设备CreateCompatibleBitmap
            SelectObject(hDC,hOldFont);
            DeleteObject(hFont);
            DeleteDC(hDC);
            return 4;
        }
        if ((hOldBMP=SelectObject(hDC,hBitmap))==NULL)
        {
            SelectObject(hDC,hOldFont);
            DeleteObject(hBitmap);
            DeleteObject(hFont);
            DeleteDC(hDC);
            return 4;
        }    SetBkColor(hDC,BackColor);
        SetTextColor(hDC,TextColor);
        FillRect(hDC,&Rect(0,0,size1.cx,size1.cy),0);    TextOut(hDC,0,0,lpszOutString,StrLen(lpszOutString));
      //到这里已经取到字阵图了,接下来是转换和清场    //把点阵信息转换成十六进制字串
        unsigned char bits,k;
        char cHex[] = "0123456789ABCDEF";
        char *lpBuffer = lpszBuffer;
        StrCopy(lpszBuffer, lpszStringName);
        lpBuffer += StrLen(lpszBuffer);    for (int i=0;i<size1.cy;i++)
        {
            bits = 0;
            k = 0x80;
            for (int j=0;j<size1.cx;j++)
            {
                if (GetPixel(hDC,j,i)==TextColor) bits|=k;
                k>>=1;
                if (!k)
                {
                    *lpBuffer++ = cHex[bits>>4];
                    *lpBuffer++ = cHex[bits&0xF];
                    bits = 0;
                    k = 0x80;
                }
            }
            if (k && k<0x80)
            {
                *lpBuffer++= cHex[bits>>4];
                *lpBuffer++ = cHex[bits&0xF];
            }
        }
        *lpBuffer = 0;    //清场
      SelectObject(hDC,hOldBMP);
        SelectObject(hDC,hOldFont);
        DeleteObject(hBitmap);
        DeleteObject(hFont);
        DeleteDC(hDC);    return (lpBuffer - lpszBuffer);
    }  是不是好像多了点什么东西,对了,这个DLL我是用来打条形码用的,所以就多了个lpszFontName,聪明的看官一定知道该怎么改吧。