📄 hzshxpview.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 + -