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

📄 childview.cpp

📁 Sunplus DVD 字体文件查看修改工具,只针对Font_ori.c文件!使用方便,可以编译成支持Unicode的软件!
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ChildView.cpp : implementation of the CChildView class
//

#include "stdafx.h"
#include "TFont.h"
#include "ChildView.h"
#include "ShowMsg.h"
#include "FontEdit.h"
#include "FontFill.h"
#include "dlgSetup.h"
#include "Mainfrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define TEMP_FILE_NAME		_T("fnt.anz")
#include "Normal.h"
//=================================================================================================
//	部分声明
//=================================================================================================
//#define ALECK_DEBUG

//	缓冲行大小
#define MAX_BUFFER_LEN			256

//	最大标识符号长度
#define MAX_NAME_LEN			64

//	最大字符串长度
#define MAX_STRING_LEN			256

//	读取缓冲
BYTE m_Buffer[MAX_BUFFER_LEN + 1] = {0};

//	表格数
#define MAX_FONT_TABLE			4

//	每个表格字符数
#define MAX_CHAR_NUM			256

//	最大滚动值
#define MAX_SCROLL_POS			100L
//	列
BYTE m_col = 16;

//	行
BYTE m_row = 16;

//	空隙
BYTE m_side = 14;

//	当前字符阵列(指针的地址)
BYTE **m_CurArray = NULL;

//	当前位置(计算当前位置)
RECT m_CurRect;

//	当前序号
UINT m_CurIndex = 0;

//	空格
BYTE m_spc = 3;

//	字符表格序号
BYTE id_fnt = 0;

//	字符表
BYTE *arr_tbl[MAX_FONT_TABLE][MAX_CHAR_NUM];

//	字符名称表
CStringArray sFnt[MAX_FONT_TABLE];

// 字体数组(默认的数据)
BYTE **p_fnt = (BYTE **)arr_tbl[0];

//	表格宽度
UINT p_Grid_W = 32 + 16 + 10;

//	表格高度
UINT p_Grid_H = 24 + 16;

//=================================================================================================
//=	通用函数说明说明(!)
//=================================================================================================
//	绘制字体
void DrawFont(CDC *dc,UINT cx,UINT cy,UINT cw,UINT ch,ULONG co,BYTE *arr);

//	绘制字符表
void DrawFontTable(CDC *dc,UINT cx,UINT cy,BYTE **arr);

//	读取文件字符
int ReadFileChar(FILE *vfp);

//	从行缓冲读取字符
int ReadLineBuffer(FILE *vfp,BYTE vBuffer[],int vBufferCount);

//	读取缓冲字符,过滤掉注释部分
int ReadBuffChar(FILE *vfp,BYTE vBuffer[],int vBufferCount);

//	保存数据到文件
BYTE DoSaveToFile(CString &FileName);

//=================================================================================================
//	构造函数	
//=================================================================================================
CChildView::CChildView()
{
	int i,j;
	
	this->m_MapX = this->m_MapY = 0;
	this->m_Font = NULL;

	for(i = 0 ; i < MAX_FONT_TABLE; i++)
	{
		for(j = 0;j < MAX_CHAR_NUM; j++)
		{
			arr_tbl[i][j] = NULL;
		}
		sFnt[i].SetSize(MAX_CHAR_NUM);
	}
}

//=================================================================================================
//	构造函数	
//=================================================================================================
CChildView::~CChildView()
{

}

BEGIN_MESSAGE_MAP(CChildView,CWnd )

	//{{AFX_MSG_MAP(CChildView)

	//-------------------------------------------
	ON_WM_PAINT()

	//-------------------------------------------
	ON_WM_VSCROLL()
	ON_WM_HSCROLL()
	
	//-------------------------------------------
	ON_WM_DESTROY()
	ON_WM_SIZE()
	ON_WM_MOUSEMOVE()
	ON_WM_INITMENU()
	ON_WM_LBUTTONDBLCLK()
	
	//-------------------------------------------
	ON_WM_RBUTTONDOWN()
	ON_WM_LBUTTONDOWN()
	
	//-------------------------------------------
	ON_COMMAND(IDM_FILE_OPEN,	OnFileOpen)
	ON_COMMAND(IDM_FILE_SAVE,	OnFileSave)
	ON_COMMAND(IDM_FILE_SAVEAS, OnFileSaveas)

	//-------------------------------------------
	ON_COMMAND(IDM_EDIT_COPY,	OnEditCopy)
	ON_COMMAND(IDM_EDIT_CUT,	OnEditCut)
	ON_COMMAND(IDM_EDIT_PASTE,	OnEditPaste)

	ON_COMMAND(IDM_EDIT_DELET,	OnEditDelete)
	ON_COMMAND(IDM_EDIT_INSERT, OnEditInsert)

	ON_COMMAND(IDM_EDIT_FILL,	OnEditFill)
	ON_COMMAND(IDM_EDIT_PROPERTY, OnEditProperty)
	
	//-------------------------------------------
	ON_COMMAND(IDM_FONT_1,		OnFont1)
	ON_COMMAND(IDM_FONT_2,		OnFont2)
	ON_COMMAND(IDM_FONT_3,		OnFont3)
	ON_COMMAND(IDM_FONT_4,		OnFont4)
	
	//-------------------------------------------
	ON_COMMAND(IDM_VIEW_SETUP, OnViewSetup)

	//}}AFX_MSG_MAP
	
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CChildView message handlers

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (!CWnd::PreCreateWindow(cs))
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1),NULL);

	return TRUE;
}

//=================================================================================================
//	刷新显示
//=================================================================================================
void CChildView::OnPaint() 
{
	CPaintDC dc(this);

	//	绘制字符表格
	DrawFontTable(&dc,m_MapX,m_MapY,p_fnt);
}

//=================================================================================================
//	绘制字符表
//=================================================================================================
#define BACK_GOUND_COLOR		0xffffff

void DrawFontTable(CDC *dc,UINT cx,UINT cy,BYTE **arr)
{
	static int i,j;
	static int sx,sy;
	static int sw,sh;
	static int WinW;
	static int WinH;
	static RECT r;
	CString str;
	CSize Textsz;

	//	取得可见范围
	CSize sz = dc->GetViewportExt();

	WinW = sz.cx ;
	WinH = sz.cy;

	sx  = cx;		//	表格起始
	sy  = cy;		//	表格起始
	sw  = p_Grid_W;	//	表格宽度
	sh  = p_Grid_H;	//	表格高度

	//	保存以前的数据
	CFont *pOldFont = NULL;
	CFont oFont;

	//	创建字体,显示下标题
	oFont.CreateFont(13,0,0,0,0,0,0,0,0,0,0,0,0,_T(""));

	//	装入字体
	CFont *oldFont = dc->SelectObject(&oFont);

	//	计算行列
	m_row = MAX_CHAR_NUM / m_col;

	int bound_x;
	int bound_y;
	int bound_w;
	int bound_h;

	bound_x = sx - m_spc;
	bound_y = sy - m_spc;

	bound_w = m_col * sw + m_spc * 2;
	bound_h = m_row * sh + m_spc * 2;

	//	填写四周范围
	dc->FillSolidRect(bound_x,bound_y,bound_w,m_spc ,BACK_GOUND_COLOR);
	dc->FillSolidRect(bound_x,bound_y,m_spc,bound_h ,BACK_GOUND_COLOR);

	//	下边和右边
	dc->FillSolidRect(bound_x + bound_w - m_spc ,bound_y ,m_spc * 4,bound_h ,BACK_GOUND_COLOR);
	dc->FillSolidRect(bound_x , bound_y + bound_h - m_spc,bound_w ,m_spc * 4 ,BACK_GOUND_COLOR);

	//	十六行
	for(i = 0; i< m_row; i ++ )
	{
		//	意思
		dc->FillSolidRect(sx,sy + (i + 1) * sh -  m_side, m_col * sw ,m_side,pvBackColor);

		//	十六列
		if(sy + i * sh + sh > 0 /*|| sy + i * sh < WinH*/)
		{
			for( j = 0 ; j < m_col; j ++)
			{
				if(/*sx + j * sw < WinW ||*/ sx + j * sw + sw > 0 )
				{					
					//	绘制
					if(sFnt[id_fnt][i * m_col + j] != _T("encoding_tbx_space"))
					{
						DrawFont(dc,sx + j * sw + 1,sy + i * sh + 1,sw,sh - 15,pvFontColor,arr[i * m_col + j]);
					}
					//	边框
					dc->Draw3dRect(sx + j * sw,sy + i * sh,sw,sh,pvBackColor,pvBackColor);

					//	字符序号
					str.Format(_T("%02X-%03d"),i * m_col + j,i * m_row + j);

					//	取得字符大小
					Textsz = dc->GetTextExtent(str);

					//	显示字符
					dc->TextOut(sx + j * sw + 1,sy + i * sh + sh - Textsz.cy  ,str);
				}
			}
		}
	}
	dc->SelectObject(oldFont);
}

//=================================================================================================
//	打开字体文件
//=================================================================================================
void CChildView::OnFileOpen() 
{
	//	打开文件
	CFileDialog dlg(TRUE,_T("c"),_T("font.c"),
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		_T("Font C File (*.c)|*.c|Any File (*.*)|*.*|"),this);
	
	//	显示窗口
	CdlgShowMsg winShow(this);

	//	显示的字符
	CString sShow;

	//	输入输出位置
	FILE *fpin;
	FILE *fpout;

	static unsigned int c;
	static unsigned int i = 0;
	static unsigned int j = 0;
	static unsigned int iOk = 0;

	//	临时字符
	CString cWord;

	//	字符表格号
	int idFont = 0;

	//	字符表格项目号(也就是字的编号)
	int idItem = 0;

	//	字符数据
	int idData = 0;

	//	大括号计数器
	int iLevel = 0;

	//	临时保存字符数据前三个值
	int d[3];
	int iLoad = LOAD_STEP_DONE;
	int iSize = 0;

	//	打开文件对话框.
	iOk = dlg.DoModal();

	//	如果用户取消,就退出
	if(iOk == 0 )
		return ;

	//	数据初始化
	fpin = fpout = NULL;

	if(dlg.GetFileName() == _T(""))
		return;

	m_SavePathName = dlg.GetPathName();

	//	打开用户文件
	fpin = _tfopen(m_SavePathName,_T("rb"));

	//	是否打开成功?
	if(!fpin)
	{
#ifdef ALECK_USE_CHINESE
		this->MessageBox(_T("打开文件错误!\n"),_T("打开失败!"));
#else
		this->MessageBox(_T("Open file error!\n"),_T("Open failed!"));
#endif
		return;
	}
	else
	{
		TRACE(_T("打开文件[%s]成功!\n"),this->m_SavePathName);
	}

	//	打开写入文件
	fpout = _tfopen(TEMP_FILE_NAME,_T("wb+"));

	if(!fpout)
	{
#ifdef ALECK_USE_CHINESE
		this->MessageBox(_T("打开文件[") TEMP_FILE_NAME _T("]错误!\n"),_T("打开失败!"));
#else
		this->MessageBox(_T("Open file [") TEMP_FILE_NAME _T("] Error!\n"),_T("Error!"));
#endif
		fclose(fpin);
		return;
	}
	else
	{
		TRACE(_T("打开文件[") TEMP_FILE_NAME _T("]成功!\n"));
	}

	//	等待状态
	this->BeginWaitCursor();

	//	显示状态
	winShow.Create(IDD_MESSAGE_WIN,this);
	winShow.ShowWindow(SW_SHOW);

	//	显示当前进度
#ifdef ALECK_USE_CHINESE
	winShow.SetDlgItemText(IDC_STATIC,_T("请稍候\n(1).正在过滤注释符号,并生成中间文件...\n"));
#else
	winShow.SetDlgItemText(IDC_STATIC,_T("Watting\n(1).Make an anlyzing file...\n"));
#endif
	//------------------------------------------------------------------------------
	//	循环处理,过滤注释信息
	//------------------------------------------------------------------------------
	while(!feof(fpin))
	{
		//	数据有效才写入到临时文件中!
		while(c = ReadBuffChar(fpin,m_Buffer,MAX_BUFFER_LEN))
		{
			fputc(c,fpout);
		}
	}

	//	关闭文件
	fclose(fpout);
	fclose(fpin);

	winShow.GetDlgItemText(IDC_STATIC,sShow);
#ifdef ALECK_USE_CHINESE
	sShow.Append(_T("(2).正在初始化内存...\n"));
#else
	sShow.Append(_T("(2).Initlization ran memory...\n"));
#endif
	winShow.SetDlgItemText(IDC_STATIC,sShow);

	//	临时文件已经生成,再次打开临时文件分析数组
	fpin = _tfopen(TEMP_FILE_NAME,_T("rb"));
	if(!fpin)
	{
#ifdef ALECK_USE_CHINESE
		this->MessageBox(_T("打开文件[") TEMP_FILE_NAME _T("]错误!\n"),_T("打开失败!"));
#else
		this->MessageBox(_T("Open temp file [") TEMP_FILE_NAME _T("] error!\n"),_T("Error!"));
#endif
		return;
	}

	//	清除以前的数据
	for(i = 0 ; i < MAX_FONT_TABLE; i++)
	{
		//	清表格
		if(sFnt[i].GetCount() > 0)
			sFnt[i].RemoveAll();

		//	清楚全部已经分配的数据
		for(j = 0;j < MAX_CHAR_NUM; j++)
		{
			//	清数据
			if(arr_tbl[i][j] != NULL)
			{
				free(arr_tbl[i][j]);
				arr_tbl[i][j] = NULL;
			}
		}
	}
	
	winShow.GetDlgItemText(IDC_STATIC,sShow);

#ifdef ALECK_USE_CHINESE
	sShow.Append(_T("(3).正在创建数组名表....\n"));
#else
	sShow.Append(_T("(3).Making array and names tables....\n"));
#endif
	winShow.SetDlgItemText(IDC_STATIC,sShow);

	//------------------------------------------------------------------------------
	//	读入数据,建立字符名称表
	//------------------------------------------------------------------------------
	idFont = -1;
	iLevel = 0;

	while(!feof(fpin))
	{
		//	查找单词
		cWord = FindWord(fpin);

		//	查找括号,当前级别
		if(cWord.Compare(_T("{")) == 0)	
		{	
			iLevel ++;	
			continue;
		}
		else if(cWord.Compare(_T("}")) == 0)	
		{	
			iLevel --;
			continue;
		}
		//	收集数据阵列名称
		else if(cWord.Find(_T("encoding"),0) == 0)
		{
			//	验证字体数组是否有效?
			if((idFont % MAX_FONT_TABLE) != idFont)
			{
				TRACE(_T("idFont Error! idFont = %d\n"),idFont);
			}
			else if(iLevel == 1 && sFnt[idFont].GetCount() < MAX_CHAR_NUM)
			{
				sFnt[idFont].Add(cWord);
#ifdef ALECK_DEBUG
				TRACE(_T("FontArray[%d].Add(%s)\n"),idFont,cWord);
#endif
			}
			else
			{
#ifdef ALECK_DEBUG
				TRACE(_T("Find Word:[%s]\n"),cWord);
#endif
			}
		}
		//	收集阵列名称.
		else if(cWord.Find(_T("fn_table"),0) == 0)
		{
			if(iLevel == 0 && idFont < (MAX_FONT_TABLE - 1))
			{
				idFont ++;
			}
			else
			{
#ifdef ALECK_DEBUG
				TRACE(_T("[%s]\n->\n"),cWord);
#endif
			}
		}
	}

	//	累计
	int iAllCount = 0;

	// 字体表格
	for(i = 0; i < MAX_FONT_TABLE; i ++)
	{
		//	累计数据
		iAllCount += sFnt[i].GetCount();

		TRACE(_T("==> Font[%d].Count()=%d\n"),i,sFnt[i].GetCount());
	}

	//	没有此数据,就退出
	if (iAllCount == 0 || idFont < 0)
	{
		winShow.GetDlgItemText(IDC_STATIC,sShow);
#ifdef ALECK_USE_CHINESE
		sShow.Append(_T("(4).文件中没有字体数据....\n分析中止!\n"));
#else
		sShow.Append(_T("(4).File has not Font data....\nDone!\n"));
#endif
		winShow.SetDlgItemText(IDC_STATIC,sShow);

		this->Invalidate(TRUE);
		this->EndWaitCursor();
		
		winShow.ShowWindow(SW_HIDE);
		
#ifdef ALECK_USE_CHINESE
		winShow.MessageBox(_T("抱歉:文件中没有字体数据,或者字体格式错误,请选择正确的(Sunplus Font)字体文件!"),_T("提示"),MB_ICONSTOP|MB_OK);
#else
		winShow.MessageBox(_T("Sorry:File is not Sunplus font file or file has some error!"),_T("Warring"),MB_ICONSTOP|MB_OK);
#endif
		winShow.ShowWindow(SW_HIDE);
		winShow.DestroyWindow();
		return;
	}

	winShow.GetDlgItemText(IDC_STATIC,sShow);

⌨️ 快捷键说明

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