硬汉嵌入式论坛

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

[emWin] STemWin ListBox项进行原位置编辑的方法分享

[复制链接]

3

主题

43

回帖

52

积分

初级会员

积分
52
发表于 2020-9-27 16:48:18 | 显示全部楼层 |阅读模式
本帖最后由 lhb292 于 2020-9-27 17:00 编辑

在ListBox项的原位置创建MULTIEDIT并把项内容复制到MULTIEDIT的方式实现ListBox项的原位置编辑。

WM_HWIN hDesktop;
/**********************************************************************/
static const GUI_WIDGET_CREATE_INFO _aDialogCreateDesktop[] = {
  { WINDOW_CreateIndirect,    "Window",     ID_DESKTOP_WINDOW_MAIN,    0, 0, XSIZE_PHYS, YSIZE_PHYS, 0, 0x0, 0 },
  { LISTBOX_CreateIndirect,   "Listbox",    ID_DESKTOP_LISTBOX_MAIN,   -1, 40, XSIZE_PHYS+2, 202, 0, 0x0, 0 },
  { MULTIEDIT_CreateIndirect, "Multiedit",  ID_DESKTOP_MULTIEDIT_MAIN, 0, 40, XSIZE_PHYS, 20, 0, 0x0, 0 },
};

/*********************************************************************/
static void _cbWindowListBox(WM_MESSAGE * pMsg);
static void _cbWindowMultiEdit(WM_MESSAGE * pMsg);
static int Listbox_OwnerDraw(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo);
static void _cbDialogDesktop(WM_MESSAGE * pMsg) {//桌面回调函数
  WM_HWIN          hItem;
  int key=0;

  switch (pMsg->MsgId) {
  case WM_PAINT://绘制图形
          GUI_SetColor(GUI_BLACK);
      GUI_DrawHLine(20,0, XSIZE_PHYS);
          break;

  case WM_INIT_DIALOG://初始化控件数据

    hItem = pMsg->hWin;

    Init_Dialog_Menu(pMsg);

    //
    // Initialization of 'Listbox'
    //
                hItem = WM_GetDialogItem(pMsg->hWin, ID_DESKTOP_LISTBOX_MAIN);
                LISTBOX_SetFont(hItem, &GUI_FontHZ16);
                LISTBOX_SetItemSpacing(hItem,4);

                WM_SetCallback(hItem, _cbWindowListBox);//设置回调函数
                LISTBOX_AddString(hItem, "1:");
                LISTBOX_SetOwnerDraw(hItem, Listbox_OwnerDraw);
                WM_SetFocus(hItem);
                //
                // Initialization of 'Multiedit'
                //
                hItem = WM_GetDialogItem(pMsg->hWin, ID_DESKTOP_MULTIEDIT_MAIN);
                MULTIEDIT_SetBufferSize(hItem,RowCharsMaxLen);//设置最大字节数
                MULTIEDIT_SetMaxNumChars(hItem,RowCharsMaxLen);//设置最大字符数        
                MULTIEDIT_SetText(hItem, "");
                MULTIEDIT_SetFont(hItem, &GUI_FontHZ16);
                MULTIEDIT_SetTextColor(hItem, MULTIEDIT_CI_EDIT, GUI_BLACK);
                MULTIEDIT_SetInsertMode(hItem,1);
                MULTIEDIT_EnableBlink(hItem,800,1);//光标闪动GUI_X_GetTime()
                WM_AttachWindow(hItem,WM_GetDialogItem(pMsg->hWin, ID_DESKTOP_LISTBOX_MAIN));
                WM_SetCallback(hItem, _cbWindowMultiEdit);//设置回调函数
                WM_HideWindow(hItem);
        
    break;

        case WM_MENU://MENU控件触发消息(操作MENU后程序跑到这里)
     Menu_Menu(pMsg);
                 break;

        default:
                WM_DefaultProc(pMsg);
                break;
  }
}

/*********************************************************************/
//创建桌面和输入法窗口
WM_HWIN CreateWindowDesktop(void) {
  WM_HWIN hWin;
  //WM_SetCallback(WM_HBKWIN, _cbBkWindow);//设置桌面背景的回调函数
  hDesktop = GUI_CreateDialogBox(_aDialogCreateDesktop, GUI_COUNTOF(_aDialogCreateDesktop), _cbDialogDesktop, WM_HBKWIN, 0, 0);
  hWin = CreateWindowStatusBarInputMethod();
  return hWin;
}

/*********************************************************************/
extern s8 isListboxItemEdit(int item);
static void _cbWindowListBox(WM_MESSAGE * pMsg) {//ListBox回调函数
  //WM_HWIN          hWin;
  int key=0;
  int itemsel=-1;

  switch (pMsg->MsgId) {

        case WM_KEY://按键触发消息

                 key=(((WM_KEY_INFO*)(pMsg->Data.p))->Key);
               
                 //在Listbox中,如果编辑框显示则按任意键都聚焦到编辑框
                 if(WM_IsVisible(hDesktopMultiedit)!=0)//编辑框显示
                 {
                         WM_SetFocus(hDesktopMultiedit);//如果处于编辑状态,聚焦到编辑框
                         return;
                 }
                 
                 //列表项中文本编辑
                 if(key==GUI_KEY_SPACE)//按键按下GUI_KEY_SPACE/*(WM_IsVisible(hListboxMultiedit)==0)&&*/
                 {
                         itemsel=LISTBOX_GetSel(pMsg->hWin);
                         if(isListboxItemEdit(itemsel)==0) return;//判断是否可以编辑
                         ListboxItemEdit(pMsg->hWin,itemsel);
                         //GUI_ClearKeyBuffer();
                         return;
                 }
                 
                 //光标聚焦到菜单
                 if(key==GUI_KEY_SET)
                 {
                         WM_SetFocus(hMenuMain);//设置焦点到菜单
                 }

                 LISTBOX_Callback(pMsg);
                 break;
        default:
                LISTBOX_Callback(pMsg);
                break;
  }
}

int ListboxSelItem=-1,ListboxSelItemX0=0,ListboxSelItemY0=0;//暂存列表框正在编辑的项号
static int Listbox_OwnerDraw(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo)//列表条目编辑位置获取
{
  //WM_HWIN hWin;
  //int     Index;
  int SelItem= LISTBOX_GetSel(pDrawItemInfo->hWin);
  if(pDrawItemInfo->ItemIndex == SelItem)
  {
          ListboxSelItemX0 = pDrawItemInfo->x0;
          ListboxSelItemY0 = pDrawItemInfo->y0;
  }
  return LISTBOX_OwnerDraw(pDrawItemInfo);
}


//列表框所选项进入编辑状态
int ListboxItemEdit(WM_HWIN hListbox,int item)
{
        char str[RowCharsMaxLen]={0};
        ListboxSelItem=item;
       LISTBOX_GetItemText(hListbox,item,str,RowCharsMaxLen);
        MULTIEDIT_SetText(hDesktopMultiedit,str);

        MULTIEDIT_SetCursorOffset(hDesktopMultiedit,RowCharsMaxLen);//移动光标

        WM_MoveChildTo(hDesktopMultiedit,1,ListboxSelItemY0);//移动编辑框
        WM_ShowWindow(hDesktopMultiedit);//显示输入
        WM_SetFocus(hDesktopMultiedit);
        return item;
}

回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
发表于 2020-9-27 23:38:48 | 显示全部楼层
感谢分享,带图说明一下,效果会更好!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-17 01:16 , Processed in 0.037476 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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