硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4126|回复: 30
收起左侧

[emWin] 求助键盘上的EDIT控件怎么获取点击的EDIT框里的值并且修改

  [复制链接]

22

主题

114

回帖

180

积分

初级会员

积分
180
发表于 2020-12-22 10:27:56 | 显示全部楼层 |阅读模式
[tr][/tr]
[tr][/tr]
硬汉哥,键盘上的EDIT控件怎么获取点击的EDIT框里的值并且修改,相当于全选编辑框里的数值,将点击的编辑框里的值显示出来,键盘和点击的EDIT控件是两个窗口,要不然不知道输入了什么







回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2020-12-22 10:36:38 | 显示全部楼层
atoi将数值ascii转为字符使用比较方便。
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-12-22 11:10:40 | 显示全部楼层
eric2013 发表于 2020-12-22 10:36
atoi将数值ascii转为字符使用比较方便。

具体是怎么操作啊
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-12-22 14:42:04 | 显示全部楼层
eric2013 发表于 2020-12-22 10:36
atoi将数值ascii转为字符使用比较方便。

简单的说就是这两个编辑框之间怎么传递数据啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2020-12-23 09:42:10 | 显示全部楼层
Num pad demo---emWin的数字键盘
http://www.armbbs.cn/forum.php?m ... 6042&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-12-23 10:53:33 | 显示全部楼层
eric2013 发表于 2020-12-23 09:42
Num pad demo---emWin的数字键盘
http://www.armbbs.cn/forum.php?mod=viewthread&tid=6042&fromuid=58
( ...

你怎么老拿这些对问题没有意义的例子来糊弄人呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2020-12-23 11:46:06 | 显示全部楼层
zxc19970106 发表于 2020-12-23 10:53
你怎么老拿这些对问题没有意义的例子来糊弄人呢?



这个例子很有代表性,实现你楼主位的功能完全没问题。你要做的仅仅是在这个例子基础上实现点击要编辑的EDTI控件,读取数据显示到你当前当前键盘的EDIT控件即可。

而实现方法就是我二楼发的,
1、如果仅仅是文本的复制粘贴,复制内容方法EDIT_GetText获取文本内容,粘贴内容方法EDIT_SetText。
2、如果需要获取文本对应的数值,使用atoi,可以方便的将GetText获取的字符串转换为实际对应的数值。
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-12-25 09:26:07 | 显示全部楼层
eric2013 发表于 2020-12-23 11:46
这个例子很有代表性,实现你楼主位的功能完全没问题。你要做的仅仅是在这个例子基础上实现点击要编 ...

硬汉哥,我照你这么说的去弄怎么还是没有显示啊?被点击的EDIT控件上有显示,键盘上的没显示,代码如下:
数据存放数组:
FRAMEWINDLG_TYPE char Detect[5];                                                                                                       
char nDataStr[10];
FRAMEWINDLG_TYPE float Detectpressure[5];
       
printf("adc_float:%f",Hex_To_Decimal(g_tModH_val.h_to_f,0));
Detectpressure[1]=Hex_To_Decimal(g_tModH_val.h_to_f,0);
sprintf(Detect,"%0.3f",Detectpressure[1]);

被点击的EDIT控件:
初始化:

case WM_INIT_DIALOG:
EDIT_SetFont(hedit1, &GUI_FontHZ24);
EDIT_SetTextColor(hedit1,EDIT_CI_ENABLED,GUI_BLACK);
EDIT_SetText(hedit1,Detect);
回调函数:
case ID_EDIT_0:
switch(NCode) {
case WM_NOTIFICATION_CLICKED:
hedit1 = WM_GetDialogItem(pMsg->hWin,ID_EDIT_0);
EDIT_GetText(hedit1,Detect,5);
nDataStr[1] = atof(Detect);
hEdit1 = WM_GetDialogItem(hNumPad,ID_EDIT_0);
EDIT_SetText(hEdit1,(char*)nDataStr[1]);
WM_InvalidateWindow(hEdit1);
WM_ShowWindow(hItemNumPad);
break;
case WM_NOTIFICATION_RELEASED:
break;
case WM_NOTIFICATION_VALUE_CHANGED:
break;
}
键盘上的EDIT控件:
初始化:
EDIT_SetFont(hEdit1,&GUI_FontHZ32);
EDIT_SetTextAlign(hEdit1,GUI_TA_VCENTER | GUI_TA_VCENTER);
WM_SetFocus(hEdit1);
回调函数:
case ID_EDIT_0:
switch(NCode) {
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:     
break;
case WM_NOTIFICATION_VALUE_CHANGED:
break;
}
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-12-29 10:10:32 | 显示全部楼层
eric2013 发表于 2020-12-23 11:46
这个例子很有代表性,实现你楼主位的功能完全没问题。你要做的仅仅是在这个例子基础上实现点击要编 ...

硬汉哥,有空就帮我看看呗,卡在这里好几天了
回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-6 16:21:46 | 显示全部楼层

实现楼主要求的功能:键盘上的EDIT控件,获取点击的EDIT框里的值,并且修改  


1、数字软键盘修改数据,先上照片: KeyPad_数据修改.jpg


2、实现如下:

  typedef struct tag_mdfKey
   {
        u8    flag_ent; //确认标志
        u32   id_press;  //修改控件:ID
        char  mdf_buff[30];        //修改数据缓冲区       
  }KPad_MDF;


static WM_MESSAGE kp_Msg;
KPad_MDF  kpad_mdf;  //数字键盘修改结构体变量




/*
********************************************************************
*
*       _cbDialogNumPad
*********************************************************************
*/
static void _cbDialogNumPad(WM_MESSAGE * pMsg) {
  GUI_RECT r;
  int i, NCode, Id, Pressed = 0;
  WM_HWIN hDlg, hItem;
  hDlg = pMsg->hWin;
  switch (pMsg->MsgId) {
   case KEYPAD_UPDATE_MSG: //数字小键盘: 更新数据消息
     if(kpad_mdf.id_press>0){
            hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);
            EDIT_SetText(hItem,kpad_mdf.mdf_buff);
     }else{
           hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);
           EDIT_SetText(hItem,"");
    }
    WM_SetFocus(hItem);        //聚焦于小键盘上的EDIT编辑框       
    break;
  case WM_PAINT:
    WM_GetClientRect(&r);
    GUI_SetColor(0x000000);
    GUI_DrawRect(r.x0, r.y0, r.x1, r.y1);          /* Draw rectangle around it */
    /* Draw the bright sides */
    GUI_SetColor(0xffffff);
    GUI_DrawHLine(r.y0 + 1, r.x0 + 1, r.x1 - 2);   /* Draw top line */
    GUI_DrawVLine(r.x0 + 1, r.y0 + 1, r.y1 - 2);
    /* Draw the dark sides */
    GUI_SetColor(0x555555);
    GUI_DrawHLine(r.y1-1, r.x0 + 1, r.x1 - 1);
    GUI_DrawVLine(r.x1-1, r.y0 + 1, r.y1 - 2);
    break;
  case WM_INIT_DIALOG:
    for (i = 0; i < GUI_COUNTOF(_aDialogNumPad) - 1; i++) {
      hItem = WM_GetDialogItem(hDlg, GUI_ID_USER + i);
     BUTTON_SetFont(hItem, &GUI_FontHZ_Saf_16);
      BUTTON_SetFocussable(hItem, 0);                       /* Set all buttons non focussable */
      switch (i) {
      case 18:
        BUTTON_SetBitmapEx(hItem, 0, &_bmArrowLeft, 10, 12);  /* Set bitmap for arrow left button (unpressed) */
        BUTTON_SetBitmapEx(hItem, 1, &_bmArrowLeft, 10, 12);  /* Set bitmap for arrow left button (pressed) */
        break;
      case 19:
        BUTTON_SetBitmapEx(hItem, 0, &_bmArrowRight, 10, 12); /* Set bitmap for arrow right button (unpressed) */
        BUTTON_SetBitmapEx(hItem, 1, &_bmArrowRight, 10, 12); /* Set bitmap for arrow right button (pressed) */
        break;
      }
    }   
               
   hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);  //数字小键盘上的:EDIT控件
   EDIT_SetMaxLen(hItem,30);       
   EDIT_SetBkColor(hItem,0,GUI_BLACK);               
   EDIT_SetFont(hItem,&GUI_Font24B_1);
   EDIT_SetTextAlign(hItem,GUI_TA_VCENTER|GUI_TA_LEFT);
   EDIT_SetTextColor(hItem,0,GUI_RED);                               
               
    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);      /* Id of widget */
    NCode = pMsg->Data.v;                 /* Notification code */   
          
          switch (NCode) {
                        case WM_NOTIFICATION_CLICKED:
                               
                                if(Id ==(GUI_ID_USER + 17)){ //"ENT"按键----按下
                                    hItem =WM_GetDialogItem(hDlg, GUI_ID_USER + 17);
                                    BUTTON_SetBkColor(hItem,BUTTON_CI_PRESSED,GUI_GREEN); //按下时--绿色背景
                                }
                               
                                Pressed = 1;
                               
                                break;
                        case WM_NOTIFICATION_RELEASED:
                                if ((Id >= GUI_ID_USER) && (Id <= (GUI_ID_USER + GUI_COUNTOF(_aDialogNumPad) - 1))) {
                                       
                                        int Key;
                                       
                                        if (Id < GUI_ID_USER + 14) {
                                                char acBuffer[10];
                                                BUTTON_GetText(pMsg->hWinSrc, acBuffer, sizeof(acBuffer)); /* Get the text of the button */
                                                Key = acBuffer[0];
                                        } else {
                                                Key = _aKey[Id - GUI_ID_USER - 13];                        /* Get the text from the array */
                                               
                                                if(Id ==(GUI_ID_USER + 17)){ //"ENT"按键---抬起
                                                        hItem =WM_GetDialogItem(hDlg, GUI_ID_USER + 17);
                                                        BUTTON_SetBkColor(hItem,BUTTON_CI_UNPRESSED,0xAAAAAA);                                                       
                                                       
                                                        hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);  
                                                        EDIT_GetText(hItem,kpad_mdf.mdf_buff,30);  //获取编辑后的内容
                                                       
                                                        kpad_mdf.flag_ent=1;//set
                                                       
                                                }
                                               
                                        }
                                       
                                        Pressed = 1;       
                                       
                                        GUI_SendKeyMsg(Key, Pressed);     /* Send a key message to the focussed window */
                                }
                                break;
     }
    default:
      WM_DefaultProc(pMsg);
  }
}       



//主窗体下的控件处理:

/****************************************************************************       
* 功    能: 数字小键盘---更新数据处理函数
*---------------------------------------------------------------------------*
* 入口参数: hDlg------窗口句柄
*            Id--------控件ID
* 出口参数: nil
****************************************************************************/       
void KeyPad_Update_Process(WM_HWIN hDlg,int Id)
{
    WM_HWIN hItem;
       
    memset(kpad_mdf.mdf_buff,0,30);//clear

    kpad_mdf.flag_ent=0; //clear
    kpad_mdf.id_press=Id;

    hItem = WM_GetDialogItem(hDlg, Id);
    EDIT_GetText(hItem,kpad_mdf.mdf_buff,30); //获取点击的EDIT编辑框的内容

    kp_Msg.MsgId = KEYPAD_UPDATE_MSG;                                                         
    WM_SendMessage(WM_GetClientWindow(hNumPad), &kp_Msg);          //给小键盘发送消息
}





/****************************************************************************       
* 功    能: 数字小键盘---更新完成函数
*----------------------------------------------------------------------------------------------------------------*
* 入口参数: hDlg------窗口句柄
*                  Id--------控件ID
* 出口参数: nil
****************************************************************************/       
void KeyPad_Update_Finish(WM_HWIN hDlg)
{
        u8 i;
        WM_HWIN hItem;
       
        #if OS_CRITICAL_METHOD == 3   
          OS_CPU_SR  cpu_sr = 0;
        #endif
       
        if(kpad_mdf.flag_ent==1){ //数字小键盘:确认修改
                                                                                               
                if((kpad_mdf.id_press== GUI_ID_EDIT0)||
                   (kpad_mdf.id_press== GUI_ID_EDIT1)||
                   (kpad_mdf.id_press== GUI_ID_EDIT2)){
                                 
                                hItem = WM_GetDialogItem(hDlg, kpad_mdf.id_press);  //要点击修改的EDIT编辑框
                                EDIT_SetText(hItem,kpad_mdf.mdf_buff); //更新为:小键盘EDIT的内容                                                                                                         
                                 
                                i=kpad_mdf.id_press-GUI_ID_EDIT0;
                                 
                                //添加自己的代码, 存储数据       
                               
                                Buzzer_out();        //蜂鸣器鸣响--->提示

                }
               
                memset(&kpad_mdf,0,sizeof(KPad_MDF));  //clear               
               
                WM_HideWindow(hwin_keypad);   //
                WM_HideWindow(hNumPad);      //隐藏虚拟小键盘                                                                                                       
        }               
}


//主窗体: 回调函数
static void _cbCallback(WM_MESSAGE * pMsg)
{

    WM_HWIN hItem;
    WM_HWIN hDlg = pMsg->hWin;            
         
    switch (pMsg->MsgId) {

      case WM_TOUCH:
                 //....................                                       
                 break;                                         
        case WM_PID_STATE_CHANGED: //the pressed state has been changed.       
                        //....................                                                                 
                 break;                                                       
        case UPDATE_MSG_TEXT:
                 //....................       
                 KeyPad_Update_Finish(hDlg); //主窗体---更新小键盘的数据                                                 
                 break;
         case WM_NOTIFY_PARENT:
            Id    = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
           switch(NCode)
                {
                     case WM_NOTIFICATION_CLICKED:   //编辑框内点击------数字小键盘显示
                       switch(Id)
                         {       
                              if((Id == GUI_ID_EDIT0)||
                                (Id == GUI_ID_EDIT1)||
                                (Id == GUI_ID_EDIT2))
                                 {
                                        int x_pos,y_pos;                                                                               
                                                                                                                                                                  
                                        hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT2);
                                        x_pos=WM_GetWindowOrgX(hItem);
                                        y_pos=WM_GetWindowOrgY(hItem);         

                                        KeyPad_Update_Process(hDlg,Id); //数字小键盘更新数据处理                                                                                         
                                                                                                                       
                                        WM_MoveTo(hwin_keypad,x_pos-15,y_pos-20);        //移动窗口                                                                                                         
                                        WM_ShowWindow(hwin_keypad);   //
                                        WM_ShowWindow(hNumPad); //显示虚拟键盘                                                                                         
                                }               
                          }
                       break;
                }                                                                                                 

       }
}


回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-6 16:46:24 | 显示全部楼层
最后的总结示意图如下:
数字小键盘.jpg
回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-8 13:41:34 | 显示全部楼层
数字小键盘编辑修改功能,更新后的消息处理:

#define KEYPAD_UPDATE_MSG     WM_USER + 90
#define KEYPAD_UPDATE_END     WM_USER + 100



//__packed:注意字节对齐的问题!!!
typedef struct tag_mdfKey
{
         __packed  u16   flag_ent;      //确认标志       
         __packed  s16   wm_src;         //源窗口句柄
                        u32   id_press;         //修改控件:ID
                        char  mdf_buff[32];        //修改数据缓冲区
       
}KPad_MDF;



/****************************************************************************       
* 功    能: 数字小键盘更新数据处理函数
*---------------------------------------------------------------------------*
* 入口参数: hDlg------窗口句柄
*                  Id--------控件ID
* 出口参数: nil
****************************************************************************/       
void KeyPad_Update_Process(WM_HWIN hDlg,int Id)
{
        WM_HWIN hItem;
       
        WM_MESSAGE kp_Msg;
       
        memset(kpad_mdf.mdf_buff,0,30);//clear
       
        kpad_mdf.flag_ent=0;//clear
        kpad_mdf.wm_src=hDlg; //源窗口句柄
        kpad_mdf.id_press=Id; //控件id
       
        hItem = WM_GetDialogItem(hDlg, Id);
        EDIT_GetText(hItem,kpad_mdf.mdf_buff,sizeof(kpad_mdf.mdf_buff));

        kp_Msg.MsgId = KEYPAD_UPDATE_MSG;                                                         
        WM_SendMessage(WM_GetClientWindow(hNumPad), &kp_Msg);        
}




/*
********************************************************************
*
*       _cbDialogNumPad
*********************************************************************
*/
static void _cbDialogNumPad(WM_MESSAGE * pMsg) {
  GUI_RECT r;
  int i, NCode, Id, Pressed = 0;
  WM_HWIN hDlg, hItem;
  WM_MESSAGE end_Msg;       

  hDlg = pMsg->hWin;
  switch (pMsg->MsgId) {
     case WM_NOTIFY_PARENT:
          Id    = WM_GetId(pMsg->hWinSrc);      /* Id of widget */
         NCode = pMsg->Data.v;                 /* Notification code */            
          switch (NCode) {                case WM_NOTIFICATION_RELEASED:
                     if(Id ==(GUI_ID_USER + 17)){ //"ENT"按键---抬起
                         hItem =WM_GetDialogItem(hDlg, GUI_ID_USER + 17);
                         BUTTON_SetBkColor(hItem,BUTTON_CI_UNPRESSED,0xAAAAAA);                                                       
                                                       
                         hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);
                           EDIT_GetText(hItem,kpad_mdf.mdf_buff,sizeof(kpad_mdf.mdf_buff));
                                                       
                          kpad_mdf.flag_ent=1;//set
                          end_Msg.MsgId = KEYPAD_UPDATE_END;        //向源窗体--->发送确认修改消息                                                 
                          WM_SendMessage(WM_GetClientWindow(kpad_mdf.wm_src), &end_Msg);                                                        
                                                       
                    }
                    break;
          } }

}

//源窗体处理:
  case KEYPAD_UPDATE_END: //数字小键盘--->修改完毕消息
           KeyPad_Update_Finished(hDlg);
           break;                       

//消息传递、处理示意图:

数字小键盘编辑修改-消息传递.jpg






回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2021-1-9 10:12:54 | 显示全部楼层
xfcbbs2 发表于 2021-1-8 13:41
数字小键盘编辑修改功能,更新后的消息处理:

#define KEYPAD_UPDATE_MSG     WM_USER + 90

抱歉,这几天有点忙,现在才看到,感谢兄弟
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2021-1-11 11:00:34 | 显示全部楼层
xfcbbs2 发表于 2021-1-8 13:41
数字小键盘编辑修改功能,更新后的消息处理:

#define KEYPAD_UPDATE_MSG     WM_USER + 90

大神问下_aKey[Id - GUI_ID_USER - 13],这个_aKey是用来干什么的?
回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-12 08:45:28 | 显示全部楼层
zxc19970106 发表于 2021-1-11 11:00
大神问下_aKey,这个_aKey是用来干什么的?

/* Array of keys */
static int _aKey[] = {
GUI_KEY_ESCAPE,
GUI_KEY_BACKSPACE,
GUI_KEY_DELETE,
GUI_KEY_INSERT,
GUI_KEY_ENTER,
GUI_KEY_LEFT,
GUI_KEY_RIGHT
};

数字小键盘,按钮功能定义
回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-12 09:15:29 | 显示全部楼层


//数字小键盘,构建的源代码,绝对是自己原创,都使用好多年了!

/* Array of keys */
static int _aKey[] = {
  GUI_KEY_ESCAPE,
  GUI_KEY_BACKSPACE,
  GUI_KEY_DELETE,
  GUI_KEY_INSERT,
  GUI_KEY_ENTER,
  GUI_KEY_LEFT,
  GUI_KEY_RIGHT
};


static GUI_CONST_STORAGE unsigned char _acArrowRight[] = {
  ____XX__, ________,
  ____XXXX, ________,
  XXXXXXXX, XX______,
  ____XXXX, ________,
  ____XX__, ________
};

static GUI_CONST_STORAGE unsigned char _acArrowLeft[] = {
  ____XX__, ________,
  __XXXX__, ________,
  XXXXXXXX, XX______,
  __XXXX__, ________,
  ____XX__, ________
};



/* Dialog resource of numpad */
static const GUI_WIDGET_CREATE_INFO _aDialogNumPad[] = {
   /*  Function                 Text      Id                 Px   Py   Dx   Dy */
  { WINDOW_CreateIndirect,   0,        0,                40, 110,  176, 136+30},
       
  { EDIT_CreateIndirect,      "",      GUI_ID_EDIT1,       5,   5,  176, 30},
               
  { BUTTON_CreateIndirect,   "Del",    GUI_ID_USER + 15,   5,   5+30,  30,  30},
  { BUTTON_CreateIndirect,   "7",      GUI_ID_USER +  7,  37,   5+30,  30,  30},
  { BUTTON_CreateIndirect,   "8",      GUI_ID_USER +  8,  69,   5+30,  30,  30},
  { BUTTON_CreateIndirect,   "9",      GUI_ID_USER +  9,  101,  5+30,  30,  30},
  { BUTTON_CreateIndirect,   "Bcks",   GUI_ID_USER + 14,  133,  5+30,  36,  30},
       
  { BUTTON_CreateIndirect,   ":",      GUI_ID_USER + 13,   5,  37+30,  30,  30},
  { BUTTON_CreateIndirect,   "4",      GUI_ID_USER +  4,  37,  37+30,  30,  30},
  { BUTTON_CreateIndirect,   "5",      GUI_ID_USER +  5,  69,  37+30,  30,  30},
  { BUTTON_CreateIndirect,   "6",      GUI_ID_USER +  6,  101, 37+30,  30,  30},
{ BUTTON_CreateIndirect,   "Ins",    GUI_ID_USER + 16,  133, 37+30,  36,  30},

  { BUTTON_CreateIndirect,   "+",      GUI_ID_USER + 12,   5,  69+30,  30,  30},
  { BUTTON_CreateIndirect,   "1",      GUI_ID_USER +  1,  37,  69+30,  30,  30},
  { BUTTON_CreateIndirect,   "2",      GUI_ID_USER +  2,  69,  69+30,  30,  30},
  { BUTTON_CreateIndirect,   "3",      GUI_ID_USER +  3,  101, 69+30,  30,  30},
  { BUTTON_CreateIndirect,   "Ent",    GUI_ID_USER + 17,  133, 69+30,  36,  30},

  { BUTTON_CreateIndirect,   0,        GUI_ID_USER + 18,  5,   101+30,  30,  30},  //ArrowLeft
  { BUTTON_CreateIndirect,   "0",      GUI_ID_USER +  0,  37,  101+30,  30,  30},
  { BUTTON_CreateIndirect,   "-",      GUI_ID_USER + 11,  69,  101+30,  30,  30},
  { BUTTON_CreateIndirect,   ".",      GUI_ID_USER + 10,  101, 101+30,  30,  30},
  { BUTTON_CreateIndirect,   0,        GUI_ID_USER + 19,  133, 101+30,  36,  30},  //ArrowRight

};


/*
********************************************************************
*
*       _cbDialogNumPad
*
********************************************************************
*/
static void _cbDialogNumPad(WM_MESSAGE * pMsg) {
       
  GUI_RECT r;               
  int i, NCode, Id, Pressed = 0;       
  WM_HWIN hDlg, hItem;       
  WM_MESSAGE end_Msg;       
       
  hDlg = pMsg->hWin;       
       
  switch (pMsg->MsgId) {
  case KEYPAD_UPDATE_MSG: //数字小键盘: 更新数据消息
     if(kpad_mdf.id_press>0){
        hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);
        EDIT_SetText(hItem,kpad_mdf.mdf_buff);
     }else{
        hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);
        EDIT_SetText(hItem,"");
    }
    WM_SetFocus(hItem);               
    break;
  case WM_PAINT:
    WM_GetClientRect(&r);
    GUI_SetColor(0x000000);
    GUI_DrawRect(r.x0, r.y0, r.x1, r.y1);          /* Draw rectangle around it */

    /* Draw the bright sides */
    GUI_SetColor(0xffffff);
    GUI_DrawHLine(r.y0 + 1, r.x0 + 1, r.x1 - 2);   /* Draw top line */
    GUI_DrawVLine(r.x0 + 1, r.y0 + 1, r.y1 - 2);

    /* Draw the dark sides */
    GUI_SetColor(0x555555);
    GUI_DrawHLine(r.y1-1, r.x0 + 1, r.x1 - 1);
    GUI_DrawVLine(r.x1-1, r.y0 + 1, r.y1 - 2);
    break;
  case WM_INIT_DIALOG:
    for (i = 0; i < GUI_COUNTOF(_aDialogNumPad) - 1; i++) {
      hItem = WM_GetDialogItem(hDlg, GUI_ID_USER + i);
      BUTTON_SetFont(hItem, &GUI_FontHZ_Saf_16);
      BUTTON_SetFocussable(hItem, 0);     /* Set all buttons non focussable */
      switch (i) {
      case 18:
        BUTTON_SetBitmapEx(hItem, 0, &_bmArrowLeft, 10, 12);  /* Set bitmap for arrow left button (unpressed) */
        BUTTON_SetBitmapEx(hItem, 1, &_bmArrowLeft, 10, 12);  /* Set bitmap for arrow left button (pressed) */
        break;
      case 19:
        BUTTON_SetBitmapEx(hItem, 0, &_bmArrowRight, 10, 12); /* Set bitmap for arrow right button (unpressed) */
        BUTTON_SetBitmapEx(hItem, 1, &_bmArrowRight, 10, 12); /* Set bitmap for arrow right button (pressed) */
        break;
      }
    }   
               
    hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);
    EDIT_SetMaxLen(hItem,30);       
    EDIT_SetBkColor(hItem,0,GUI_BLACK);               
    EDIT_SetFont(hItem,&GUI_Font24B_1);
    EDIT_SetTextAlign(hItem,GUI_TA_VCENTER|GUI_TA_LEFT);
    EDIT_SetTextColor(hItem,0,GUI_RED);                               
               
    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);      /* Id of widget */
    NCode = pMsg->Data.v;                 /* Notification code */   
          
    switch (NCode) {
        case WM_NOTIFICATION_CLICKED:
                               
            if(Id ==(GUI_ID_USER + 17)) {  //"ENT"按键----按下
                hItem =WM_GetDialogItem(hDlg, GUI_ID_USER + 17);
                BUTTON_SetBkColor(hItem,BUTTON_CI_PRESSED,GUI_GREEN); //按下时--绿色背景
            }
                               
            Pressed = 1;
                               
            break;
        case WM_NOTIFICATION_RELEASED:
            if ((Id >= GUI_ID_USER) && (Id <= (GUI_ID_USER + GUI_COUNTOF(_aDialogNumPad) - 1))) {                                       
                int Key;                                       
                if (Id < GUI_ID_USER + 14) {
                   char acBuffer[10];
                   BUTTON_GetText(pMsg->hWinSrc, acBuffer, sizeof(acBuffer));   /* Get the text of the button */
                   Key = acBuffer[0];
                } else {
                   Key = _aKey[Id - GUI_ID_USER - 13];    /* Get the text from the array */                                               
                  if(Id ==(GUI_ID_USER + 17)){ //"ENT"按键---抬起
                        hItem =WM_GetDialogItem(hDlg, GUI_ID_USER + 17);
                        BUTTON_SetBkColor(hItem,BUTTON_CI_UNPRESSED,0xAAAAAA);                                                       
                                                       
                        hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);
                        EDIT_GetText(hItem,kpad_mdf.mdf_buff,sizeof(kpad_mdf.mdf_buff));
                                                       
                        kpad_mdf.flag_ent=1;//set
                         end_Msg.MsgId = KEYPAD_UPDATE_END;        //向源窗体--->发送确认修改消息                                                 
                         WM_SendMessage(WM_GetClientWindow(kpad_mdf.wm_src), &end_Msg);                                                        
                   }                                               
               }                                       
                Pressed = 1;                                               
                GUI_SendKeyMsg(Key, Pressed);     /* Send a key message to the focussed window */
            }
        break;
     }
    default:
      WM_DefaultProc(pMsg);
  }
}       




/***最右上角,关闭数字小键盘按钮的回调函数*****/
static void _cbPadClose(WM_MESSAGE *pMsg)
{
   if (pMsg->MsgId == WM_NOTIFY_PARENT_REFLECTION){
        WM_HideWindow(pMsg->hWinSrc);        // 隐藏窗体
        WM_HideWindow(hNumPad);                // 隐藏小键盘       
        return;                                                                           
    }
    BUTTON_Callback(pMsg);
}



void Virtual_KeyPadWin(void)
{
        hwin_keypad=FRAMEWIN_CreateEx(
              40,90,176, 20,0,WM_CF_HIDE| WM_CF_STAYONTOP,
              FRAMEWIN_CF_MOVEABLE,  0,"Keypad",_cbWinPad_key                                     
        );          
       
        hButton_pad=FRAMEWIN_AddButton(hwin_keypad,FRAMEWIN_BUTTON_RIGHT,0,GUI_ID_USER +101);         

        WM_SetCallback(hButton_pad, _cbPadClose); //添加增加按钮的回调函数         
        hNumPad = GUI_CreateDialogBox(_aDialogNumPad,  GUI_COUNTOF(_aDialogNumPad),_cbDialogNumPad, WM_HBKWIN, 0, 0);

        WM_SetStayOnTop(hwin_keypad, 1);
        WM_SetStayOnTop(hNumPad, 1);
       
        WM_HideWindow(hNumPad); //隐藏         

        while(1)  {                   
           OSTimeDly (100);                    
      }          
}


回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2021-1-12 09:16:03 | 显示全部楼层
xfcbbs2 发表于 2021-1-12 08:45
/* Array of keys */
static int _aKey[] = {
GUI_KEY_ESCAPE,

那hwin_keypad是哪个窗口?
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2021-1-12 15:18:29 | 显示全部楼层
xfcbbs2 发表于 2021-1-12 09:15
//数字小键盘,构建的源代码,绝对是自己原创,都使用好多年了!

/* Array of keys */

非常棒,点赞
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2021-1-12 15:22:08 | 显示全部楼层
那我要分开存放每个EDIT控件的值的话要怎么弄
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2021-1-12 16:55:10 | 显示全部楼层
本帖最后由 zxc19970106 于 2021-1-13 11:15 编辑
xfcbbs2 发表于 2021-1-12 09:15
//数字小键盘,构建的源代码,绝对是自己原创,都使用好多年了!

/* Array of keys */

我按照你这种方法弄了一下,小键盘的代码都一样的。
点击按钮消息如下:
if (!NumPadCreateFlag)
{
hItemNumPad=GUI_CreateDialogBox(_aDialogCreateNumPadPage,GUI_COUNTOF(_aDialogCreateNumPadPage),_cbDialogNumPad, WM_HBKWIN, 0, 0);
NumPadCreateFlag = 1;
}
WM_SetStayOnTop(hItemNumPad, 1);
WM_HideWindow(hItemNumPad);
怎么就死机了
回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-13 13:59:46 | 显示全部楼层
zxc19970106 发表于 2021-1-12 15:22
那我要分开存放每个EDIT控件的值的话要怎么弄

获取每一个EDIT控件的内容,分开存储就可以了。
多么简单的事情那,还要手把手教你吗?
回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-13 14:16:38 | 显示全部楼层
zxc19970106 发表于 2021-1-12 16:55
我按照你这种方法弄了一下,小键盘的代码都一样的。
点击按钮消息如下:
if (!NumPadCreateFlag)


1、总的应用程序框架不同,你们采用的都是裸奔的,或者是串行执行的。
我采用的程序框架是多任务的,是具有嵌入式系统支持的。

2、我的系统键盘有2种:数字小键盘,标准键盘。

     2种键盘,根据需要,自由切换,非常方便。
    不使用时自动隐藏,点击输入时自动显示,使用完毕自动关闭。



数字小键盘2.png


标准键盘.png
标准键盘:字符,数字,大小写切换,字符数字切换
                 Shift----大小写切换
                 123..---字符数字切换







回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-13 14:20:46 | 显示全部楼层

请看我在项目下使用的实例:
参数设置.png

油品信息.png


回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2021-1-13 17:45:33 | 显示全部楼层
xfcbbs2 发表于 2021-1-13 14:16
1、总的应用程序框架不同,你们采用的都是裸奔的,或者是串行执行的。
我采用的程序框架是多任务的, ...

我这个也是用了ucos3操作系统的啊
是不是这代码有问题
static const GUI_WIDGET_CREATE_INFO _aDialogCreateNumPadPage[] = {
{ WINDOW_CreateIndirect,   "",       ID_WINDOW_0,         312, 140,  400,    368},
        
  { EDIT_CreateIndirect,    "",      ID_EDIT_0,        10,    10,  380,    30 },
        { BUTTON_CreateIndirect, "Clr",                 ID_BUTTON_13,                   241,    55,   72,    72 },         // Clr
  { BUTTON_CreateIndirect, "Esc",                 ID_BUTTON_12,                   318,    55,   72,    72 },         // Esc
  { BUTTON_CreateIndirect, "Bs",                 ID_BUTTON_14,                   241,   132,   72,    72 },         // Bs
  { BUTTON_CreateIndirect, "-",                   ID_BUTTON_11,       164,   286,   72,    72 },         // -
  { BUTTON_CreateIndirect, "1",      ID_BUTTON_1,        10,   209,   72,    72 },  // 1
  { BUTTON_CreateIndirect, "2",      ID_BUTTON_2,        87,   209,   72,    72 },  // 2
  { BUTTON_CreateIndirect, "3",      ID_BUTTON_3,              164,   209,   72,    72 },  // 3
  { BUTTON_CreateIndirect, "4",      ID_BUTTON_4,               10,   132,   72,    72 },  // 4
  { BUTTON_CreateIndirect, "5",      ID_BUTTON_5,               87,   132,   72,    72 },  // 5
  { BUTTON_CreateIndirect, "6",      ID_BUTTON_6,             164,   132,   72,    72 },  // 6
  { BUTTON_CreateIndirect, "7",      ID_BUTTON_7,               10,    55,   72,    72 },  // 7
  { BUTTON_CreateIndirect, "8",      ID_BUTTON_8,              87,    55,   72,    72 },  // 8
  { BUTTON_CreateIndirect, "9",      ID_BUTTON_9,             164,    55,   72,    72 },  // 9
  { BUTTON_CreateIndirect, "0",      ID_BUTTON_0,              87,   286,   72,    72},  // 0
  { BUTTON_CreateIndirect, ".",      ID_BUTTON_10,              10,   286,   72,    72 },  // .
  { BUTTON_CreateIndirect, "Del",          ID_BUTTON_15,             318,   132,   72,    72 },  // 删除按钮
  { BUTTON_CreateIndirect, "ENTER",  ID_BUTTON_16,             241,   286,  149,    72 },  // 回车按钮
  { BUTTON_CreateIndirect,                 0,                  ID_BUTTON_17,                   241,   209,   72,    72 },   //光标向左移动一个字符
  { BUTTON_CreateIndirect,                 0,                  ID_BUTTON_18,                   318,   209,   72,    72 },   //光标向右移动一个字符
};


// 数字键盘窗口回调函数
static void _cbDialogNumPad(WM_MESSAGE * pMsg)
{
        int                 Key;
        int     Pressed;
        int     NCode;
  int     Id;
        int     i;
//        WM_HWIN hItem= pMsg->hWin;
        Pressed = 0;
        WM_HWIN hDlg,hItem;
        hDlg = pMsg->hWin;
        WM_MESSAGE end_Msg;
        switch (pMsg->MsgId) {

                case WM_INIT_DIALOG:
       
   
                        // 按键禁止输入焦点
                        for(i = 0; i < ID_BUTTON_18 - ID_BUTTON_0 + 1; i++)
                        {
                                hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0 + i);
                                BUTTON_SetBkColor(hItem,BUTTON_CI_UNPRESSED,GUI_LIGHTGRAY);
                                BUTTON_SetFont(hItem,GUI_FONT_24_ASCII);
                                BUTTON_SetFocussable(hItem,0);
                        }
                       
                        hItem = WM_GetDialogItem(hDlg,ID_EDIT_0);
                        EDIT_SetMaxLen(hItem,30);
                        EDIT_SetBkColor(hItem,0,GUI_BLACK);
                        EDIT_SetFont(hDlg,&GUI_FontHZ32);
                        EDIT_SetTextAlign(hDlg,GUI_TA_VCENTER | GUI_TA_LEFT);
                        EDIT_SetTextColor(hItem,0,GUI_RED);
       
    break;
                case KEYPAD_UPDATE_MSG:
                        if(kpad_mdf.id_press>0){
                                hItem = WM_GetDialogItem(hDlg,ID_EDIT_0);
                                EDIT_SetText(hItem,kpad_mdf.mdf_buff);
                        }       
                        else{
                                hItem = WM_GetDialogItem(hDlg,ID_EDIT_0);
                                EDIT_SetText(hItem,"");
                        }
                        WM_SetFocus(hItem);
                        break;
          case WM_PAINT:
                GUI_SetBkColor(GUI_GRAY);
                GUI_Clear();
                break;
               
          case WM_NOTIFY_PARENT:
                Id    = WM_GetId(pMsg->hWinSrc);
                NCode = pMsg->Data.v;
                switch(Id) {
                        case WM_NOTIFICATION_CLICKED:
                                        if(Id == ID_BUTTON_1)
                                                break;
                                        Pressed  = 1;
                        case WM_NOTIFICATION_RELEASED:
                                        if((Id >= ID_BUTTON_0)&&(Id <= (ID_BUTTON_18 - ID_BUTTON_0 + 1))){
                                                               
                                                               
                                                                        int Key;
                                               
                                                                        if(Id < ID_BUTTON_12){
                                                                                char acBuffer[10];
                                                                                BUTTON_GetText(pMsg->hWinSrc,acBuffer,sizeof(acBuffer));
                                                                                Key = acBuffer[0];
                                                                        }
                                                                        else
                                                                        {
                                                                                Key = _aKey[Id - (ID_BUTTON_18-ID_BUTTON_12)];
                                                                               
                                                                               
                                                                                if(Id ==(ID_BUTTON_18)){
                                                                                 hItem = WM_GetDialogItem(hDlg, ID_EDIT_0);  
                     EDIT_GetText(hItem,kpad_mdf.mdf_buff,30);  //获取编辑后的内容
                                                                                       
                                                                                kpad_mdf.flag_ent=1;//set
                                                                                end_Msg.MsgId = KEYPAD_UPDATE_END;        //向源窗体--->发送确认修改消息                                                
                                                                                WM_SendMessage(WM_GetClientWindow(kpad_mdf.wm_src), &end_Msg);           
                                                                                }
                                                                        }
                                 }
                break;
                         }
                break;
        default:
                WM_DefaultProc(pMsg);
        }                                       
}                                                                       
               


回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-13 19:23:11 | 显示全部楼层
zxc19970106 发表于 2021-1-13 17:45
我这个也是用了ucos3操作系统的啊
是不是这代码有问题
static const GUI_WIDGET_CREATE_INFO _aDialogC ...

你的回调函数: _cbDialogNumPad();
消息处理分支下面的:
   case WM_NOTIFICATION_CLICKED:
                                       //if(Id == ID_BUTTON_1) //ID_BUTTON_1)终止,什么意思??
                                               
                                        Pressed  = 1;
                                       break;
  case WM_NOTIFICATION_RELEASED:
               //最后缺少:
               Pressed = 1;                                               
              GUI_SendKeyMsg(Key, Pressed);


回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-13 19:24:43 | 显示全部楼层
zxc19970106 发表于 2021-1-13 17:45
我这个也是用了ucos3操作系统的啊
是不是这代码有问题
static const GUI_WIDGET_CREATE_INFO _aDialogC ...

我帖子最后你发的小键盘的回调处理函数,是完整的,你完全可以拷贝测试!!!
回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-13 19:29:40 | 显示全部楼层
zxc19970106 发表于 2021-1-13 17:45
我这个也是用了ucos3操作系统的啊
是不是这代码有问题
static const GUI_WIDGET_CREATE_INFO _aDialogC ...

还有就是:函数 Virtual_KeyPadWin();

是在一个单独的任务内调用的,你的设置还要支持多任务:

#define GUI_OS        (1)  

void Task_Virtual_KeyPad(void *p_arg)
{       
         (void)p_arg;   
       
         while(1)
          {                       
                Virtual_KeyPadWin();               
               GUI_Delay(100);         
        }
}
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2021-1-14 09:54:18 | 显示全部楼层
xfcbbs2 发表于 2021-1-13 19:29
还有就是:函数 Virtual_KeyPadWin();

是在一个单独的任务内调用的,你的设置还要支持多任务:

这个 hwin_keypad=FRAMEWIN_CreateEx( 40,90,176, 20,0,WM_CF_HIDE| WM_CF_STAYONTOP,FRAMEWIN_CF_MOVEABLE,  0,"Keypad",_cbWinPad_key);
里的_cbWinPad_key回调函数是什么?可以给个完整点的工程参考下吗?只要小键盘和接收窗口的,不然有好多问题没法解决
回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-14 11:19:30 | 显示全部楼层
zxc19970106 发表于 2021-1-14 09:54
这个 hwin_keypad=FRAMEWIN_CreateEx( 40,90,176, 20,0,WM_CF_HIDE| WM_CF_STAYONTOP,FRAMEWIN_CF_MOVEAB ...



void _cbWinPad_key(WM_MESSAGE * pMsg) {
  int pos_x,pos_y;                

  switch (pMsg->MsgId)
  {
        case WM_DELETE:               
                break;
        case WM_PAINT:        
                FRAMEWIN_SetBarColor(hwin_keypad,0,GUI_GRAY);
                FRAMEWIN_SetTitleHeight(hwin_keypad,18);                       
                BUTTON_SetText(hButton_pad,"X");       
                break;                               
          case WM_MOVE:                         
                pos_x=WM_GetWindowOrgX(hwin_keypad);
                pos_y=WM_GetWindowOrgY(hwin_keypad);
               
                WM_MoveTo(hNumPad,pos_x,pos_y+20);                                    
                break;
        case WM_NOTIFY_PARENT:               
                break;
        default:
           WM_DefaultProc(pMsg);
  }       

}




回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2021-1-14 14:29:40 | 显示全部楼层
xfcbbs2 发表于 2021-1-6 16:21
实现楼主要求的功能:键盘上的EDIT控件,获取点击的EDIT框里的值,并且修改  

hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT2);
x_pos=WM_GetWindowOrgX(hItem);
y_pos=WM_GetWindowOrgY(hItem);         
KeyPad_Update_Process(hDlg,Id); //数字小键盘更新数据处理                                                                                                                                                                                                           
WM_MoveTo(hwin_keypad,x_pos-15,y_pos-20);        //移动窗口                                                                                                         
WM_ShowWindow(hwin_keypad);   //
WM_ShowWindow(hNumPad); //显示虚拟键盘
这一段不是要分别获取所有编辑框的句柄吗?应该还要加上hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT0); hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT1);吧,还有KeyPad_Update_Process(hDlg,Id)这个Id不是要写具体是哪个控件吗?
回复

使用道具 举报

6

主题

27

回帖

45

积分

新手上路

积分
45
发表于 2021-1-14 14:59:26 | 显示全部楼层
zxc19970106 发表于 2021-1-14 14:29
hItem = WM_GetDialogItem(hDlg, GUI_ID_EDIT2);
x_pos=WM_GetWindowOrgX(hItem);
y_pos=WM_GetWin ...

做什么,都要去理解!

光靠喂食,是永远也长不大的!

我是为了给你们提供方便,才回帖的!

我没有责任方方面面去给你解释!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 12:27 , Processed in 0.270769 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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