请教如何获取字体的点阵信息?

BombZhang 2005-01-25 08:27:27
如上
...全文
491 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanqing 2005-01-26
  • 打赏
  • 举报
回复
ding
kingzai 2005-01-25
  • 打赏
  • 举报
回复
//it is bcb code
unsigned long __stdcall GetCHNFont(
char * lpszOutString, char * lpszBuffer,
char * lpszStringName, char * lpszFontName,
int nHeight, int nWidth,
bool ftbBold, bool ftbItalic,
bool ftbUnderline, bool ftbStrikeOut,
int nAngle
)//根据输入的字串,取字符点阵,返回点阵的十六进制字串到缓冲区中
{
return GetCHNFontEx(
lpszOutString, lpszBuffer, lpszStringName, lpszFontName,
nHeight, nWidth, ftbBold, ftbItalic, ftbUnderline,
ftbStrikeOut, nAngle, 0,0,0,0,0
);
}
//---------------------------------------------------------------------------

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));
if (lpszBuffer==NULL)
{ //若缓冲区为空,返回所需缓冲区的大小
return (nOneLineSize * 2 * size1.cy + StrLen(lpszStringName) +
Trim(IntToStr(nOneLineSize*size1.cy)).Length() +
Trim(IntToStr(nOneLineSize)).Length() + 10 //"~DGR:,,,"
);
}

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); //????
//BitBlt(GetDC(0),0,0,size1.cx,size1.cy,hDC,0,0,SRCCOPY);

TextOut(hDC,0,0,lpszOutString,StrLen(lpszOutString));
//BitBlt(GetDC(0),0,0,size1.cx,size1.cy,hDC,0,0,SRCCOPY);

//取点串点阵
unsigned char bits,k;
char cHex[] = "0123456789ABCDEF";
char *lpBuffer = lpszBuffer;
StrCopy(lpszBuffer, "~DGR:");
StrCat(lpszBuffer, lpszStringName);
StrCat(lpszBuffer, (","+Trim(IntToStr(nOneLineSize*size1.cy))+","+Trim(IntToStr(nOneLineSize))+",").c_str());
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);
}
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) unsigned long __stdcall GetBufferSize(
char * lpszOutString, char * lpszStringName, char * lpszFontName,
int nHeight, int nWidth, bool ftbBold,
bool ftbItalic, bool ftbUnderline, bool ftbStrikeOut,
int nAngle
)
{
return GetCHNFontEx(
lpszOutString, NULL, lpszStringName, lpszFontName,
nHeight, nWidth, ftbBold, ftbItalic, ftbUnderline,
ftbStrikeOut, nAngle, 0,0,0,0,0
);
}
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) unsigned long __stdcall GetBufferSizeEx(
char * lpszOutString, 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
)
{
return GetCHNFontEx(
lpszOutString, NULL, lpszStringName, lpszFontName,
nHeight, nWidth, ftbBold, ftbItalic, ftbUnderline,
ftbStrikeOut, nAngle, ftwCharSet, fdwOutputPrecision,
fdwClipPrecision, fdwQuality, fdwPitchAndFamily
);
}
//---------------------------------------------------------------------------

unsigned int __stdcall Getversion(void)
{
return 1;
}
xwmpq 2005-01-25
  • 打赏
  • 举报
回复

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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