|
本帖最后由 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;
}
|
|