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

📄 dianzhendlg.cpp

📁 点阵汉字显示软件, 源码 当前针式打印机采用24针进行字符打印
💻 CPP
📖 第 1 页 / 共 3 页
字号:

//将字节数组用十六进制表示,并存入在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 + -