📄 childview.cpp
字号:
// 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 + -