📄 全屏幕编辑软件的编写(c语言)02.txt
字号:
coord() /* 显示标尺行 */
{
int i,j,k,g;
g=m*BP; /* 本屏行首列号 */
y=yy-g; /* 计算 y */
k=(enq-g>ZS+1)?ZS+1:enq-g; /* 排版宽度处列坐标 */
for(i=1;i<=ZS+1;i++) { /* 自左至右显示标尺 */
j=(i<=k)?0x04:0x01; /* 排版行宽度内用红色,否则用蓝色 */
((i+g)%5==0)?write_char(H2,i-1,'|',j):write_char(H2,i-1,'-',j);
/* 逢 5 显示“|”,其余显示“-” */
}
g=(y<k) ? 0x50 : 0x30; /* 确定标尺光标色彩 */
((yy+1)%5==0)?write_char(H2,y,'|',g):write_char(H2,y,'-',g);
/* 显示标尺光标 */
}
xh() /* 在信息行显示当前行序、列、行数值 */
{
char sl[8],sh[8],sz[8];
itoa(yy+1,sl,10); /* 变列号数值为字符串 */
ltoa(xx+1,sh,10); /* 变行号数值为字符串 */
ltoa(ser+1,sz,10); /* 变字序号数值为字符串 */
write_string(H1,8,"序: 行: 列: ",0x05);
write_string(H1,12,sz,0x07); /* 显示字序号 */
write_string(H1,24,sh,0x07); /* 显示行号 */
write_string(H1,35,sl,0x07); /* 显示列号 */
}
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 下一页
int string_lingth() /* 计算除回车换行符外的当前行长 */
{
int g;
g=strlen(ss[ss_x]); /* 测当前行字符串总长 */
if(ss[ss_x][g-1]==0x0A) g-=2; /* 去除回车换行符的长度 */
return g; /* 返回计算值 */
}
Enter() /* 输入回车 */
{
int g,k;
chg=1; /* 文件已修改标志置为真 */
if(!ins) { /* 如为非插入状态 */
g=string_lingth(); /* 计算当前行长(不包括回车换行符) */
strcpy(ss[ss_x]+g,da); /* 字符串以硬回车换行符结尾 */
if(xx==ttl_x) { /* 如是文末行,下移一行 */
fp_rd++; /* fp 已读出行最大行号加 1 */
ttl_x++; /* 文末行行号加 1 */
ss_max++; /* 编辑数组实用最大行号加 1 */
}
if(m==0 && g<ZS) write_char(x,FH,'<',CHAR_COLOR);
/* 如行尾在 0 屏,显示硬回车标志 */
ss_x++; xx++; /* 数组行号和文本行号均加 1 */
ser+=g-yy+2; /* 计算字序数 */
if(ss_x>ss_max) tj(); /* 如下行超出编辑数组最大行号,
从 fp2 或 fp 读入一部分 */
if(x<H3) { /* 如不是屏幕底行 */
if(m) { /* 如不是 0 屏 */
m=0;
disp_t(); /* 显示 0 屏各行 */
}
x++; /* 屏幕光标下移一行 */
}
else { /* 如是屏幕最下行 */
if(!m) { /* 如原在 0 屏,则滚屏 */
roll_scr_up(0,H3); /* 向上滚屏 */
disp(ss_x,x); /* 当前坐标补显一行 */
}
else { /* 如原不在 0 屏 */
m=0; /* 显示 0 屏 */
disp_t();
}
}
}
else { /* 如为插入状态 */
g=m; /* 保存原屏号 */
k=x; /* 保存原屏幕行坐标 */
intercept(yy); /* 从当前光标处折断字符串 */
strcpy(ss[ss_x-1]+yy,da); /* 折断处加硬回车换行符 */
if(!g) { /* 如原在 0 屏 */
if(k<H3) roll_scr_down(x,H3); /* 不在屏底行,本行起下滚 */
else roll_scr_up(0,H3); /* 在屏底行,全屏上滚 */
disp(ss_x-1,x-1); /* 重显原行(上一行) */
disp(ss_x,x); /* 显示当前行 */
}
else disp_t(); /* 如原不在 0 屏,重显一屏 */
}
yy=0; /* 光标至行首 */
}
Del() /* 退格键、删字键处理 */
{
int i,k;
k=x; /* 保存原行坐标 */
chg=1; /* 文件已修改标志置为真 */
switch(delc()) { /* 删字,根据返回值判断 */
case 0: /* 如返回 0 */
disp(ss_x,x); /* 重显当前行 */
break; /* 跳出开关语句 */
case 1: /* 如返回 1 */
disp_t(); /* 重显一屏 */
break; /* 跳出开关语句 */
case 2: /* 如返回 2 */
if(x>0) --x; /* 如不在屏幕最上行,光标上移一行 */
comput(); /* 计算参数 */
if(m) disp_t(); /* 如不在 0 屏,重显一屏 */
else { /* 如在 0 屏 */
if(k) { /* 如原不在屏顶行 */
roll_scr_up(k,H3); /* 自当前行起滚屏 */
i=H3-x; /* 屏幕最下行与当前行间行数 */
if(xx+i<=ttl_x) /* 如最下行还有,显示此行 */
disp(ss_x+i,H3);
}
disp(ss_x,x); /* 显示当前行 */
}
break; /* 跳出开关语句 */
}
}
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 下一页
int delc() /* 删字,如在行首,将本行接在上行尾 */
{
int i,g,k=0;
for(;;) { /* 为全角字符设的循环 */
if(y>0) { /* 如不在本屏行首 */
if(xx==ksx && yy<=ksy) ksy--; /* 如在块首行,并在块首前,计算块首列号 */
if(xx==kwx && yy<=kwy) kwy--; /* 如在块尾行,并在块尾前,计算块尾列号 */
dks(); /* 如块首、块尾重合, 块标志置 1 */
strcpy(ss[ss_x]+yy-1,ss[ss_x]+yy);
/* 光标处起字符串前移一格,覆盖光标前一字符 */
y--; yy--; /* 前移一字节 */
ser--; /* 字序号减 1 */
if(vs(yy-1)==0) { /* 如不在全角前半字 */
if(!k) return 0; /* 如在屏幕最左列,返回 0 */
else return 1; /* 否则返回 1 */
}
}
else { /* 如在屏幕最左列 */
if(m) { /* 如不为 0 屏 */
m--; /* 退到前一屏 */
y=yy-m*BP; /* 光标到屏中,并前移一字 */
k=1; /* 标志置 1 */
}
else { /* 如为 0 屏 */
if(ss_x+(i=H3-x)>=ss_max && xx+i<ttl_x)
tj(); /* 如屏幕最下行超出数组,但未到文末,从fp2或fp读入Q3行 */
if(xx) { /* 如不在文首行 */
g=strlen(ss[ss_x]); /* 测行长 */
ss_x--; /* 至上一行 */
yy=string_lingth(); /* 定光标于上行尾处 */
if(g+yy>HC-4) { /* 如两行相接后超长 */
write_prompt(3); /* 提示超长 */
yy=0; /* 恢复原行列号 */
ss_x++; /* 回原行 */
return -1; /* 退出,返回 -1 */
}
if(xx<=ksx) { /* 如在块首行或之前 */
if(xx==ksx) ksy+=yy; /* 如在块首行 */
ksx--; /* 块首行行号减 1 */
}
if(xx<=kwx) { /* 如在块尾行或之前 */
if(xx==kwx) kwy+=yy; /* 如在块尾行 */
kwx--; /* 块尾行行号减 1 */
}
dks(); /* 如块首、块尾重合, 块标志置 1 */
xx--; /* 文本当前行改为上行 */
strcpy(ss[ss_x]+yy,ss[ss_x+1]); /* 将下行拷至本行尾回车符前 */
ser-=2; /* 字序数减少回车符的两位 */
movbk(ss_x+1,1); /* 数组后续各行前移,覆盖原行 */
ttl_x--; /* 文末行行号减 1 */
fp_rd--; /* fp 已读出行最大行号减 1 */
ss_max--; /* 数组实用最大行号减 1 */
return 2; /* 返回 2 */
}
else return 0; /* 如在文首行,返回 0 */
}
}
}
}
int vs(int a) /* 计算行首至 a 列全角字节数,返回奇偶值 */
{
int i,j;
j=0; /* 全角字节数,初值为 0 */
for(i=0;i<=a;i++)
if(ss[ss_x][i]>0xA0) j++; /* 统计全角字节数 */
return(j%2); /* 返回奇偶值 */
}
orien() /* 重定光标列号 */
{
int g;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -