📄 normal.cpp
字号:
#include "stdafx.h"
#include "normal.h"
//=================================================================================================
// 转换字符为数据
//=================================================================================================
int StringToInt(CString &s)
{
static int iRet = 0;
static int i = 2;
static int c = 0;
iRet = 0;
c = 0;
i = 2;
if(s[0] != '0')
return 0;
if(s[1] != 'X' && s[1] != 'x')
return 0;
for(i = 2; (i < (2 + 4) && i < s.GetLength()); i++)
{
c = s[i];
iRet <<= 4;
iRet |= CheckCharVal(c);
}
return iRet;
}
//=================================================================================================
// 字符的值
//=================================================================================================
int CheckCharVal(int c)
{
if(c >= '0' && c<= '9') return c-'0';
else if(c >= 'a' && c<= 'z') return c-'a'+10;
else if(c >= 'A' && c<= 'Z') return c-'A'+10;
else return 0;
}
int IsHexChar(int c)
{
if(c >= '0' && c<= '9') return 1;
else if(c >= 'a' && c<= 'z') return 1;
else if(c >= 'A' && c<= 'Z') return 1;
else return 0;
}
//=================================================================================================
// 查找字符
//=================================================================================================
int FindItem(CStringArray &arr,CString &s)
{
static int i = 0;
for(i = 0;i < arr.GetSize();i ++)
{
if(s.Compare(arr[i]) == 0)
return i;
}
return (-1);
}
//=================================================================================================
// 是否十六进位数
//=================================================================================================
BYTE IsHexData(CString &pString)
{
static int i = 2;
static int c = 0;
c = 0;
i = 2;
if(pString[0] != '0' || (pString[1] != 'x' && pString[1] != 'X'))
return 0;
while(i < pString.GetLength())
{
c = pString[i];
if(c >= 'a' && c <= 'z')
{
}
else if(c >= 'A' && c <= 'Z')
{
}
else if(c >= '0' && c <= '9')
{
}
else if(c)
{
return 0;
}
i ++;
}
return 1;
}
//=================================================================================================
// 查找字符
//=================================================================================================
CString FindWord(FILE *vfp)
{
CString ret;
static int iFndStep;
static BYTE ch;
iFndStep = FND_STEP_FIRST;
ch = fgetc(vfp);
while(!feof(vfp) && iFndStep != FND_STEP_END)
{
if(ch >= '0' && ch <= '9')
{
iFndStep = FND_STEP_ADD_CHAR;
}
else if(ch >='a' && ch <= 'z')
{
iFndStep = FND_STEP_ADD_CHAR;
}
else if(ch >='A' && ch <= 'Z')
{
iFndStep = FND_STEP_ADD_CHAR;
}
else if(ch == '_')
{
iFndStep = FND_STEP_ADD_CHAR;
}
else
{
if(iFndStep == FND_STEP_ADD_CHAR)
{
iFndStep = FND_STEP_END;
}
else
{
switch(ch)
{
case '{': case '}':
case ';': case ':':
case '[': case ']':
// 找到符号马上返回
iFndStep = FND_STEP_SIGN;
ret += ch;
return ret;
default:
break;
}
}
}
// 当前字符无效,查找下一个
if(iFndStep == FND_STEP_FIRST)
{
ch = fgetc(vfp);
}
// 当前字符有效,急需查看下一个
else if (iFndStep == FND_STEP_ADD_CHAR)
{
ret += ch;
ch = fgetc(vfp);
}
}
return ret;
}
//=================================================================================================
// 读取文件字符
//=================================================================================================
int ReadFileChar(FILE *vfp)
{
static int flag = FLAG_NORMAL;
static int c = 0;
static int prev_c = 0;
// 保留上次的
if(flag == FLAG_PREV_CHAR)
{
flag = FLAG_NORMAL;
return c;
}
if (feof(vfp))
return 0;
// 读字符
prev_c = c;
c = fgetc(vfp);
// 单引号模式处理
if(flag == FLAG_SINGLE_DOT)
{
if(c == '\'')
flag = FLAG_NORMAL;
}
// 双引号模式处理
else if(flag == FLAG_DOUBLE_DOT)
{
if(c == '"')
flag = FLAG_NORMAL;
}
// 单引号模式开始
else if(c == '\'')
{
flag = FLAG_SINGLE_DOT;
}
// 双引号模式开始
else if(c == '"')
{
flag = FLAG_DOUBLE_DOT;
}
// 是否是注释?
else if (c == '/')
{
prev_c = c;
c = fgetc(vfp);
// 段注释处理
if(prev_c == '/' && c == '*')
{
prev_c = c;
c = fgetc(vfp);
do
{
prev_c = c;
c = fgetc(vfp);
}
while(!feof(vfp) && !(prev_c == '*' && c == '/'));
if(!feof(vfp))
{
prev_c = c;
c = fgetc(vfp);
}
else
{
c = 0;
}
}// 行注释处理
else if(prev_c == '/' && c == '/')
{
do
{
prev_c = c;
c = fgetc(vfp);
}while(!feof(vfp) && (c != '\n' && c!='\r'));
}
else
{
// 并非注释,保留到下次返回!
flag = FLAG_PREV_CHAR;
return prev_c;
}
}
return c;
}
//================================================================================
// 读取缓冲行 (过滤掉注释代码,连接换行标志代码!)
//================================================================================
int ReadLineBuffer(FILE *vfp,BYTE vBuffer[],int vBufferCount)
{
static int iLevel = 0;
static int iPrevLevel = 0;
static int iSpaceCount = 0;
static int iFirstChar = 0;
static int prev_c = 0;
static int iLastSpaceLine = 0;
static int flag = FLAG_NORMAL;
static int i = 0;
static int c = 0;
labReRead:
i = iSpaceCount = iFirstChar = 0;
// 添加空格
while(i < iLevel && i < vBufferCount)
vBuffer[i++] = '\t';
// 前面的等级
iPrevLevel = iLevel;
// 没有结束!
while(!feof(vfp))
{
prev_c = c;
c = ReadFileChar(vfp);
// 读写制表符号
if(c == '\t')
c = ' ';
if(flag == FLAG_NORMAL)
{
if((c == ' ' || c == '\t') &&
(prev_c == ' ' ||
prev_c == '\t'||
prev_c == ',' ||
prev_c == '=' ||
prev_c == '~' ||
prev_c == '^' ||
prev_c == '#' ||
prev_c == '+' ||
prev_c == '-' ||
prev_c == '*' ||
prev_c == '%' ||
prev_c == '>' ||
prev_c == '<' ||
prev_c == '|' ||
prev_c == '!' ||
prev_c == '&' ||
prev_c == ';' ||
prev_c == ':' ||
prev_c == '[' ||
prev_c == ']' ||
prev_c == '(' ||
prev_c == ')'))
continue;
}
if(!feof(vfp) && i < vBufferCount)
vBuffer[i++] = c;
if(feof(vfp))
{
break;
}
else if(i >= vBufferCount)
{
break;
}
else if(c == '\n')
{
break;
}
else if(flag == FLAG_SINGLE_DOT)
{
if(c == '\'') flag = FLAG_NORMAL;
}
else if(flag == FLAG_DOUBLE_DOT)
{
if(c == '"') flag = FLAG_NORMAL;
}
else if(c == '\'')
{
flag = FLAG_SINGLE_DOT;
}
else if(c == '"')
{
flag = FLAG_DOUBLE_DOT;
}
else if(c == '{' && iLevel < 100)
{
iLevel++;
}
else if(c == '}' && iLevel > 0)
{
iLevel--;
}
}
// 结尾符号
vBuffer[i] = 0;
// 缩进调整
if(iPrevLevel > iLevel && iLevel >= 0)
{
int j = 0, k = 0;
for(j = iLevel,k = iPrevLevel ;k <= i;j++,k++)
vBuffer[j] = vBuffer[k];
}
if(!feof(vfp))
{
// 过滤空行和
while((vBuffer[iSpaceCount] == ' ' || vBuffer[iSpaceCount] == '\t'))
iSpaceCount++;
// 是否是空行
if((vBuffer[iSpaceCount] == '\r'|| vBuffer[iSpaceCount] == '\n'))
{
// 空行累计
iLastSpaceLine ++;
// 连续空行多就过滤
if ( iLastSpaceLine > 1)
goto labReRead;
}
else
{
// 没有空行
iLastSpaceLine = 0;
}
}
return i;
}
//================================================================================
// 读取缓冲字符
//================================================================================
int ReadBuffChar(FILE *vfp,BYTE vBuffer[],int vBufferCount)
{
static int ip = 0;
// 缓冲处理
if(vBuffer[ip] == 0 || ip >= vBufferCount)
{
// 文件没有结束就读出一行!
if(!feof(vfp))
{
ReadLineBuffer(vfp,vBuffer,vBufferCount);
ip = 0;
}
}
return vBuffer[ip++];
}
//=================================================================================================
// 绘制字体阵列
//=================================================================================================
// dc ->绘制窗口
// x,y ->左上交坐标
// w,h ->大小 为0时就只有
// co ->默认字体颜色
//
#define BACKGROUND_COLOR (0xffffff)
void DrawFont(CDC *dc,UINT cx,UINT cy,UINT cw,UINT ch,ULONG co,BYTE *arr)
{
static unsigned int x = 0;
static unsigned int y = 0;
static unsigned int c = 0;
static unsigned int font_h = 0;
static unsigned int font_w = 0;
// 设备无效!
if(!dc)
return;
// 无效阵列就退出!
if(!arr)
{
// 有大小就填充,高度宽度为零就退出
if(ch|cw)
{
dc->FillSolidRect(cx,cy,cw,ch,BACKGROUND_COLOR);
}
return;
}
// 创建兼容环境位图
CDC oCompactDC,*pCompactDC;
CBitmap oBmp;
// 取得基本信息
font_w = arr[0];
font_h = arr[1];
// 无效数据就忽略.
if((font_w | font_h ) == 0)
return;
// 创建兼容位图
oCompactDC.CreateCompatibleDC(dc);
pCompactDC = &oCompactDC;
// 没有指定大小就使用字体默认大小
if((cw|ch) == 0)
{
cw = font_w;
ch = font_h;
}
// 创建兼容位图
oBmp.CreateCompatibleBitmap(dc,cw,ch);
// 装入数据
pCompactDC->SelectObject(&oBmp);
pCompactDC->FillSolidRect(0,0,cw,ch,BACKGROUND_COLOR);
for(y = 0; y < font_h; y++)
{
for(x = 0; x < font_w; x++)
{
c = arr[3 + (y * font_w + x) / 8 ];
if(c & (0x80 >> ((y * font_w + x) % 8)))
{
pCompactDC->SetPixel( x, y, co);
}
}
}
//dc->Rectangle(cx-1,cy-1,cx+cw+1,cy+ch+1);
// 绘制字符边框
dc->BitBlt(cx,cy,cw,ch,pCompactDC,0,0,SRCCOPY);
dc->Draw3dRect(cx - 1,cy - 1, font_w +2, font_h+2,pvBackColor,pvBackColor);
// 删除位图对象
oBmp.DeleteObject();
// 删除显示设备环境
pCompactDC->DeleteDC();
}
//=================================================================================================
// 检查菜单
//=================================================================================================
void CheckMenuItem(WORD idMenuArray[],BYTE idMax,BYTE id,CMenu *pMenu)
{
int i;
if(!pMenu)
return;
for(i = 0; i< idMax; i++)
{
pMenu->CheckMenuItem(idMenuArray[i],(i == id)?(MF_CHECKED | MF_BYCOMMAND):(MF_UNCHECKED | MF_BYCOMMAND));
}
}
//=================================================================================================
//= 字符串转换 "Aleck \xff \d01234" -> "Aleck ? ?"
//=================================================================================================
CString MakeFormatString(CString src)
{
int ch,i,j;
CString s;
CString dst;
for(i = 0; i < src.GetLength();i++)
{
ch = src[i];
if((ch == '\\') && (src[i+1] == 'x'|| src[i+1] == 'X'))
{
j = 2;
s = _T("");
while(IsHexChar(ch = src[i+j]))
{
s.AppendChar(ch);
j ++;
}
i += s.GetLength() + 1;
s = _T("0x") + s;
ch = StringToInt(s);
dst.AppendFormat(_T("%c"),ch & 0xff);
}
else
{
dst.AppendFormat(_T("%c"),ch & 0xff);
}
}
TRACE(_T("\n%s\n\n"),dst);
return dst;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -