⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hzshxpview.cpp

📁 我写的一个大字体字库访问程序
💻 CPP
字号:
// hzshxpView.cpp : implementation of the CHzshxpView class
//

#include "stdafx.h"
#include "hzshxp.h"

#include "hzshxpDoc.h"
#include "hzshxpView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define	DIV 4
#define	QWM 0xb7a7
BYTE databuf[0x400000];
BYTE drawbuf[1024];
int x0=200,y0=200;
int	xacc=0,yacc=0;
float	blyz=(float)0.25;
int	basex=00,basey=00;
int	m_l,m_r,m_t,m_b,m_w,m_h,m_ox,m_oy;
int	fpx,fpy;
float xbl=1;

/////////////////////////////////////////////////////////////////////////////
// CHzshxpView

IMPLEMENT_DYNCREATE(CHzshxpView, CView)

BEGIN_MESSAGE_MAP(CHzshxpView, CView)
	//{{AFX_MSG_MAP(CHzshxpView)
	ON_COMMAND(ID_CONVERT, OnConvert)
	ON_WM_KEYDOWN()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHzshxpView construction/destruction

CHzshxpView::CHzshxpView()
{
	// TODO: add construction code here

}

CHzshxpView::~CHzshxpView()
{
}

BOOL CHzshxpView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CHzshxpView drawing

void CHzshxpView::OnDraw(CDC* pDC)
{
	CHzshxpDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	/*pDC->MoveTo(10,10);
	this->DrawLine(50,50,50,50,pDC);
	this->DrawLine(50,50,50,60,pDC);
	this->DrawLine(50,50,50,70,pDC);
	this->DrawLine(50,50,50,80,pDC);
	this->DrawLine(50,50,50,90,pDC);
	this->DrawLine(50,50,50,100,pDC);*/
	if(this->m_hzdraw)
	{
		SHXINDEX shxindex;
		FILE * fp;
		if((fp=fopen("newhzk.shx","rb"))==NULL)
		{
			this->m_hzdraw=FALSE;
			return;
		}
		long offset=this->GetOffset(this->m_qwm);
		fseek(fp,offset,SEEK_SET);
		fread(&shxindex,8,1,fp);
		fseek(fp,shxindex.offset,SEEK_SET);
		memset(drawbuf,0,512);
		fread(drawbuf,shxindex.len,1,fp);
		fclose(fp);
		this->Drawhz(&shxindex,pDC);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CHzshxpView printing
void CHzshxpView::Drawhz(SHXINDEX * psin,CDC* pDC)
{
	int i=0,ptr=0;
	char cmd=0,xps=0,yps=0;
	x0=0;
	y0=0;
	pDC->SetMapMode(MM_ANISOTROPIC);
	pDC->SetViewportExt(800,600);
	pDC->SetWindowExt(800,600);
	pDC->SetViewportOrg(0,0);
	pDC->MoveTo(x0,y0);
	pDC->FillSolidRect(0,0,800,600,RGB(255,255,255));
	xacc=0;
	yacc=0;
	m_draw=FALSE;
	float flt;
	int nx,ny;
	int absx0=0,absy0=0;
	basex=300;
	basey=300;
	while(ptr<psin->len)
	{
		cmd=drawbuf[ptr];
		switch(cmd)
		{
		case 1:
			m_draw=TRUE;
			pDC->SetPixel(basex+x0,basey+y0,RGB(255,0,0));
			ptr++;
			break;
		case 2:
			m_draw=FALSE;
			ptr++;
			break;
		case 7:
			ptr+=2;
			break;
		case 8:
			ptr++;
			xps=drawbuf[ptr++];
			yps=drawbuf[ptr++];
			absx0+=xps*2;
			absy0-=yps*2;
			flt=(float)absx0*blyz+0.5;
			nx=flt*xbl;
			flt=(float)absy0*blyz+0.5;
			ny=flt;
			DrawLine(nx-x0,ny-y0,pDC);
			break;
		case 9:
			ptr++;
			xps=drawbuf[ptr++];
			yps=drawbuf[ptr++];
			while(xps!=0||yps!=0)
			{
				absx0+=xps*2;
				absy0-=yps*2;
				flt=(float)absx0*blyz+0.5;
				nx=flt*xbl;
				flt=(float)absy0*blyz+0.5;
				ny=flt;
				DrawLine(nx-x0,ny-y0,pDC);
				xps=drawbuf[ptr++];
				yps=drawbuf[ptr++];
			}
			break;
		case 14:
			ptr++;
			//if(drawbuf[ptr]==8)
			//	ptr+=3;
			//else if(drawbuf[ptr]>0x0f)
			//	ptr++;
			break;
		default:
			if((BYTE)cmd>0x0f)
			{
				BYTE opt;
				opt=cmd&0x0f;
				int ll=cmd&0xff;
				ll>>=4;
				switch(opt)
				{
				case 0:
					xps=ll*2;
					yps=0;
					break;
				case 1:
					xps=ll*2;
					yps=ll;
					break;
				case 2:
					xps=ll*2;
					yps=ll*2;
					break;
				case 3:
					xps=ll;
					yps=ll*2;
					break;
				case 4:
					xps=0;
					yps=ll*2;
					break;
				case 5:
					xps=-ll;
					yps=ll*2;
					break;
				case 6:
					xps=-ll*2;
					yps=ll*2;
					break;
				case 7:
					xps=-ll*2;
					yps=ll;
					break;
				case 8:
					xps=-ll*2;
					yps=0;
					break;
				case 9:
					xps=-ll*2;
					yps=-ll;
					break;
				case 10:
					xps=-ll*2;
					yps=-ll*2;
					break;
				case 11:
					xps=-ll;
					yps=-ll*2;
					break;
				case 12:
					xps=0;
					yps=-ll*2;
					break;
				case 13:
					xps=ll;
					yps=-ll*2;
					break;
				case 14:
					xps=ll*2;
					yps=-ll*2;
					break;
				case 15:
					xps=ll*2;
					yps=-ll;
				}
					
				absx0+=xps;
				absy0-=yps;
				flt=(float)absx0*blyz+0.5;
				nx=flt*xbl;
				flt=(float)absy0*blyz+0.5;
				ny=flt;
				DrawLine(nx-x0,ny-y0,pDC);
			}
			ptr++;
		}
	}
}
BOOL CHzshxpView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CHzshxpView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CHzshxpView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CHzshxpView diagnostics

#ifdef _DEBUG
void CHzshxpView::AssertValid() const
{
	CView::AssertValid();
}

void CHzshxpView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CHzshxpDoc* CHzshxpView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHzshxpDoc)));
	return (CHzshxpDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHzshxpView message handlers

void CHzshxpView::OnInitialUpdate() 
{
	//BYTE buf[8]={0x9a,0x99,0x99,0x99,0x99,0x99,0x09,0x40};
	//double * dptr=(double*)buf;
	//int h=(int)dptr[0];
	CView::OnInitialUpdate();
	this->m_hzdraw=FALSE;
	this->m_qwmoffset=0;
	FILE * fp;
	if((fp=fopen("newhzk.shx","rb"))==NULL)
	{
		AfxMessageBox("no file exist");
		return;
	}
	fclose(fp);
	if((fp=fopen("offset","rb"))==NULL)
	{
		AfxMessageBox("no index file");
		return;
	}
	fread(&m_qwmoffset,4,1,fp);
	fclose(fp);
	//this->m_hzdraw=TRUE;
	char * str="一";
	this->m_qwm=str[0];
	this->m_qwm<<=8;
	this->m_qwm+=str[1]&0xff;
	this->m_hzdraw=TRUE;


}
long	CHzshxpView::GetOffset(WORD qwm)
{
	long offset;
	BYTE qm,wm;
	wm=qwm&0xff;
	qm=(qwm>>8)&0xff;
	offset=((long)(qm-0xa1)*94+(long)(wm-0xa1))*8+this->m_qwmoffset;
	return offset;
}
void CHzshxpView::OnConvert() 
{
	FILE * fp;
	BYTE buf[256];
	int	i=0;
	long	ptr;
	long	dataoffset=0;
	char pathbuf[256];
	::GetCurrentDirectory(sizeof(pathbuf),pathbuf);
	CFileDialog fdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT);
	if(fdlg.DoModal()!=IDOK)
		return;
	CString fname=fdlg.GetPathName();
	if((fp=fopen(fname,"rb"))==NULL)
	{
		AfxMessageBox("Open file error");
		return;
	}
	memset(databuf,0,sizeof(databuf));
	while(i<1000)	//读取版本号
	{
		fread(databuf+i,1,1,fp);
		if(databuf[i]==0)
		{
			i++;
			break;
		}
		i++;
	}
	if(i>=1000)
	{
		AfxMessageBox("file error");
		fclose(fp);
		return;
	}
	WORD * wptr;
	fread(databuf+i,2,1,fp);	//读取字符数量
	/////////////////
/*	fseek(fp,4,SEEK_CUR);
	WORD datanum;
	fread(&datanum,2,1,fp);
	i=0;
	while(i<datanum)
	{
		fread(databuf+i,1,1,fp);
		if(databuf[i]==0)
		{
			i++;
			break;
		}
		i++;
	}
	if(i>=datanum)
	{
		fclose(fp);
		AfxMessageBox("error!");
		return;
	}
	datanum-=i;
	fread(drawbuf,datanum,1,fp);
	fclose(fp);
	x0=0,y0=0;
	int absx0=0,absy0=0;
	char xps,yps;
	BYTE cmd;
	BOOL m_draw=FALSE;
	BOOL tfp=TRUE;
	CDC * pDC=GetDC();
	pDC->MoveTo(basex+x0,basey+y0);
	pDC->LineTo(basex+2, basey);
	ptr=0;
	int	nx,ny;
	float inshu=(float)1.0;
	m_draw=FALSE;
	m_ox=0;
	m_oy=0;
	m_w=m_h=0;
	int dataptr=0;
	while(ptr<datanum)
	{
		cmd=drawbuf[ptr];
		switch(cmd)
		{
		case 1:
			if(tfp)
			{
				fpx=absx0;
				fpy=absy0;
				tfp=FALSE;
				m_l=m_r=absx0;
				m_t=m_b=absy0;
				dataptr=ptr;
			}
			m_draw=TRUE;
			ptr++;
			break;
		case 2:
			m_draw=FALSE;
			ptr++;
			break;
		case 3:
			ptr++;
			inshu/=drawbuf[ptr++];
			break;
		case 4:
			ptr++;
			inshu*=drawbuf[ptr++];
			break;
		case 9:
			ptr++;
			xps=drawbuf[ptr++];
			yps=drawbuf[ptr++];
			while(xps!=0||yps!=0)
			{
				absx0+=xps;
				absy0-=yps;
				if(m_draw)
				{
					if(m_l>absx0)
						m_l=absx0;
					if(m_r<absx0)
						m_r=absx0;
					if(m_t>absy0)
						m_t=absy0;
					if(m_b<absy0)
						m_b=absy0;
				}
				xps=drawbuf[ptr++];
				yps=drawbuf[ptr++];
			}
			break;
		default:
			ptr++;
		}
	}
	m_w=m_r-m_l;
	m_h=m_b-m_t;
	m_ox=m_l+m_w/2;
	m_oy=m_t+m_h/2;
	absx0=fpx-m_ox;
	absy0=fpy-m_oy;
	nx=absx0;//*inshu;
	ny=absy0;//*inshu;
	x0=(nx+(int)(DIV*0.5))/DIV;
	y0=(ny+(int)(DIV*0.5))/DIV;
	m_draw=FALSE;
	ptr=dataptr;
	while(ptr<datanum)
	{
		cmd=drawbuf[ptr];
		switch(cmd)
		{
		case 1:
			//return;
			m_draw=TRUE;
			ptr++;
			break;
		case 2:
			m_draw=FALSE;
			ptr++;
			break;
		case 3:
			ptr++;
			inshu/=drawbuf[ptr++];
			break;
		case 4:
			ptr++;
			inshu*=drawbuf[ptr++];
			break;
		case 7:
			ptr+=2;
			break;
		case 8:
			ptr++;
			xps=drawbuf[ptr++];
			yps=drawbuf[ptr++];
			absx0+=xps;
			absy0-=yps;
			if(m_draw)
				DrawLine((absx0+(int)(DIV*0.5))/DIV-x0,(absy0+(int)(DIV*0.5))/DIV-y0,pDC);
			else
			{
				x0=(absx0+(int)(DIV*0.5))/DIV;
				y0=(absy0+(int)(DIV*0.5))/DIV;
				pDC->MoveTo(basex+x0,basex+y0);
			}
			break;
		case 9:
			ptr++;
			xps=drawbuf[ptr++];
			yps=drawbuf[ptr++];
			while(xps!=0||yps!=0)
			{
				absx0+=xps;
				absy0-=yps;
				nx=absx0;//*inshu;
				ny=absy0;//*inshu;
				if(m_draw)
					DrawLine((nx+(int)(DIV*0.5))/DIV-x0,(ny+(int)(DIV*0.5))/DIV-y0,pDC);
				else
				{
					x0=(nx+(int)(DIV*0.5))/DIV;
					y0=(ny+(int)(DIV*0.5))/DIV;
				}
				xps=drawbuf[ptr++];
				yps=drawbuf[ptr++];
			}
			break;
		default:
			ptr++;
		}
	}
	*/
	//////////////////
	wptr=(WORD*)(databuf+i);
	i+=2;
	int hznum=*wptr;
	while(i<1000)
	{
		fread(databuf+i,2,1,fp);
		wptr=(WORD*)(databuf+i);
		if(*wptr==0)
		{
			i+=2;
			fread(databuf+i,6,1,fp);	// 读取字符数据起始地址
			long * lptr=(long*)(databuf+i+2);
			dataoffset=*lptr;
			i+=6;
			this->m_qwmoffset=i;		//字符索引起始地址
			break;
		}
		i+=2;
	}
	if(i>=1000||dataoffset==0)
	{
		AfxMessageBox("data error");
		fclose(fp);
		return;
	}
	for(i=0;i<hznum;i++)
	{
		fread(buf,8,1,fp);
		if(buf[0]>=0xa1&&buf[1]>=0xa1)
		{
			if(buf[0]==0xa1&&buf[1]==0xb0)
			{
				int h=0;
				h++;
			}
			ptr=((long)(buf[1]-0xa1)*94+(long)buf[0]-0xa1)*8;
			if(ptr<=dataoffset-8)
				memcpy(databuf+this->m_qwmoffset+ptr,buf,8);
		}
	}
	if(fseek(fp,dataoffset,SEEK_SET))
		AfxMessageBox("seek set failed");
	ptr=dataoffset;
	int count=0;
	while(!feof(fp))
	{
		count=fread(databuf+ptr,1,100,fp);
		ptr+=count;
	}
	fclose(fp);
	::SetCurrentDirectory(pathbuf);
	if((fp=fopen("newhzk.shx","wb"))==NULL)
	{
		AfxMessageBox("create file failed!");
		return;
	}
	long lcount=fwrite(databuf,1,ptr,fp);
	fclose(fp);
	sprintf((char*)buf,"write data %x",lcount);
	AfxMessageBox((char*)buf);
	if((fp=fopen("offset","wb"))==NULL)
	{
		AfxMessageBox("cannot create index file");
		return;
	}
	fwrite(&m_qwmoffset,4,1,fp);
	fclose(fp);
	this->m_hzdraw=TRUE;
	this->m_qwm=QWM;
	this->OnDraw(this->GetDC());
	
	return;
}

void CHzshxpView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	switch(nChar)
	{
	case 0x26:
		if((this->m_qwm&0xff)>0xA1)
			m_qwm--;
		else if((this->m_qwm>>8)>0xa1)
		{
			m_qwm-=0x100;
			m_qwm&=0xff00;
			m_qwm+=0xf7;
		}
		this->OnDraw(this->GetDC());
		break;
		break;
	case 0x28:
		if((this->m_qwm&0xff)>=0xf7)
		{
			if((this->m_qwm>>8)<0xf7)
			{
				this->m_qwm&=0xff00;
				this->m_qwm+=0x1a1;
			}
		}
		else
			this->m_qwm++;
		this->OnDraw(this->GetDC());
		break;
	}
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

//void CHzshxpView::DrawArc8(
void CHzshxpView::DrawLine(int dx,int dy,CDC * pDC)
{

	int e,i,xl=0;
	int d2x,d2y,xd,yd;
	d2x=abs(dx);
	d2y=abs(dy);
	if(dx!=0)
		xd=dx/d2x;
	if(dy!=0)
		yd=dy/d2y;

	if(d2y<=d2x)
	{
		e=-d2x;
		for(i=0;i<d2x;i++)
		{
			//::Sleep(1);
			x0+=xd;
			e+=(2*d2y);
			if(e>=0)
			{
				y0+=yd;
				e-=(2*d2x);
			}
			if(this->m_draw)
				pDC->SetPixel(basex+x0,basey+y0,RGB(255,0,0));
		}
	}
	else
	{
		e=-d2y;
		for(i=0;i<d2y;i++)
		{
			//::Sleep(1);
			y0+=yd;
			e+=(2*d2x);
			if(e>=0)
			{
				x0+=xd;
				e-=(2*d2y);
			}
			if(this->m_draw)
				pDC->SetPixel(basex+x0,basey+y0,RGB(255,0,0));
		}
	}
}/*
			cmd=drawbuf[ptr];
			switch(cmd)
			{
			case 1:
				this->m_draw=TRUE;
				pDC->SetPixel(basex+x0,basey+y0,RGB(255,0,0));
				ptr++;
				break;
			case 2:
				this->m_draw=FALSE;
				ptr++;
				break;
			case 7:
				ptr+=2;
				break;
			case 8:
				ptr++;
				xps=drawbuf[ptr++];
				yps=drawbuf[ptr++];
				xps*=blyz*2;
				yps*=blyz*2;
				DrawLine(xps,-yps,pDC);
				break;
			case 9:
				ptr++;
				xps=drawbuf[ptr++];
				yps=drawbuf[ptr++];
				while(xps!=0||yps!=0)
				{
					xps*=blyz*2;
					yps*=blyz*2;
					DrawLine(xps,-yps,pDC);
					xps=drawbuf[ptr++];
					yps=drawbuf[ptr++];
				}
				break;
			default:
				if((BYTE)cmd>0x0f)
				{
					BYTE opt;
					opt=cmd&0x0f;
					int ll=cmd&0xff;
					ll>>=4;
					switch(opt)
					{
					case 0:
						xps=ll*2;
						yps=0;
						break;
					case 1:
						xps=ll*2;
						yps=ll;
						break;
					case 2:
						xps=ll*2;
						yps=ll*2;
						break;
					case 3:
						xps=ll;
						yps=ll*2;
						break;
					case 4:
						xps=0;
						yps=ll*2;
						break;
					case 5:
						xps=-ll;
						yps=ll*2;
						break;
					case 6:
						xps=-ll*2;
						yps=ll*2;
						break;
					case 7:
						xps=-ll*2;
						yps=ll;
						break;
					case 8:
						xps=-ll*2;
						yps=0;
						break;
					case 9:
						xps=-ll*2;
						yps=-ll;
						break;
					case 10:
						xps=-ll*2;
						yps=-ll*2;
						break;
					case 11:
						xps=-ll;
						yps=-ll*2;
						break;
					case 12:
						xps=0;
						yps=-ll*2;
						break;
					case 13:
						xps=ll;
						yps=-ll*2;
						break;
					case 14:
						xps=ll*2;
						yps=-ll*2;
						break;
					case 15:
						xps=ll*2;
						yps=-ll;
					}
					
					xps*=blyz;
					yps*=blyz*1.5;
					DrawLine(xps,-yps,pDC);
				}
				ptr++;
			}
			*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -