打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
傻改minigui输入法

傻改minigui输入法

(2006-03-24 17:20:13)

分类: 傻话连篇
    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里面实现的,走过路过的哥哥们一定要给小弟指点一二。万分感谢~!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
改进minigui1.3.3的输入法窗口,增加虚拟键盘| Linux交流区
[AHK]双击shift将输入法切换成中文状态
注册表键盘替换按键映射Scancode Map
用Photoshop通道调出美女别样肤色
基于Video4Linux 的USB摄像头
How To Create lParam Of SendMessage WM_KEYDOWN
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服