OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18192|回复: 54

<EmWin 终结遍> 像Andorid一样 弹出键盘

[复制链接]

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
发表于 2018-3-24 11:41:26 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 wlq390934605 于 2018-3-24 15:16 编辑

<EmWin 终结篇> 像Andorid一样 弹出键盘;
;
没事, 来刷刷存在感;
;
原子, 火哥, 安富莱的键盘 ,都需要在每个控件元素的位置, 添加调用方式, 从表面上看再正常, 但真要干大事, 还真能累死一头牛;
;
然后呢, 偶然中发现一个网站 <尼奇光电> : http://www.neqee.com/list/?10_1.html(原子哥请不要删链, 此处不是打广告);
;
竟然可以在每类控件的未尾, 只调用一次. 没有错就是一次, 但注意, 是每一类, 而不是每个界面;
;
不过也好, 这样的话, 每个界面就只需要两个添加段, 省事又省工;
;
不说了, 下一楼继讲, 讲多了, 人家用手机看麻烦;

最佳答案

查看完整内容[请看2#楼]

有人可能要问, 像安卓一样, 什么才叫像Android 一样;; 既然要像Android 一样, 自然是不能有任何的添加, 改变, 也就是GUI builder 生成一个文件, 不动它, 粘贴进来, 也无需标识头文件, 引用; ; 只要EmWin 打开那个新生成的界面, 点击它, (注: 一定是可编辑的, 如: Edit, MultiEdit; 目前只有两种), 就弹键盘出来, 而且还要快, 100ms 以内; ;既然这个贴, 叫键盘终结篇,那自然就有他的道理, 首先从功能上来说; ; 支持, 数字, 符 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-4-9 18:03:36 | 显示全部楼层
本帖最后由 wlq390934605 于 2018-4-9 18:17 编辑

这层发测试源码,  VS2012, EMWIN528, 测试版键盘自动弹出, 自动识别控件源码;;
百度盘: 链接:https://pan.baidu.com/s/1Q3mwV4XNY0EGKH7tNRUyAQ 密码:4qks
;
528源码 为旧版, 由于大家用的都是528 以下的版本, 所以就没有把540的新版源码发上来了, 所有以528的源码也有一点BUG, 必须切换焦点才能在同一个输入框弹出, 540版修复了此BUG, 540 将退出焦点移至了键盘, 并隐藏输入源的方法, 完美解决输入焦点不能重复的问题, 虽然用的是旁门左道手法, 但是很有效; 如果有人想这样, 可以自已改;
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 11:41:27 | 显示全部楼层
本帖最后由 wlq390934605 于 2018-3-24 20:35 编辑

有人可能要问, 像安卓一样, 什么才叫像Android 一样;;
既然要像Android 一样, 自然是不能有任何的添加, 改变, 也就是GUI builder 生成一个文件, 不动它, 粘贴进来, 也无需标识头文件, 引用;
;
只要EmWin 打开那个新生成的界面, 点击它, (注: 一定是可编辑的, 如: Edit, MultiEdit; 目前只有两种), 就弹键盘出来, 而且还要快, 100ms 以内;
;既然这个贴, 叫键盘终结篇,那自然就有他的道理, 首先从功能上来说;
;
支持, 数字, 符号, 拼音输入法, 大小写, 还能合理的弹出在输入框的周围, 不用左边点一下, 然后右边操作一下;
;
最关键, 还不用改代码, 粘贴进来即可, 手点屏幕就能直接弹出, 自动判定所点窗口的类型, 位置, 大小等等一堆;
;
先上一个可以在 Window 下直接运行的演示小工具, 直接解压即可运行, 让大家感受感受, 但注意这个并非最高版, 以前弄出来的;
;


GUISimulationDebug.zip

496.63 KB, 下载次数: 772

回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:49:55 | 显示全部楼层
本帖最后由 wlq390934605 于 2018-3-26 13:15 编辑

今天有几分钟空闲;;
继续更, 继续更吧;
;
那就先说一下, 原版的下地址: http://www.neqee.com/content/?226.html;  
emWin 2天速成实例教程012_基于STM32单片机的全键盘中文汉字拼音输入法;

;

原版虽然能用, 但BUG也多, 不支持多种控件, 不支持控件识别, 运行效率低, 更不能自动弹出;

;

所以原版仅供参考, 原版使用消息法处理, 效率太低, 故更为 流水线式处理法; (注: EmWin 在某一时刻,仅可能出现一个操作, 这是前提;);

;

回调函数如下:

;


static const char keyCAP[] = {
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P',
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '_',
'Z', 'X', 'C', 'V', 'B', 'N', 'M', 0};
static const char keyLOW[] = {
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p',
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '_',
'z', 'x', 'c', 'v', 'b', 'n', 'm', 0};
static const char key123[] = {
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'!', '@', '%', '*', '(', ')', '_', '-', '+', '=',
'/', ':', ';', '"', ',', '.', '?', 0};



static void _cbDialog(WM_MESSAGE * pMsg) {
        WM_HWIN hItem;
        int         NCode;
        int         ID_Num, Id, i, temp;
        char charBUFF[512], tempBUFF[128];   //获取文本输入缓冲区
        static int *pbuffPY[64];
        static char **pstrPY=(char **)&pbuffPY[0];
        char *pstrTEMP;
        static unsigned char capsKEY = 0, inputTYPE = 0;
        WM_MESSAGE Message;

        switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:
        capsKEY = 0, inputTYPE = 0;

        hItem = pMsg->hWin;
        WINDOW_SetBkColor(hItem, (0x00C0C0C0));

        // Initialization of 'ping'
        TEXT_SetTextAlign(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), GUI_TA_LEFT | GUI_TA_VCENTER);
        TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "");

        // Initialization of '1'
        for(i=ID_TEXT_1; i<=ID_TEXT_9; i++)
        {
                hItem = WM_GetDialogItem(pMsg->hWin, i);
                TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                TEXT_SetFont(hItem, &GUI_FontHZ16);
                TEXT_SetText(hItem, "");
        }

        for(ID_Num = ID_BUTTON_0;ID_Num <= ID_BUTTON_34;ID_Num++)
        {
                BUTTON_SetFont(WM_GetDialogItem(pMsg->hWin, ID_Num), &GUI_Font16_ASCII);  //所有键字体设置
                BUTTON_SetFocussable(WM_GetDialogItem(pMsg->hWin, ID_Num), 0);            //清除所有键的 焦点
        }
        break;

        case WM_NOTIFY_PARENT:
        Id        = WM_GetId(pMsg->hWinSrc);
        NCode = pMsg->Data.v;
        switch(Id) {
        //case ID_TEXT_0:
        //        break;                 //ID_TEXT_0 不参与输入法处理
        case ID_TEXT_1:
        case ID_TEXT_2:
        case ID_TEXT_3:
        case ID_TEXT_4:
        case ID_TEXT_5:
        case ID_TEXT_6:
        case ID_TEXT_7:
        case ID_TEXT_8:
        case ID_TEXT_9:                              /*** TEXT_1 --TEXT_2 与下面的 BUTTON 功能合并 ***/
        case ID_BUTTON_0: // Notifications sent by 'q'
        case ID_BUTTON_1: // Notifications sent by 'w'
        case ID_BUTTON_2: // Notifications sent by 'e'
        case ID_BUTTON_3: // Notifications sent by 'r'
        case ID_BUTTON_4: // Notifications sent by 't'
        case ID_BUTTON_5: // Notifications sent by 'y'
        case ID_BUTTON_6: // Notifications sent by 'u'
        case ID_BUTTON_7: // Notifications sent by 'i'
        case ID_BUTTON_8: // Notifications sent by 'o'
        case ID_BUTTON_9: // Notifications sent by 'p'
        case ID_BUTTON_10: // Notifications sent by 'a'
        case ID_BUTTON_11: // Notifications sent by 's'
        case ID_BUTTON_12: // Notifications sent by 'd'
        case ID_BUTTON_13: // Notifications sent by 'f'
        case ID_BUTTON_14: // Notifications sent by 'g'
        case ID_BUTTON_15: // Notifications sent by 'h'
        case ID_BUTTON_16: // Notifications sent by 'j'
        case ID_BUTTON_17: // Notifications sent by 'k'
        case ID_BUTTON_18: // Notifications sent by 'l'
        case ID_BUTTON_20: // Notifications sent by 'z'
        case ID_BUTTON_21: // Notifications sent by 'x'
        case ID_BUTTON_22: // Notifications sent by 'c'
        case ID_BUTTON_23: // Notifications sent by 'v'
        case ID_BUTTON_24: // Notifications sent by 'b'
        case ID_BUTTON_25: // Notifications sent by 'n'
        case ID_BUTTON_26: // Notifications sent by 'm'              /*** 26键_按键功能合并 :Stop ***/
        case ID_BUTTON_27: // Notifications sent by '<-'            /*** 按键功能合并 ***/
        case ID_BUTTON_28: // Notifications sent by '->'            /*** 按键功能合并 ***/
        case ID_BUTTON_19:   // Notifications sent by '_'          /************************ 此处为多余 **************************/
        case ID_BUTTON_29:   // Notifications sent by 'Space' (' ')
        case ID_BUTTON_30:   // Notifications sent by 'Enter'
        case ID_BUTTON_31:   // Notifications sent by '<Back' (<--)
        case ID_BUTTON_32: // Notifications sent by 'Caps'          /*** 结尾不始用 break;  按键'Caps'   'En' 功能合并 ***/
        case ID_BUTTON_33: // Notifications sent by 'EN'
                switch(NCode) {
                case WM_NOTIFICATION_CLICKED:
                        break;
                case WM_NOTIFICATION_RELEASED:
                        Id = WM_GetId(pMsg->hWinSrc);                   //获取 操作按键的Id;

/*********************************** ID_BUTTON_0 -- ID_BUTTON_26 功能区 ***********************************/
                        if(Id >= ID_BUTTON_0  &&  Id <= ID_BUTTON_26)             //26键 发生了操作
                        {
                                if(inputTYPE==0 || inputTYPE==1 || capsKEY) //goto gotoASCII; ||  goto gotoSYMBOL;  ||  goto gotoPING;
                                {
                                        BUTTON_GetText(pMsg->hWinSrc, &charBUFF[0], sizeof(charBUFF));
                                        GUI_StoreKeyMsg(charBUFF[0], 1);        //将按键存储到EMWIN(capsKEY //存储按键到EMWIN并退出)
                                        GUI_StoreKeyMsg(charBUFF[0], 0);
                                        break;
                                }
                                else if(inputTYPE == 2  && capsKEY == 0)       //'Ch'  中文输入
                                {
                                        TEXT_GetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), &charBUFF[0], sizeof(charBUFF));
                                        BUTTON_GetText(pMsg->hWinSrc, &tempBUFF[0], sizeof(tempBUFF));
                                        strcat(charBUFF, tempBUFF);        //connect string
                                }
                        }
/*********************************** ID_TEXT_1 -- ID_TEXT_9 显示区 ***********************************/
                        if(Id >= ID_TEXT_1  &&  Id <= ID_TEXT_9)              //9 个汉字显示TEXT 发生了操作
                        {
                                if(inputTYPE == 2  && capsKEY == 0)       //'Ch'  中文输入, 才可以操作
                                {
                                if(TEXT_GetText(WM_GetDialogItem(pMsg->hWin, Id), &tempBUFF[0], sizeof(tempBUFF)) == 0) break;
                               
                                /*** EmWin 各种小工具 汉字文本, 修改接口 ***/
                                if(WindowSKB_TypeFLAG == 1)                      /*** EDIT ***/
                                {
                                        EDIT_GetText(hItem=WM_GetFocussedWindow(), &charBUFF[0], sizeof(charBUFF));
                                        strcat(charBUFF, tempBUFF);
                                        EDIT_SetText(hItem, &charBUFF[0]);
                                }
                                else if(WindowSKB_TypeFLAG == 2)                 /*** MULTIEDIT ***/
                                {
                                  MULTIEDIT_GetText(hItem=WM_GetFocussedWindow(), &charBUFF[0], sizeof(tempBUFF));
                                        strcat(charBUFF, tempBUFF);
                                        MULTIEDIT_SetText(hItem, &charBUFF[0]);
                                }

                                memset(charBUFF, 0, sizeof(charBUFF));                  //汉字上屏之后, 清空输入,并重新更新显示与计算
                                }
                        }
/*****************************************************************************************************/
/*****************************************************************************************************/
                        if(Id == ID_BUTTON_19)  // Notifications sent by '_'    /************************ 此处为多余 **************************/
                        {
                                BUTTON_GetText(pMsg->hWinSrc, &charBUFF[0], sizeof(charBUFF));
                                GUI_StoreKeyMsg(charBUFF[0], 1);
                                GUI_StoreKeyMsg(charBUFF[0], 0);
                                break;
                        }
                        if(Id == ID_BUTTON_29)  // Notifications sent by 'Space' (' ')
                        {
                                GUI_StoreKeyMsg(GUI_KEY_SPACE, 1);
                                GUI_StoreKeyMsg(GUI_KEY_SPACE, 0);
                                break;
                        }
                        if(Id == ID_BUTTON_30)  // Notifications sent by 'Enter'
                        {
                                GUI_StoreKeyMsg(GUI_KEY_ENTER, 1);
                                GUI_StoreKeyMsg(GUI_KEY_ENTER, 0);
                                break;
                        }
                        if(Id == ID_BUTTON_31)  // Notifications sent by '<Back' (<--)
                        {
                                /*** 中文, Caps == 0; ID_TEXT_0有文本; 禁用退格 (退格用来清除TEXT控件一个字符) ***/
                                i = TEXT_GetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), &charBUFF[0], sizeof(charBUFF));
                                if((inputTYPE==2) && !capsKEY &&  i)
                                {
                                        charBUFF[i-1] = 0;                            //删除文本输入缓冲区最后一个字符
                                }
                                if(((inputTYPE!=2)) || capsKEY || !i)
                                {
                                        GUI_StoreKeyMsg(GUI_KEY_BACKSPACE, 1);
                                        GUI_StoreKeyMsg(GUI_KEY_BACKSPACE, 0);
                                        break;
                                }
                        }
/*****************************************************************************************************/
                        /*** 中英文/符号 键盘切换区 ***/
                        if(Id == ID_BUTTON_32)       /*** 确认是否 操作了键  'Caps' ***/
                        {
                                if(inputTYPE ==1) break;                                       //无视 '123' 数字/符号键下,Caps 的操作

                                capsKEY = !capsKEY;                                            //切换 Caps 操作标志

                                if(capsKEY) BUTTON_SetTextColor(pMsg->hWinSrc, BUTTON_CI_UNPRESSED, GUI_RED); //当前按键变红
                                else BUTTON_SetTextColor(pMsg->hWinSrc, BUTTON_CI_UNPRESSED, GUI_BLACK);      //变灰                       
                        }
                        else if(Id == ID_BUTTON_33)  /*** 确认是否 操作了键  'En' ***/
                        {
                                inputTYPE = (inputTYPE >= 2) ? 0 : (inputTYPE+1);              //键盘类型循环切换
                                capsKEY = 0;                                                   //只有EN 有操 作 capsKEY 状态清零

                                BUTTON_SetTextColor(WM_GetDialogItem(pMsg->hWin, ID_BUTTON_32), BUTTON_CI_UNPRESSED, GUI_BLACK);//只要En有操作, Caps就变灰;

                                /*** 切换 En 键盘标记 ***/
                                if(inputTYPE == 0)      BUTTON_SetText(pMsg->hWinSrc, "En");   //英文键盘标记
                                else if(inputTYPE == 1) BUTTON_SetText(pMsg->hWinSrc, "123");  //数字符号键盘标记
                                else                    BUTTON_SetText(pMsg->hWinSrc, "Ch");   //中文键盘标记
                        }

                        if(Id == ID_BUTTON_32  ||  Id == ID_BUTTON_33)                      //仅 中英文切换 和 'CapsKEY' 可以进入
                        {
                                /*** inputTYPE = 2_中文; 1_数字/符号; 0_英文; ***/
                                for(ID_Num=ID_BUTTON_0; ID_Num<=ID_BUTTON_26; ID_Num++)
                                {
                                        /*** 先设置 颜色, 后设置 文本内容 ***/
                                        if(inputTYPE == 2 && capsKEY == 0)
                                                BUTTON_SetTextColor(WM_GetDialogItem(pMsg->hWin, ID_Num), BUTTON_CI_UNPRESSED, GUI_RED);   //红色
                                        else
                                                BUTTON_SetTextColor(WM_GetDialogItem(pMsg->hWin, ID_Num), BUTTON_CI_UNPRESSED, GUI_BLACK); //黑色
                               
                                        /*** 按键 显示 文本设置 ***/
                                        if(inputTYPE==0  ||  inputTYPE==2)    //英文键盘    "En"    ||    //中文键盘    "Ch"
                                        {
                                                if(capsKEY == 0)       charBUFF[0] = keyLOW[ID_Num-ID_BUTTON_0];       //小写键盘
                                                else if(capsKEY == 1)  charBUFF[0] = keyCAP[ID_Num-ID_BUTTON_0];       //大写键盘
                                        }
                                        else if(inputTYPE == 1) charBUFF[0] = key123[ID_Num-ID_BUTTON_0];    //数字/符号键盘    "123"

                                        charBUFF[1] = 0;                                                 //添加 字符串结束符
                                        BUTTON_SetText(WM_GetDialogItem(pMsg->hWin, ID_Num), &charBUFF[0]);  //文本载入按键
                                }
                                memset(charBUFF, 0, sizeof(charBUFF));                  //切换键盘之后, 清空输入,并重新更新显示与计算
                        }
/*****************************************************************************************************/
/*****************************************************************************************************/
                        /*** 拼音输入法 处理区 ***/
                        if((inputTYPE==2 && capsKEY==0) ||  Id==ID_BUTTON_32)       //'Ch'  中文输入     (给CapsKEY 开一条通道)
                        {
                                if(Id != ID_BUTTON_27  &&  Id != ID_BUTTON_28)     //BUTTON_27--28 从此处跳过; 进入后续操作
                                {
                                        TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), &charBUFF[0]);        //TEXT_0 显示设置, 公共资源
                                        /*** 拼音输入法处理 ***/
                                        for(i=0; i<sizeof(pbuffPY)/4; i++) pbuffPY = 0;       //清空指针 数组
                                        pstrPY = (char **)&pbuffPY[0];                           //保存 指针数组 首地址
                                        pstrTEMP = (char *)PYSearch(&charBUFF[0]);               //使用拼音 输入法, 得到汉字索引头 指针
                                        //每9个汉字储存一个指针到pbuffPY
                                        /*** 汉字索引非空 && 索引有内容 && 将索引指针载入指针数组, (直至索引空 || 无内容 || BUFF满) ***/
                                        for(i=0; pstrTEMP && *pstrTEMP && (i<sizeof(pbuffPY)/4-1); i++)
                                        {
                                                pbuffPY = (int *)pstrTEMP;                        //将索引载入指针数组, 间隔9个汉字字符
                                                //pstrTEMP移动9个汉字
                                                for(temp=ID_TEXT_1; temp<=ID_TEXT_9; temp++)         //往后偏移 9个字符  (支持任何编码形式)
                                                {
                                                        /*** 计算每次 9个字符长度实际偏移  (支持任何编码形式) ***/ //使用'pfGetCharSize'来计算一个汉字的字节数
                                                        pstrTEMP = pstrTEMP + GUI_pUC_API->pfGetCharSize(pstrTEMP);       
                                                        if(!pstrTEMP || !*pstrTEMP) break;               //指针空, 无内容跳出
                                                }
                                        }
                                }
                                else if(Id == ID_BUTTON_27)                                //'<-'
                                {
                                        /*** 预操作测试是否有内容  &&  当前首地址与保存的是否一样 ***/
                                        if(*(pstrPY-1) && (pstrPY != (char **)&pbuffPY[0])) pstrPY--;     //当前首地址偏移
                                }
                                else if(Id == ID_BUTTON_28)                                //'->'
                                {
                                        /*** 预操作测试是否有内容  &&  当前首地址与保存的是否一样 ***/
                                        if(*(pstrPY+1) && (pstrPY!=(char **)&pbuffPY[sizeof(pbuffPY)/4-1])) pstrPY++;
                                        else pstrPY = (char **)&pbuffPY[0];                                          //否则载入保存首地址
                                }
/*****************************************************************************************************/
/*****************************************************************************************************/
                                /*** 输入法, 结果显示区 ***/

                                //将字符显示至 ID_TEXT_1~ID_TEXT_9
                                for(pstrTEMP = *pstrPY, i=ID_TEXT_1; i<=ID_TEXT_9; i++)
                                {
                                        memset(&tempBUFF[0], 0, sizeof(tempBUFF));
                                        if(!pstrTEMP || !*pstrTEMP) {TEXT_SetText(WM_GetDialogItem(pMsg->hWin, i), ""); continue;} //(空||无内容)清空当前文本框; 仅结束本次循环

                                        memcpy(&tempBUFF[0], pstrTEMP, temp = GUI_pUC_API->pfGetCharSize(pstrTEMP)); //temp_汉字的字节数  (支持任何编码)
                                        TEXT_SetText(WM_GetDialogItem(pMsg->hWin, i), &tempBUFF[0]);    //汉字更新至文本框
                                        pstrTEMP = pstrTEMP + temp;                                     //偏移一个汉字字符
                                }
                        }
                }
/*****************************************************************************************************/
/*****************************************************************************************************/
                break;
        case ID_BUTTON_34: // Notifications sent by 'Esc'
                switch(NCode) {
                case WM_NOTIFICATION_CLICKED:
                        break;
                case WM_NOTIFICATION_RELEASED:
                        WM_HideWindow(pMsg->hWin);                     //隐藏窗口
//                        WM_SetFocus(WM_HBKWIN);                        //焦点移至桌面

                        //renew all keys include caps
                        inputTYPE = (inputTYPE <= 0) ? 2 : (inputTYPE-1);              //重新打开, 仅能是 'En' 或 '123'
                        Message.hWinSrc = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_33);
                        Message.MsgId = WM_NOTIFY_PARENT;
                        Message.Data.v = WM_NOTIFICATION_RELEASED;
                        WM_SendMessage(pMsg->hWin, &Message);
                }
                break;
        }
        break;
        case WM_PAINT:
                {
                        WM_BringToTop(pMsg->hWin);                        //自动将键盘窗口置顶
                }
                break;
        default:
        WM_DefaultProc(pMsg);
        break;
        }
}
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:50:10 | 显示全部楼层
本帖最后由 wlq390934605 于 2018-3-26 13:18 编辑

可以看出, 回调处理非常高效, 没有一点是多余的;;
下面给出, 内部调用接口;
;
/***************************************************************************************/
/*** 全屏键盘 : 在焦点窗口显示键盘窗口 ***/

void  WindowSKB_ShowInterface(WM_HWIN  hItem, u8 Widget_Type)
{
        int posiX, posiY, sizeX[2], sizeY[2];
       
        WindowSKB_TypeFLAG = 0;            //设置前先清空
        WindowSKB_TypeFLAG = Widget_Type;  //设置操作的小工具类型

        WM_AttachWindow(hWindowSKB, WM_GetParent(hItem));  //自动变为焦点窗口父的子窗口, 提高运行速度
        WM_ShowWindow(hWindowSKB);                         //显示键盘窗口

        sizeX[0] = WM_GetWindowSizeX(WM_GetParent(hItem));    //文本父窗口 X大小(由于桌面口调用不稳定)
        sizeY[0] = WM_GetWindowSizeY(WM_GetParent(hItem));    //文本父窗口 Y大小
        sizeX[1] = WM_GetWindowSizeX(hWindowSKB);             //键盘窗口 X大小
        sizeY[1] = WM_GetWindowSizeY(hWindowSKB);             //键盘窗口 Y大小
        if(sizeX[0] - WM_GetWindowOrgX(hItem) < sizeX[1])  //源窗口起始_X为X_坐标, 右侧区域放不下键盘
                posiX = sizeX[0] - sizeX[1];                        //键盘贴于右侧边框
        else posiX = WM_GetWindowOrgX(hItem);                 //否则使用源窗口起始_X为X_坐标
        if(sizeY[0]-WM_GetWindowOrgY(hItem)-WM_GetWindowSizeY(hItem) < sizeY[1])//源窗口终点_Y为Y_坐标, 底部区域放不下键盘
        {
                if(WM_GetWindowOrgY(hItem) < sizeY[1])     //顶部区域放不下键盘
                  posiY = sizeY[0] - sizeY[1];                      //直接贴于屏幕正底部
                else posiY = WM_GetWindowOrgY(hItem) - sizeY[1];    //键盘完全置于源窗口起始Y 坐标上方,(Y_最小值为0 (贴于小工具顶部))
        }
        else posiY = WM_GetWindowOrgY(hItem) + WM_GetWindowSizeY(hItem); //否则使用源窗口终点_Y为Y坐标

        WM_MoveTo(hWindowSKB, posiX, posiY);                  //键盘动至桌面坐标 位置posiX, posiY;
}
/***************************************************************************************/

回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:50:25 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:50:37 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:50:51 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:51:05 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:51:16 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:51:29 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:52:11 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:52:36 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:53:21 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:53:54 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:54:08 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 12:54:55 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 13:19:17 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 13:19:39 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 13:19:57 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 13:20:09 | 显示全部楼层
防止抢楼, 先自占20楼...........
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-24 20:45:16 | 显示全部楼层
再占一楼
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-26 13:29:40 | 显示全部楼层
手动置顶
回复

使用道具 举报

259

主题

806

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2012-10-28
在线时间
353 小时
发表于 2018-3-29 12:12:28 | 显示全部楼层
牛掰了,现在正打算搞搞拼音输入法了
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-3-29 15:31:38 | 显示全部楼层
hpdell 发表于 2018-3-29 12:12
牛掰了,现在正打算搞搞拼音输入法了

目前虚拟机 没有更新完, 无法进一步更新
回复

使用道具 举报

2

主题

46

帖子

1

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2017-5-8
在线时间
136 小时
发表于 2018-4-7 16:26:48 | 显示全部楼层
不错,正在学习,要是能看下整个工程源码就好了,
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-4-7 20:45:11 | 显示全部楼层
fl7547454 发表于 2018-4-7 16:26
不错,正在学习,要是能看下整个工程源码就好了,

论坛热度太低了, 没有人气, 没有更的欲望;
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-4-7 20:46:52 | 显示全部楼层
本帖最后由 wlq390934605 于 2018-4-8 08:09 编辑
fl7547454 发表于 2018-4-7 16:26
不错,正在学习,要是能看下整个工程源码就好了,

此处回复已删除
回复

使用道具 举报

2

主题

46

帖子

1

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2017-5-8
在线时间
136 小时
发表于 2018-4-8 11:37:55 | 显示全部楼层
哈哈 也许大家对这一块不太重视吧,比起原子安富莱那个键盘我觉得这个倒是非常符合实际项目,我准备改一下   改成点击编辑框在相应位置弹出9宫格数字输入的键盘。这种项目中用的比较多。
回复

使用道具 举报

2

主题

46

帖子

1

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2017-5-8
在线时间
136 小时
发表于 2018-4-8 11:39:01 | 显示全部楼层
请教下,您之前说这个键盘还存在很多BUG吗?  
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-4-8 23:16:42 | 显示全部楼层
本帖最后由 wlq390934605 于 2018-4-8 23:28 编辑
fl7547454 发表于 2018-4-8 11:39
请教下,您之前说这个键盘还存在很多BUG吗?

多添加一个9宫格界面就行了,  不用改, 只需要导入9键拼音索引, 其它不用动;
;
如果不用添加输入法, 每次工作时间都能减少近半小时; 一般人是不会懂的;;
明天更完;
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-4-9 18:19:42 | 显示全部楼层
fl7547454 发表于 2018-4-8 11:39
请教下,您之前说这个键盘还存在很多BUG吗?

感谢关注, 已发源码, 源码已置顶;
回复

使用道具 举报

2

主题

46

帖子

1

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2017-5-8
在线时间
136 小时
发表于 2018-4-10 10:11:31 | 显示全部楼层
谢谢楼主分享~~   
回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2018-1-16
在线时间
37 小时
发表于 2018-5-18 16:47:57 | 显示全部楼层
帮顶。感谢楼主
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-8-27 15:35:16 来自手机 | 显示全部楼层
顶起,123456
回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
发表于 2018-9-3 20:30:29 | 显示全部楼层
厉害了!!
回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
发表于 2018-9-3 20:31:10 | 显示全部楼层
开机动画神了~
回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
发表于 2018-9-3 20:32:36 | 显示全部楼层
请问在单片机内怎么实现开机动画?
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-9-4 11:27:55 来自手机 | 显示全部楼层
h418452224 发表于 2018-9-3 20:32
请问在单片机内怎么实现开机动画?

不要问我为什么,照搬就行了
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-9-4 11:29:45 来自手机 | 显示全部楼层
程序会自动找到,自定义文件夹下所有东西
回复

使用道具 举报

0

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2018-7-26
在线时间
75 小时
发表于 2018-11-5 14:17:08 | 显示全部楼层
为啥子停了,正看的起劲,膜拜大佬的同时,向大佬学习
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
 楼主| 发表于 2018-11-6 00:51:27 | 显示全部楼层
蓬莱羽客 发表于 2018-11-5 14:17
为啥子停了,正看的起劲,膜拜大佬的同时,向大佬学习

移植说明在: <EmWin 终结遍> 像Android 自动弹出键盘 (更新)
链接: http://www.openedv.com/forum.php?mod=viewthread&tid=280501
回复

使用道具 举报

0

主题

91

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2018-9-27
在线时间
15 小时
发表于 2018-11-22 10:50:32 | 显示全部楼层
楼主真厉害,我什么时候才能想你这么厉害


关键词批量查询程序
回复

使用道具 举报

17

主题

146

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1474
金钱
1474
注册时间
2018-11-15
在线时间
286 小时
发表于 2019-6-20 14:10:14 | 显示全部楼层
wlq390934605 发表于 2018-11-6 00:51
移植说明在:  像Android 自动弹出键盘 (更新)
链接: http://www.openedv.com/forum.php?mod=viewthread& ...

666,做个骚标记,好找来时的路!
回复

使用道具 举报

1

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2018-5-23
在线时间
126 小时
发表于 2019-6-22 19:00:32 | 显示全部楼层
牛逼呀
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-2-27
在线时间
5 小时
发表于 2019-7-2 15:12:52 | 显示全部楼层
请问,你这个程序有移植到开发板上的吗?这些图片资源我都找不到呀。
回复

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-6-28
在线时间
27 小时
发表于 2019-8-29 11:36:21 | 显示全部楼层
wlq390934605 发表于 2018-4-8 23:16
多添加一个9宫格界面就行了,  不用改, 只需要导入9键拼音索引, 其它不用动;
;
如果不用添加输入法, 每 ...

楼主,这个如果不用触摸使用实体按键控制移动,唤醒键盘后,光标怎么切换到小键盘界面呢
回复

使用道具 举报

1

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2019-8-15
在线时间
34 小时
发表于 2019-11-18 14:27:45 | 显示全部楼层
你好   我想问一个emwin关于Edit显示的问题 ,我用EDIT_CreateEx创建一个Edit通过GUI_StoreKeyMsg  发送键值到当前的焦点  ,其他键值都可以显示,唯有字符!显示不了,如果用MUETIEDIT_CreateEx是可以显示字符!,而且我用BUTTON_SetText  ,EDIT框时可以显示的 ,所以想请教一下大神  这是什么问题?
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-7-24
在线时间
34 小时
发表于 2020-7-23 19:31:20 | 显示全部楼层
大佬,还有保存了代码的人吗?链接不在了,啊啊啊啊啊啊
回复

使用道具 举报

9

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2020-7-7
在线时间
113 小时
发表于 2020-8-9 23:59:55 | 显示全部楼层
楼主源码怎么失效了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 09:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表