软键盘设计的实现(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的可发挥空间更大,两者相比见仁见智吧,适合项目的就是最好的,你觉得呢?

相关文章
|
XML 安全 IDE
【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全
【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全
3280 2
|
7月前
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
286 35
|
传感器 数据采集 物联网
探索.NET nanoFramework:为嵌入式设备编程的新途径
探索.NET nanoFramework:为嵌入式设备编程的新途
524 7
|
9月前
|
人工智能 物联网 测试技术
FireRedASR:精准识别普通话、方言和歌曲歌词!小红书开源工业级自动语音识别模型
小红书开源的工业级自动语音识别模型,支持普通话、中文方言和英语,采用 Encoder-Adapter-LLM 和 AED 架构,实现 SOTA 性能。
3113 17
FireRedASR:精准识别普通话、方言和歌曲歌词!小红书开源工业级自动语音识别模型
|
Python
Python实用记录(十六):PyQt/PySide6联动VSCode便捷操作指南
本文提供了一份详细的PySide6与VSCode联动的操作指南,包括安装配置VSCode、安装必要的扩展、配置扩展以及编辑和运行PySide6项目。文中还提到了相关工具如uic.exe、rcc.exe和designer.exe的用途,并提供了进一步学习的资源。
1901 1
Python实用记录(十六):PyQt/PySide6联动VSCode便捷操作指南
|
机器学习/深度学习 监控 自动驾驶
卷积神经网络有什么应用场景
【10月更文挑战第23天】卷积神经网络有什么应用场景
1903 2
|
API C# 数据库
SemanticKernel/C#:实现接口,接入本地嵌入模型
SemanticKernel/C#:实现接口,接入本地嵌入模型
269 1
|
网络架构
微信公众平台开发(10)--接收并回复用户消息(被动回复)
本文目录 1. 用户消息的类型 2. 消息路由器与消息处理器 3. 接受并回复消息 4. 发送方与接收方 5. 小结
1033 0
|
安全 数据安全/隐私保护 虚拟化
不使用VMTools,宿主机与虚拟机交换文件的方法(接上章)(上)
VMTool虽然方便,但毕竟是专用于虚拟机的软件,将要封装的系统不安装VMTools,易导致一些琐碎问题。下面我给大家介绍一个最常用的宿主机与虚拟机交换文件的方法,当然,比VMTools繁琐,但绝不影响系统封装。
781 0
不使用VMTools,宿主机与虚拟机交换文件的方法(接上章)(上)
|
编解码 算法 Linux
Linux系统中如何使用tslib库实现触摸功能
大家好,今天主要和大家聊一聊,如何使用tslib库来完成对应的功能。
1696 1
Linux系统中如何使用tslib库实现触摸功能