MiniGUI输入法的设计

输入法模块的设计思想

输入法提供了将标准键盘输入翻译为适当语种的文字的能力。MiniGUI 中也包含有标准的中文简体输入法,包括全拼、五笔和智能拼音等等。MiniGUI 的输入法是一个相对独立的模块(称为 IME),它实际是一个特殊的主窗口。该主窗口将在启动之后,首先将自己注册为输入法窗口。这样,MiniGUI 的 desktop 就知道首先要将按键信息发送到这个主窗口之中,而不是当前的活动主窗口。当活动主窗口发生变化时,desktop 会通知输入法窗口当前的活动窗口。这样,当输入法窗口接收到按键消息并且翻译为适当的字符之后,就可以将其发送到当前的活动窗口。

为了实现 desktop 和 IME 窗口之间的交互,MiniGUI 为输入法窗口定义了如下消息,当活动窗口发生变化时,MiniGUI 会向 IME 窗口发送这些消息:

  • MSG_IME_SETTARGET:发送该消息设置输入法的目标活动窗口;
  • MSG_IME_OPEN:发送该消息告诉输入法窗口,当前活动窗口是具有 WS_EX_IMECOMPOSE 扩展风格的窗口,所以应该显示输入法窗口。
  • MSG_IME_CLOSE:发送该消息告诉输入法窗口,当前活动窗口不具有 WS_EX_IMECOMPOSE 扩展风格,所以应该隐藏输入法窗口。

如果一个窗口要成为输入法窗口,则必须完成如下工作:

  1. 注册成为当前输入法;
  2. 处理 MSG_IME_SETTARGE 消息,并记录当前活动目标窗口;
  3. 翻译按键并将翻译后的结构通过 MSG_CHAR 消息发送到当前活动的目标窗口;
  4. 处理 MSG_IME_OPEN 和 MSG_IME_CLOSE 消息,在切换到需要输入法的活动窗口时自动显示输入法窗口。

 

方法:

minigui_thread版,想要启用输入法,就翻看minigui-prog-guide,找到创建IME窗口的GBIMEWindow,函数原型:
    HWND GBIMEWindow(HWND hosting);
    注销IME窗口:
    int GUIAPI UnregisterIMEWindow(HWND hwnd);
    后来发现注销窗口后,实际上是使IME窗口无效,IME窗口还在面板上,所以还需要关闭窗口函数:
    BOOL GUIAPI  DestroyMainWindow(HWND hwnd);
   
    试试,发现有问题,IME窗口一旦建立,会根据屏幕(qvfb模拟)大小来判断自己的位置,比如当qvfb大小为640x480时,IME出现在屏幕的右下脚,但当我把qvfb设置为320x240时,IME却出现在了屏幕下方。这就有可能遮挡住主面板上一些有意义的信息。所以小乌决定改小这个面板。查看/1.6.x/libminigui-1.6.2-linux/src/ime/hzinput.c,找了一会儿,发现其1666行的InitIMEWinCreateInfo函数中,对IME的面板大小进行了定义:
    pCreateInfo->lx = GetGDCapability (HDC_SCREEN, GDCAP_MAXX) - 400; //屏幕宽度 - 400
    pCreateInfo->ty = GetGDCapability (HDC_SCREEN, GDCAP_MAXY) - 80; //屏幕高度 - 80
    pCreateInfo->rx = GetGDCapability (HDC_SCREEN, GDCAP_MAXX); //屏幕宽度
    pCreateInfo->by = GetGDCapability (HDC_SCREEN, GDCAP_MAXY) - 40; //屏幕高度 - 40
    四行分别定义了IME面板的左上脚x,y以及右下脚的x,y。也就是从屏幕右下脚开始,起点坐标为(-400, -80)的长400宽40的一块矩形。
    了解这个了,要定义IME的大小就简单了,爱怎么改怎么改:
    pCreateInfo->lx = 0;
    pCreateInfo->ty = GetGDCapability (HDC_SCREEN, GDCAP_MAXY) - 40;
    pCreateInfo->rx = GetGDCapability (HDC_SCREEN, GDCAP_MAXX) - 150;
    pCreateInfo->by = GetGDCapability (HDC_SCREEN, GDCAP_MAXY);
    因为屏幕为320x240,这样就改成了贴着屏幕左下脚的170x40大小的一块了。

    后来小弟又想在程序中用ctrl键切换ime的显式与关闭(PC机),于是先修改了hzinput.c的1318行的imeIsSpecialKey函数,将ctrl键消息不作处理直接传给宿主面板,如下:
static inline BOOL  (int scancode)
{
   if (scancode == SCANCODE_TAB
           || scancode == SCANCODE_ENTER
           || scancode > SCANCODE_F1
   || scancode == SCANCODE_LEFTCONTROL) //2006.3.22.Added by wuxian
        return TRUE;
}

    然后,将GBIMEWinProc函数1534行对ctrl键的处理屏蔽掉,同时将1534行对SHIFT+CTRL键的处理屏蔽:

// if (wParam == SCANCODE_LEFTCONTROL && clean_left_ctrl ) {
//                toggle_input_method ();
//                InvalidateRect (hWnd, NULL, TRUE);
//}

    最后在宿主面板的回调中对ctrl键进行处理,如下:

    case SCANCODE_LEFTCONTROL:   //left ctrl down, to enable/disable     ime panel.
    ctrl_times ++;
    switch(ctrl_times%2)
     {
       case 0:             //启动ime
         if(ctrl_times != 0)
         {
             ime = GBIMEWindow(hDlg);
             ShowWindow(ime, SW_SHOWNORMAL);          
          }
          break;
        case 1:
          UnregisterIMEWindow(ime);
          DestroyMainWindow (ime);
          break;
     }
     break;

    到这里,ctrl键的确可以显示/关闭ime面板了。
    但,被ctrl键重新启动的ime面板并不能接收asci码的按键消息,也就是说,汉字输入并没有起作用,必须要我用鼠标点击一下宿主面板或者按一下tab键后,才能输入汉字.

    然后我就想了个傻办法, 将上面启动ime的部分改成了这个样子,才真正完全正常了:
  case 0:
  if(ctrl_times != 0)
  {
         HWND focus;
         ime = GBIMEWindow(hDlg);
         ShowWindow(ime, SW_SHOWNORMAL);
         focus = GetFocusChild(hDlg);
         SendMessage(hDlg, MSG_KEYDOWN, SCANC ODE_TAB, 0);
         SetFocusChild(focus);
         tab_times --;
  }

    。。。各位路过的大牛给说说,有必要这么麻烦吗??我有点傻,实在想不到其他办法了。为什么要用鼠标点击一下宿主面板或者按一下tab键后,才能输入汉字呢??看样子象是激活宿主面板的动作。。。

    在改成上面的代码之前,我还试过SetActiveWindow和SetFocus将宿
主面板或ime面板设为active;SetFocusChild设置宿主面板的某控件焦
点;重绘宿主面板或ime面板;以及其他一些尝试。。。。。
    请各位大牛给点破一下我这傻鸟。
    另外,输入法在移植的时候应该注意些什么地方?我在论坛上搜索了一下,好象都是些支离破碎的信息,什么“对齐”之类,哪位做过的大牛给系统的点几个地方?在这里先谢过了。

    后来又发现了这个MSG_DOESNEEDIME。系统发现当前焦点的控件为可编辑时, 该信号被发给了谁?? 那个谁又是怎样处理该消息滴呢??这方面处理的源码在哪个文件里面??
    对此,我们的魏永明哥哥这样说:
    这个消息将被发送到获得焦点的窗口,如果需要 IME,就会激活 IME 窗口,否则隐藏 IME 窗口。
    。。。可是小乌只是想知道这个机制是在哪个.c里面实现的,走过路过的哥哥们一定要给小弟指点一二。万分感谢~!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MiniGUI 用户手册是一本详细介绍 MiniGUI 软件使用方法和功能的手册。MiniGUI 是一个嵌入式图形用户界面开发框架,它提供了丰富的绘图和窗口管理功能,可以实现嵌入式设备上的图形界面显示和交互操作。 用户手册内容包括 MiniGUI 的基本概念和架构,如窗口、控件、绘图等。手册中详细介绍了如何安装和配置 MiniGUI,包括编译和移植 MiniGUI 到不同硬件平台的步骤。用户手册还提供了 MiniGUI 的主要 API 接口的详细说明,包括窗口和控件的创建、显示、隐藏和销毁等操作的函数调用方式和参数说明。 此外,用户手册还包含了一些示例代码,以帮助用户更好地理解 MiniGUI 的使用方法。用户可以通过阅读示例代码,学习如何创建窗口和控件,如何处理用户输入事件,如何绘制图像和文字等。用户手册还提供了一些常见问题的解答和故障排除的方法,帮助用户解决在使用 MiniGUI 过程中可能遇到的问题。 MiniGUI 用户手册对于初学者来说是一个很好的入门指南,它详细介绍了 MiniGUI 的各个方面,帮助用户快速上手并能够独立开发嵌入式图形界面应用。用户可以根据手册的指导,按照自己的需求进行 MiniGUI 的配置和开发,实现自己想要的图形界面效果。总之,MiniGUI 用户手册是理解和使用 MiniGUI 的重要参考资料,对于开发者来说,它是不可或缺的工具。 ### 回答2: Minigui用户手册是一本关于Minigui图形用户界面开发框架的指南。Minigui是一个基于C语言开发的轻量级、可定制的GUI开发工具包。它可以帮助开发者快速构建各种图形界面应用程序。 这本用户手册涵盖了Minigui的各个方面,从安装和配置开始,一直到开发和调试。手册中详细介绍了如何使用Minigui的各种功能和组件,如窗口、按钮、菜单、对话框等,以及使用不同控件实现用户交互。手册还提供了丰富的示例代码和演示,帮助开发者更好地理解和应用Minigui的功能。 此外,手册还介绍了Minigui的特性和优势。它可以运行在各种类型的嵌入式设备上,具有较低的资源占用和快速的响应速度。Minigui还支持跨平台开发,可以在多种操作系统上运行,如Windows、Linux等。它还支持多国语言和字符集,帮助开发者构建全球化的应用程序。 Minigui用户手册不仅提供了技术内容,还对开发过程中的常见问题进行了解答,以及开发者应该遵循的最佳实践和规范。手册的目的是帮助开发者更加高效地利用Minigui进行图形界面开发,提升开发效率,并最大限度地减少错误和调试时间。 总之,Minigui用户手册是Minigui开发框架的一本重要参考资料,它提供了详尽的技术指导和实例代码,帮助开发者快速上手并开发出高质量的图形界面应用程序。无论是初学者还是经验丰富的开发者,都可以从中受益并提升他们的开发技能。 ### 回答3: minigui 用户手册是一本介绍和指导用户如何使用 minigui 软件的手册。minigui 是一个开源的图形用户界面(GUI)开发框架,它提供了丰富的图形界面组件和功能,能够帮助开发人员快速构建跨平台的图形界面应用程序。 minigui 用户手册从基础开始,介绍了 minigui 开发环境的安装和配置方法,以及如何创建和编译一个 minigui 应用程序。接着,手册详细介绍了 minigui 的各种图形界面组件,如窗口、按钮、文本框等,以及它们的使用方法和属性设置。用户可以通过手册学习如何创建和布局这些组件,以及如何响应用户的交互事件。 除了组件的介绍,minigui 用户手册还提供了大量的示例代码和实践案例,让用户可以更好地理解和应用 minigui 的各种功能。手册还解释了 minigui 的一些高级特性,如绘图和图像处理,以及如何与后台服务进行通信,从而帮助用户开发更加复杂和实用的应用程序。 minigui 用户手册还对 minigui 的开发工具和调试方法进行了介绍,帮助用户更好地进行开发和调试工作。手册也提供了一些常见问题和解决方案,以及一些开发经验和技巧,供用户参考。 总而言之,minigui 用户手册是一本全面介绍 minigui 软件的指南,它帮助用户快速入门,掌握 minigui 的使用方法,并通过实践和示例代码提供了更深入的学习和开发体验。无论是初学者还是有经验的开发人员,都可以从 minigui 用户手册中获得帮助和指导,提升图形界面应用程序的开发效率和质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值