📄 dianzhendlg.cpp
字号:
//将字节数组用十六进制表示,并存入在CString类中
void CDianzhenDlg::GetStr16FromByteArr(byte buf[DZ_NUM],CString& str)
{
char temp[8];
for(int i=0;i<DZ_NUM;i++)
{
if(i == DZ_NUM - 1)
{
sprintf(temp,"0x%02X",buf[i]);
}
else
{
sprintf(temp,"0x%02X,",buf[i]);
}
str += temp;
if(i % 3 == 2)
str += '\n';
}
}
//将一个十六进制的字符转为一个相应的整数
int CDianzhenDlg::getIntByChar(char c)
{
int temp;
if(c>='0' && c<='9')
temp = atoi(&c);
else
{
switch(c)
{
case 'A':
case 'a':
temp = 10;
break;
case 'B':
case 'b':
temp = 11;
break;
case 'C':
case 'c':
temp = 12;
break;
case 'D':
case 'd':
temp = 13;
break;
case 'E':
case 'e':
temp = 14;
break;
case 'F':
case 'f':
temp = 15;
break;
default:
temp = 0;
break;
}
}
return temp;
}
//在位置(x,y)处开始显示字符点阵的排列形式
void CDianzhenDlg::FontDisPlay(int x,int y,byte *buf,CDC *dc,
int len,CBrush& dotBrush,CBrush& noDotBrush,int isColScan)
{
byte cmp_w[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
int c;
if(isColScan==1)//按行方式输出24*24点阵字符
{
int left1,left2,left3;
for(int row=0;row<24;row++)
{
left1=left2=left3=0;
int top = x + row * len;
for(c=0;c<8;c++)
{
left1 = y + c*len;
if((buf[row*3]&cmp_w[c])!=0)
{
dc->SelectObject(dotBrush);
}
else
{
dc->SelectObject(noDotBrush);
}
DrawDot(dc,left1,top,left1+len,top+len,m_dotType);
}
left1+=len;
for(c=0;c<8;c++)
{
left2 = left1 + c*len;
if((buf[row*3+1]&cmp_w[c])!=0)
{
dc->SelectObject(dotBrush);
}
else
{
dc->SelectObject(noDotBrush);
}
DrawDot(dc,left2,top,left2+len,top+len,m_dotType);
}
left2+=len;
for(c=0;c<8;c++)
{
left3 = left2 + c*len;
if((buf[row*3+2]&cmp_w[c])!=0)
{
dc->SelectObject(dotBrush);
}
else
{
dc->SelectObject(noDotBrush);
}
DrawDot(dc,left3,top,left3+len,top+len,m_dotType);
}
}
}
else//按列方式输出24*24点阵字符
{
int top1,top2,top3;
for(int col=0;col<24;col++)
{
top1=top2=top3=0;
int left = y + col * len;
for(c=0;c<8;c++)
{
top1 = x + c*len;
if((buf[col*3]&cmp_w[c])!=0)
{
dc->SelectObject(dotBrush);
}
else
{
dc->SelectObject(noDotBrush);
}
DrawDot(dc,left,top1,left+len,top1+len,m_dotType);
}
top1+=len;
for(c=0;c<8;c++)
{
top2 = top1 + c*len;
if((buf[col*3+1]&cmp_w[c])!=0)
{
dc->SelectObject(dotBrush);
}
else
{
dc->SelectObject(noDotBrush);
}
DrawDot(dc,left,top2,left+len,top2+len,m_dotType);
}
top2+=len;
for(c=0;c<8;c++)
{
top3 = top2 + c*len;
if((buf[col*3+2]&cmp_w[c])!=0)
{
dc->SelectObject(dotBrush);
}
else
{
dc->SelectObject(noDotBrush);
}
DrawDot(dc,left,top3,left+len,top3+len,m_dotType);
}
}
}
}
int CDianzhenDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) | WS_MINIMIZEBOX);
// TODO: Add your specialized creation code here
return 0;
}
//显示一页
void CDianzhenDlg::FontArrDisPlay(int x,int y,byte bufArr[PAGENUM][DZ_NUM],CDC *dc,
int len,COLORREF& dotCol,COLORREF& notDotCol,int isColScan)
{
for(int i=0;i<PAGENUM;i++)
{
//调用SmallFontdisplay来打印出一个点阵字符
SmallFontDislpay(x,y,bufArr[i],dc,1,dotCol,notDotCol,isColScan);
y = y + 25;
if(i % ROWNUM == (ROWNUM - 1))
{
x = x + 25;
y = y - 25 * ROWNUM;
}
}
}
//打印出一个字
void CDianzhenDlg::SmallFontDislpay(int x,int y,byte* buf,CDC *dc,
int len,COLORREF& dotCol,COLORREF& notDotCol,int isColScan)
{
byte cmp_w[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
int c;
if(isColScan == 0)//列扫描方式
{
int top1,top2,top3;
for(int col=0;col<24;col++)
{
top1=top2=top3=0;
int left = y + col * len;
for(c=0;c<8;c++)
{
top1 = x + c*len;
if((buf[col*3]&cmp_w[c])!=0)
{
dc->SetPixel(CPoint(left,top1),dotCol);
}
else
{
dc->SetPixel(CPoint(left,top1),notDotCol);
}
}
top1+=len;
for(c=0;c<8;c++)
{
top2 = top1 + c*len;
if((buf[col*3+1]&cmp_w[c])!=0)
{
dc->SetPixel(CPoint(left,top2),dotCol);
}
else
{
dc->SetPixel(CPoint(left,top2),notDotCol);
}
}
top2+=len;
for(c=0;c<8;c++)
{
top3 = top2 + c*len;
if((buf[col*3+2]&cmp_w[c])!=0)
{
dc->SetPixel(CPoint(left,top3),dotCol);
}
else
{
dc->SetPixel(CPoint(left,top3),notDotCol);
}
}
}
}
else//行扫描方式
{
int left1,left2,left3;
for(int row=0;row<24;row++)
{
left1=left2=left3=0;
int top = x + row * len;
for(c=0;c<8;c++)
{
left1 = y + c*len;
if((buf[row*3]&cmp_w[c])!=0)
{
dc->SetPixel(CPoint(left1,top),dotCol);
}
else
{
dc->SetPixel(CPoint(left1,top),notDotCol);
}
}
left1+=len;
for(c=0;c<8;c++)
{
left2 = left1 + c*len;
if((buf[row*3+1]&cmp_w[c])!=0)
{
dc->SetPixel(CPoint(left2,top),dotCol);
}
else
{
dc->SetPixel(CPoint(left2,top),notDotCol);
}
}
left2+=len;
for(c=0;c<8;c++)
{
left3 = left2 + c*len;
if((buf[row*3+2]&cmp_w[c])!=0)
{
dc->SetPixel(CPoint(left3,top),dotCol);
}
else
{
dc->SetPixel(CPoint(left3,top),notDotCol);
}
}
}
}
}
//将列方式扫描的点阵转换为行方式扫描的点阵
void CDianzhenDlg::FromColtoRow(const byte *srcBuf,byte *destBuf)
{
//方法1:
byte cmp_w[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
int num = 0;
for(int i = 0;i<3;i++)
{
for(int j = 0;j<8;j++)
{
for(int k = 0;k<24;k++)
{
if(srcBuf[i+3*k]&cmp_w[j])
{
destBuf[num] |= cmp_w[k%8];
}
if(k % 8 == 7)
{
num++ ;
}
}
}
}
}
//根据页面索引显示一页
void CDianzhenDlg::PrintPage(int pageIndex)
{
memset(m_bufArr,0,sizeof(m_bufArr));
fseek(m_pFile,DZ_NUM*pageIndex*PAGENUM,SEEK_SET);
fread(m_bufArr,1,DZ_NUM*PAGENUM,m_pFile);
/**************利用双缓冲技术来显示页面***************/
//创建兼容DC
CDC memDC;
memDC.CreateCompatibleDC(GetDC());
//设置内存绘制区域
CBitmap pageFace;
pageFace.CreateCompatibleBitmap(GetDC(),ROWNUM * 25+1,COLNUM * 25+1);
memDC.SelectObject(&pageFace);
//在内存区域上绘制图象
FontArrDisPlay(1, 1, m_bufArr,&memDC,1,m_dotColor,m_ndotColor,m_scanType);
//将内存图解拷贝到显示位置上
GetDC()->BitBlt(X_PAGE_START - 6 ,Y_PAGE_START + 4,ROWNUM * 25+1,COLNUM * 25+1,&memDC,0,0,SRCCOPY);
}
//右键弹出关于窗口
void CDianzhenDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CAboutDlg dlgAbout;
dlgAbout.DoModal();
CDialog::OnRButtonDown(nFlags, point);
}
//重定的OnOK虚函数
void CDianzhenDlg::OnOK()
{
if(GetFocus()==GetDlgItem(IDC_EDIT_CODE))
{
OnBtnSelect2();
}
if(GetFocus()==GetDlgItem(IDC_EDIT_PAGE))
{
OnBtnPage();
}
}
//重写的OnCancel虚函数
void CDianzhenDlg::OnCancel()
{
if(IDOK == AfxMessageBox("是否结束应用程序?",MB_OKCANCEL))
{
CDialog::OnCancel();
}
}
//此函数来自于打印机驱动程序,用来取得四字节字符的偏移位置
unsigned short CDianzhenDlg::FourBytePro(unsigned short c1,unsigned short c2,unsigned short c3,unsigned short c4)
{
unsigned short code=0x20;
if(c1==0x81){
if(c2==0x39&&c3>=0xee)
code=((c3-0xee)*10+c4-0x30)+(0xf8-0x81)*192-9;
}
else{
code=(c2-0x30)*1260+(c3-0x81)*10+(c4-0x30);
if(code<FOUR_82_2_POS)
code=code+(0xf8-0x81)*192+161;
else if(code<FOUR_82_3_POS)
code=(0xab-0x81)*192+(code-FOUR_82_2_POS+0xa1-0x40);
else if(code<FOUR_82_4_POS)
code=(0xac-0x81)*192+(code-FOUR_82_3_POS+0xa1-0x40);
else if(code<FOUR_END_POS)
code=(0xad-0x81)*192+(code-FOUR_82_4_POS+0xa1-0x40);
else{
code=0x20;
}
}
return code;
}
//全屏显示当前选定字符
void CDianzhenDlg::OnBtnFscreen()
{
fsDlg.Create(IDD_DLG_FSCREEN);
CRect rect;
fsDlg.GetWindowRect(rect);
FontDisPlay((rect.left-rect.top)/2,rect.top,m_buf,fsDlg.GetDC(),rect.Height()/24,m_dotBrush,m_notDotBrush,m_scanType);
}
//列扫描
void CDianzhenDlg::OnColscan()
{
if(m_scanType == 0)
{
return;
}
else
{
m_scanType=0;
PrintPage(m_numPage);
SmallFontDislpay(m_xpos, m_ypos, m_buf,GetDC(),1,m_ndotColor,m_dotColor,m_scanType);
FontDisPlay(X_START, Y_START, m_buf,GetDC(),m_dotSize,m_dotBrush,m_notDotBrush,m_scanType);
}
}
//行扫描
void CDianzhenDlg::OnRowscan()
{
// TODO: Add your control notification handler code here
if(m_scanType == 1)
{
return;
}
else
{
m_scanType=1;
PrintPage(m_numPage);
SmallFontDislpay(m_xpos, m_ypos, m_buf,GetDC(),1,m_ndotColor,m_dotColor,m_scanType);
FontDisPlay(X_START, Y_START, m_buf,GetDC(),m_dotSize,m_dotBrush,m_notDotBrush,m_scanType);
}
}
//用圆表示点
void CDianzhenDlg::OnDotCircle()
{
if(m_dotType == 0)
{
return;
}
else
{
m_dotType = 0;
FontDisPlay(X_START, Y_START, m_buf,GetDC(),m_dotSize,m_dotBrush,m_notDotBrush,m_scanType);
}
}
//用方块表示点
void CDianzhenDlg::OnDotSquare()
{
if(m_dotType == 1)
{
return;
}
else
{
m_dotType = 1;
FontDisPlay(X_START, Y_START, m_buf,GetDC(),m_dotSize,m_dotBrush,m_notDotBrush,m_scanType);
}
}
//根据dotType来选择输出点的形状
void CDianzhenDlg::DrawDot(CDC *pdc,int left,int top,int right,int bottom,int dotType)
{
if(dotType == 0)
{
pdc->FillRect(CRect(left,top,right,bottom),CBrush::FromHandle(m_notDotBrush));
pdc->Ellipse(left,top,right,bottom);
return;
}
if(dotType == 1)
{
pdc->Rectangle(left,top,right,bottom);
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -