www.pudn.com > w_font.rar > FontFile.cpp
// FontFile.cpp: implementation of the CFontFile class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "LEDCONF.h" #include "FontFile.h" #include#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CFontFile::CFontFile() { } CFontFile::CFontFile(const char* filename):m_filename(filename) { m_bFileOpened=FALSE; if(m_file.Open(m_filename,CFile::modeRead))m_bFileOpened=TRUE; } CFontFile::~CFontFile() { if(m_bFileOpened)m_file.Close(); } BOOL CFontFile::FetchBytes(const char* innerCode) { GetPosition(innerCode); m_file.Seek(m_fontOffset,CFile::begin); return (m_file.Read(m_charbuf,m_bytesNum) == m_bytesNum); } void CFontFile::DisplayFont(HWND hwnd) { RECT rect; ::GetWindowRect(hwnd,&rect); RedrawWindow(hwnd,NULL,NULL,RDW_ERASE); CDC dc; HDC hdc=GetDC(hwnd); dc.Attach(hdc); int width=rect.right-rect.left; int height=rect.bottom-rect.top; int FontWidth=__min( width,height); int penWidth; if(m_bytesNum>16)penWidth=FontWidth/(sqrt(m_bytesNum*8)+1); else penWidth=FontWidth/17;//asc16 CPen pen; pen.CreatePen(PS_SOLID, penWidth, RGB(0,0,0)); CPen* oldpen=dc.SelectObject( &pen); if(m_bytesNum==72)Convert(); ScanFont(&dc,penWidth); dc.SelectObject(&oldpen); ReleaseDC(hwnd,dc.m_hDC); } void CFontFile::ScanFont(CDC* dc,int penWidth) { int i,j,x,y; BYTE mask; for(i=0;i MoveTo(x,y); dc->LineTo(x,y); } mask >>=1; x+=penWidth; } } } void CFontFile::GetPosition(const char* innerCode) { BYTE zone,pos; if(m_bytesNum<=32) { zone= *(innerCode) -0xa1; pos= *(innerCode+1)-0xa1; if(zone<0x80)m_fontOffset=m_fontOffset=(94*zone+pos)*m_bytesNum; else { if(m_bytesNum!=12)m_fontOffset=*innerCode*m_bytesNum; else m_fontOffset=(*innerCode-0x20)*m_bytesNum; } } else if(m_bytesNum>=72) { zone=*(innerCode) -0xb0; pos=*(innerCode+1)- 0xa1; if(zone<0x80)m_fontOffset=(94*zone+pos)*m_bytesNum; else m_fontOffset=*innerCode*m_bytesNum; } } void CFontFile::Convert() { int num=sqrt(m_bytesNum*8)/8;//每行或每列字节数 BYTE FontMatrix[48][48]={0}; int i,j; for(i=0;i >(7-j))&(BYTE)0x01; m_charbuf[i]=0; } BYTE temp; for(i=0;i