C语言二维数组指针下移法,GitHub - Janeiojbk/ZBChineseCharacterSystem: 基于QT的ZB汉字系统,支持输入法和点阵汉字显示...

建议采用大头(Big-Endian)方式。

也就是说,ZB码是常用二字节的8192位其他字符+GB2313的顺序编码

四、设计思路

4.1 图形显示

图形显示采用了虚拟显存技术,定义一个二维数组作为显存,程序通过修改显存达到改变显示的目的,设置定时器通过二维数组以一定频率刷新前端,模拟显示器的电子枪。

这样设计,虽然会使程序占用一些CPU资源,但是可以方便地设计出更多的动画。

4.2 光标显示

在文本编辑器中,光标会以一定频率闪烁来提醒编辑者正在编辑的位置。在本程序中,由于采用了模拟显存与显示器的设计,只需要设计另外一个定时器计数,当计数的值小于某个值时将光标写入显存,大于某个值时不写入显存,超过某个值时,将计数器清零,这样就达到了使得光标在任意位置闪烁的目的。

4.3 光标编辑

文本编辑器中,光标的另一个作用是要在光标对应的位置添加或删除一些字符,在本程序中,通过模拟内存完成,定义一个字符数组表示内存,光标的变化对应着字符数组指针的变化,这样就达到了光标编辑的目的。

4.4 换行

在图形模式下实现文本编辑器的一大难题就是换行的处理,因为换行后光标的位置会有很多变化形式,而光标对应内存中的指针却不会发生特殊变化,这种变化的不一致性造成了编程的复杂。这里就更进一步体现了模拟显存设计的优越性,可以修改译码程序,在对'\n'操作时,将光标下移至下一行行首,这里又涉及到了换页的问题。

4.5 翻页

翻页是通过检测光标的位置是否超过了屏幕的边界实现的,当光标位置超过屏幕边界时,需要将内存指针移动一行的位置,将光标移动回上一行。但这里事实上实现起来是很困难的,原因是内存指针并不知道移动多少才是一行,因为换行符表示的字符是不固定的。这里采用的是重新计算光标位置的方法,也就是说每移动一次内存指针,对光标的位置从屏幕开始进行一次重新计算,也就是说逆向难,就正向重做的思想。

4.6 保存

文本编辑器通过都具有保存文件和打开文件两种功能,而ZB记事本又不同于一般的文本编辑器,额外具有GB和ZB的转码功能。也就是说,我们需要制作四个功能,分别是哲标打开,哲标保存,国标打开,国标保存。这里的思路是首先选定一种2码作为主码,也就是在内存中永远以主码存储,在导入导出中,发生转码操作。

五、关键技术

5.1 虚拟显存

虚拟显存是本编辑器最重要的技术,由于不能调用系统级API完成显示,所以大部分的实现都要自己来完成,比如光标显示、字符输出等,这些都依赖于模拟硬件实现的显存机制。

5.2 跨平台图形模式

哲标记事本使用QT开发,QT是一个跨平台C++图形框架,也就是说该记事本能在全平台编译使用

5.3 ZB码

ZB码是浙江大学楼学庆教授开发的新编码手段,以16位为一字节(zjie)取代8位字节(byte),达到了统一中英文的目的。

六、使用方法

6.1 编译方法

本程序需在QT5.0以上版本编译,建议使用QT Creator进入项目后直接构建

6.2 使用方法

程序的输入法在最下面一栏,进入程序后默认是汉字模式,通过输入拼音,在候选栏中通过输入数字来选择需要的字,+-用来切换候选字列表。

Caps Lock 用于切换大小写

Shift 用于切换中英文

ctrl + ,/./!用于打印标点符号

菜单栏File用于保存/打开文件

上下左右方向键移动光标

七、运行情况

下面的测试是基于macOS进行的,windows也类似,不过背景颜色不一样。

7.1 初始界面

36ff433a73e5d6a131551d62410938eb.png

7.2 拼音输入法

输入拼音

%E6%8B%BC%E9%9F%B3%E8%BE%93%E5%85%A5%E6%B3%95.png

+号向下翻页

24bde63cdcc2ef9507ddd0d739653342.png

-号向上翻页

%E5%87%8F%E5%8F%B7%E5%88%87%E6%8D%A2%E5%9B%9E%E6%9D%A5.png

通过数字选择汉字

43989542c6870f4a0b1128f7ed0423f1.png

如果拼音输入错误

%E5%81%87%E5%A6%82%E8%BE%93%E9%94%99%E4%BA%86%E6%8B%BC%E9%9F%B3.png

可以删除重新输入

%E5%8F%AF%E4%BB%A5%E5%88%A0%E9%99%A4%E9%87%8D%E6%96%B0%E8%BE%93%E5%85%A5.png

效果就是这样

1c83e3c5f985c0b1bc5ebc6920d4ab75.png

7.3 编辑功能

输入四个汉字

1032af86b7345d299d0ec44ff5cf2c17.png

支持多种字符

%E6%94%AF%E6%8C%81%E5%A4%9A%E7%A7%8D%E5%AD%97%E7%AC%A6.png

7.4 光标编辑功能

上移光标

f61f2ec179587541afd2b8d76ed31844.png

左移光标

%E5%B7%A6%E7%A7%BB%E5%85%89%E6%A0%87.png

可以通过光标在任意位置编辑

%E5%85%89%E6%A0%87%E5%8D%B3%E6%97%B6%E7%BC%96%E8%BE%91.png

7.5 自动翻页

我们任意编辑,当超过一页的大小时就会自动翻页

%E6%94%AF%E6%8C%81%E8%87%AA%E5%8A%A8%E7%BF%BB%E9%A1%B5.png

通过移动光标,就能向上翻页

%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%E7%A7%BB%E5%8A%A8%E5%85%89%E6%A0%87%E5%86%8D%E7%A7%BB%E5%8A%A8%E5%9B%9E%E5%8E%BB.png

注意这里拼音输入法是支持模糊搜索的

b623ce78154fc764fa2f1ebd04ec2e97.png

所以达到了任意位置,任意编辑的效果

f25b33512011ee935910c3a173c970aa.png

7.6 ZB与GB的文件操作

首先将刚刚编辑好的内容以ZB码存文件

ZB%E5%AD%98%E5%82%A8.png

然后关闭程序,以ZB方式打开刚刚存好的文件

%E4%BB%A5ZB%E6%89%93%E5%BC%80.png

我们发现内容是一致的

%E5%86%8D%E6%AC%A1%E6%89%93%E5%BC%80.png

接下来以GB方式存文件

%E5%9B%BD%E6%A0%87%E5%AD%98%E5%82%A8.png

再以GB方式打开

%E5%9B%BD%E6%A0%87%E6%89%93%E5%BC%80.png

内容也是一致的

%E5%BE%97%E5%88%B0%E5%8E%9F%E5%A7%8B%E6%96%87%E4%BB%B6.png

下一页的内容也没有丢失

%E6%9C%80%E5%90%8E%E7%9A%84%E4%BF%A1%E6%81%AF%E4%B9%9F%E6%9C%89.png

这是菜单栏的样子

%E8%8F%9C%E5%8D%95%E6%A0%8F.png

八、总结展望

ZB记事本通过使用ZB码和ZB字库输出点阵汉字,而完成一个比较完善的程序,需要的工作量还是挺大的。在这个大程中,体会最深的就是计算机底层知识的重要性。假如我没有修过计原,我就不会知道显示的原理,本程序使用的虚拟显存这一关键技术也就不会被想到,而且码的译码和转换也与课程紧密相连了。

这学期的计原就要结束了,给我最大的收获就是计算机底层的理解,其次是C语言位运算和一些底层操作的更加熟练的掌握,还有一些大型项目的编程经验。

希望以后能多修一些底层的课,来掌握更多原理性的知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值