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;iMoveTo(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