汉字内码及点阵 谢过先如何获得汉字字符的内码及其点阵 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 到我的网站来看看,刚好更新了那一部分:http://kacarton.yeah.net 真麻烦,又被干掉了。还是贴出来吧。获取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,聪明的看官一定知道该怎么改吧。 复制,剪切,拷贝用#什么来表示阿??? [求助]关于单据套打问题 奇怪。。如何获取标题栏的文字 数据处理,在等待!急!急! NMUDP的问题,高手多多指教,不胜感激啊!! 哪里能找到《delphi4技术内幕》的光盘内容 我是个初学者,请大家帮帮忙啊。 关于一个计算库存的准确性? 5大家来谈谈怎么能防止DEDE反编译呢?简单点方法就行 浏览器 请问如何在Delphi中克隆数据集 怎样在edit中显示一个变量的内存地址,需要使用到什么样的API函数。谢谢!在线等候!
http://kacarton.yeah.net
获取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,聪明的看官一定知道该怎么改吧。