软键盘设计的实现(TP900掌机)

简介: 软键盘设计的实现(TP900掌机)

一个项目需要。需要在2天时间里在振中掌机上添加一个软键盘,用于输入掌机本身不支持的字符。

接到这个任务后,便开始构思怎么实现,毕竟软键盘的显示与切换没有一个好的算法,用起来会有很多的问题。思来想去,最后确定了方案,开始着手实现。

关于代码的实现思想

其实实现起来不是很难,字符的输入与显示便是ASCII码,只要把ASCII码按照自己想要排列的键盘样式编好数组,然后通过上下左右键实现不同ASCII码的选择与切换即可。

关于数组实现

因为我这次是基于振中掌机去做的软键盘,所以选用了振中掌机的zzdBase语言进行编写。
下面是构造了一个简单的ASCII码数组:

    ASCData{1,1} = 126
    ASCData{2,1} = 33
    ASCData{3,1} = 64
    ASCData{4,1} = 35
    ASCData{5,1} = 36
    ASCData{6,1} = 37
    ASCData{7,1} = 94
    ASCData{8,1} = 38
    ASCData{9,1} = 44
    ASCData{10,1} = 92
    ASCData{11,1} = 61
    ASCData{12,1} = 60
    ASCData{13,1} = 62
    ASCData{14,1} = 63
    ASCData{15,1} = 91
    ASCData{16,1} = 93
    ASCData{17,1} = 123
    ASCData{18,1} = 125
    ASCData{19,1} = 95
    ASCData{20,1} = 124
    ASCData{21,1} = 96
    ASCData{22,1} = 39
    ASCData{23,1} = 32
    ASCData{24,1} = 34
    ASCData{25,1} = 59
    ASCData{26,1} = 58
    ASCData{27,1} = 0

这个码表显示的是我挑选的需要用来输入的字符,共27个字符,组成了3行 x 9列的键盘阵列。最后一个字符的ASCII码为0代表空字符。
下图为完成后的键盘阵列显示。
image.png

有了数组编好了,那么该如何显示呢,这就需要考虑阵列的显示算法了。

阵列显示算法

阵列显示主要思想便是在第一行显示前9个字符,按顺序显示,第2行显示第10~18个字符,最后一行显示第19-27个字符。因为我要把键盘显示在屏幕的第7-第9行,所以我的首行设为7。
下面是显示码表源代码。

Procedure 显示ASCII码表

    clear 7,3
    
    SET INTENSITY ON    
    @7,0 say SPACE(20)
    @8,0 say SPACE(20)
    @9,0 say SPACE(20)
    /* 绘制坐标 */
    LINE 0,111,159,111
    LINE 0,110,159,110
    LINE 0,109,159,109
    LINE 0,108,159,108
    LINE 0,107,159,107
    LINE 0,106,159,106
    i=1
    Do While i <= 27
        L1 = ASCData{i,1}
        
        if i<=9 .AND. i>=1
            L2 = i*2-1    
            IF i = INDEX
                SET INTENSITY OFF  // 设置屏幕反显 白色高亮选中
                @7,L2+1   say CHR(L1)
                SET INTENSITY ON  // 恢复屏幕常显 黑色等待选中
                @7,L2 say SPACE(1)
            Else
                SET INTENSITY ON        
                @7,L2+1   say CHR(L1)
                @7,L2 say SPACE(1)
            EndIf    
        EndIf
        if i<=18 .AND. i>=10
            L2 = (i-9)*2-1
            IF i = INDEX
                SET INTENSITY OFF
                @8,L2+1   say CHR(L1)
                SET INTENSITY ON    
                @8,L2 say SPACE(1)    
            Else
                SET INTENSITY ON        
                @8,L2+1   say CHR(L1)
                @8,L2 say SPACE(1)    
            EndIf
        EndIf
        if i<=27 .AND. i>=19
            L2 = (i-18)*2-1
            IF i = INDEX
                SET INTENSITY OFF  
                @9,L2+1   say CHR(L1)
                SET INTENSITY ON
                @9,L2 say SPACE(1)    
            Else
                SET INTENSITY ON        
                @9,L2+1   say CHR(L1)
                @9,L2 say SPACE(1)                
            EndIf    
        EndIf
        i=i+1
    EndDo
    SET INTENSITY OFF
        
return
Endpro

这个还是比较好实现的。
在完成显示之后,下面要做的便是如何通过上下左右键改变选用的数组索引,并实时刷新键盘显示。

键盘显示刷新

因为我排列好了键盘,因此只需要做到在键盘上按下“上”键时,索引-9,按下“左”键时,索引-1,同样按下“右”键索引+1,按下“下”键索引+9,但是要考虑索引越界的情况,当按“上”键索引-9之后,如果索引小于零,此时应+27保证索引变为最后一行的对应列。

下面是详细代码。

Procedure 软键盘输入

    INDEX = 1          /* 数组索引,默认选择第一个,即“~” */
    
    Do 显示ASCII码表
    
    Do while .T.
        
        Wait "" To HitKey

        if Asc(HitKey) = 11 && 左移
            INDEXTEM = INDEX    // 索引暂存缓冲
            INDEX = INDEX - 1
            if INDEX < 1
                INDEX = 27
            EndIf
        EndIf
        if Asc(HitKey) = 12 && 右移
            INDEXTEM = INDEX
            INDEX = INDEX + 1
            if INDEX > 27
                INDEX = 1
            EndIf
        EndIf
        if Asc(HitKey) = 14 && 下
            INDEXTEM = INDEX
            INDEX = INDEX + 9
            if INDEX > 27
                INDEX = INDEX - 27
            EndIf
        EndIf    
        if Asc(HitKey) = 17 && 上
            INDEXTEM = INDEX
            INDEX = INDEX - 9
            if INDEX < 1
                INDEX = INDEX + 27
            EndIf
        EndIf
        
        
        if INDEX>=1 .AND. INDEX <=9   // 新的选中的键 坐标索引
            L3 = 7
            L2 = INDEX*2
        EndIf
        if INDEX>=10 .AND. INDEX <=18
            L3 = 8
            L2 = (INDEX-9)*2
        EndIf
        if INDEX>=19 .AND. INDEX <=27
            L3 = 9
            L2 = (INDEX-18)*2
        EndIf
        
        if INDEXTEM>=1 .AND. INDEXTEM <=9 //上一个选中的键索引
            L4 = 7
            L5 = INDEXTEM*2
        EndIf
        if INDEXTEM>=10 .AND. INDEXTEM <=18
            L4 = 8
            L5 = (INDEXTEM-9)*2
        EndIf
        if INDEXTEM>=19 .AND. INDEXTEM <=27
            L4 = 9
            L5 = (INDEXTEM-18)*2
        EndIf
        
        L1 = ASCData{INDEXTEM,1}
        L9 = ASCData{INDEX,1}
        
        SET INTENSITY OFF         // 刷新新键键盘显示 
        @L3,L2   say CHR(L9)  
        SET INTENSITY ON    
        @L4,L5   say CHR(L1)  // 刷新上一个键键盘显示
        SET INTENSITY OFF
        
        //以上为键盘刷新,以下为应用层操作
        if Asc(HitKey) = 13 && 确认
            i=1
            Do while i < 33
                L3 = TempString32{i,1}
                if L3 = 0
                    TempString32{i,1} = ASCData{INDEX,1}    
                    Do 刷新APN
                    Exit
                endif
                i=i+1
            Enddo
        EndIf
        if Asc(HitKey) = 92 .or. Asc(HitKey) = 24    
            clear 7,3
            Exit
        EndIf
        if Asc(HitKey) = 8  && 删除 
            i=1
            Do while i < 33
                L3 = TempString32{i,1}
                if L3 = 0
                    TempString32{i-1,1} = 0    
                    Do 刷新APN 
                    Exit
                endif
                i=i+1
            Enddo
        EndIf
    EndDo
return
Endpro

上面便是基于振中掌机实现的软键盘的核心代码,使用它的时候配合自己的应用层程序,可以在需要软键盘的时候调用,不需要的时候关闭,方便高效。

写在后面

其实最开始是想用C语言去做这个事情,但是用C写到一半的时候,发现ASCII码在设置大数组的时候,有些符号会当做特殊字符编译,很是烦人。

比如我设置一个字符串数组

ASCII[] = {'A',''','!'};

我想显示三个字符分别为“A”,“ ’”,和“!”。但是编译的时候就会报出在第二个字符单引号的时候编译出错。

所以为了不必要的麻烦,改用了zzdBASE语言。

但后来一想,其实完全可以用ASCII源码代替字符显示,没必要这样,但是既然选择了ZZDbase语言,就用了。相较与c语言,zzdbase语言有一个优点在于代码写起来更容易理解,读起来也更顺畅。因为没有没有指针的概念,所以有些地方实现起来是有困难,但是总体代码流畅度更高。当然c的可发挥空间更大,两者相比见仁见智吧,适合项目的就是最好的,你觉得呢?

相关文章
|
10月前
|
弹性计算 运维 安全
阿里云服务器ECS有什么特点和优势?六大核心特性2026年分享
阿里云ECS是性能卓越、弹性可伸缩的IaaS云计算服务,免去硬件采购,实现计算资源即开即用。支持多种架构与场景,具备弹性扩缩、高可用、高安全、易运维等优势,灵活计费助力降本增效,全面满足企业多样化业务需求。
430 3
|
存储 安全 API
73_安全配置:LLM开发环境的全面防护指南
在2025年的AI开发环境中,大型语言模型(LLM)已成为核心技术,但伴随其广泛应用的是日益严峻的安全挑战。据统计,2025年第一季度发生的AI安全事件中,LLM环境配置不当导致的漏洞占比高达43%,造成的损失超过2.1亿美元。本文将深入探讨LLM开发环境的安全配置最佳实践,帮助开发者构建一个安全、可靠的开发环境。
1045 0
|
存储 监控 前端开发
如何开发项目管理系统中的合同管理板块?(附架构图+流程图+代码参考)
合同管理是项目管理系统中的核心模块,涵盖合同生命周期、审批流程、履行监控及变更处理。通过数字化、自动化手段,提升管理效率,降低风险,确保合规性。本文详解合同管理模块的设计与开发,包括功能实现、业务流程及技术应用,助力企业构建高效管理系统。
|
机器学习/深度学习 数据可视化 数据安全/隐私保护
抖音留痕脚本,快手小红书微博,自动留痕插件工具
就是用autojs写的一个自动化工具脚本,其实写了好几天,感觉有点价值就分享出来吧 核心代码实现
|
机器学习/深度学习 运维 自然语言处理
智绘运维:深度学习赋能知识图谱建设
智绘运维:深度学习赋能知识图谱建设
647 20
|
负载均衡 网络协议 数据库
ENSP中RIP动态路由协议(原理和配置)
`RIP (Routing Information Protocol)` 是一种距离矢量动态路由协议,用于路由器之间交换网络可达性信息。它基于跳数作为度量标准来衡量到达目的地的距离,最常用于小型网络。RIP有以下关键特点: 1. **实现网络互通**:路由器通过RIP学习彼此的路由信息,构建完整的路由表。 2. **动态更新**:路由器周期性广播其路由表,以应对网络拓扑变化。 3. **负载均衡**:RIPv2支持负载均衡,可根据链路负载选择最佳路径。 4. **简单配置**:适用于小型网络,配置和管理相对简单。 5. **成本效益**:作为免费协议,降低了网络部署和维护成本。
1299 0
ENSP中RIP动态路由协议(原理和配置)
|
机器学习/深度学习 算法 数据可视化
UniApp手机滑块验证组件代码生成器
UniApp手机滑块验证组件代码生成器
1637 1
|
存储 人工智能 文件存储
云栖速递,面向大规模数据智能的阿里云存储创新
云栖速递:面向大规模数据智能的阿里云存储创新
2335 2
云栖速递,面向大规模数据智能的阿里云存储创新
|
Java 测试技术 开发者
探究 Spring Boot 的核心:IOC 和 AOP
Spring Boot 作为一种简化 Spring 应用开发的工具,继承了 Spring 框架的核心概念,其中最重要的是控制反转(IOC)和面向切面编程(AOP)。它们是 Spring 框架的基础,同时也深深植根于 Spring Boot 中。本文将讨论 IOC 和 AOP 的概念以及它们在 Spring Boot 中的应用。
986 4