硬汉嵌入式论坛

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

[emWin] 关于LISTBOX_SetOwnerDraw设置的回调函数触发条件

[复制链接]

10

主题

16

回帖

46

积分

新手上路

积分
46
发表于 2025-12-18 14:08:20 | 显示全部楼层 |阅读模式
关于LISTBOX列表框有疑问:
LISTBOX_SetOwnerDraw(hItem, _StringInputsListBoxOwnerDraw);

在使用LISTBOX_SetOwnerDraw设置回调函数之后,这个回调函数的触发条件是什么,是有按键消息
WM_KEY,还是说选中项改变WM_NOTIFICATION_SEL_CHANGED,因为在回调函数里设置了按键按下时修改当前项的颜色
但是只在向上按键和向下按键才刷新,想要弄清楚是怎么触发回调函数的?


        case WM_KEY:
        {
            int Key;
            int Val;
            Key = ((WM_KEY_INFO*)(pMsg->Data.p))->Key;
            WINDOW_GetUserData(pMsg->hWin,&hItem,sizeof(hItem));
            WM_RestartTimer(hItem,g_DataInput.TimeOutMS/portTICK_PERIOD_MS);
            if(((WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt)
            {  
                if(KEY_CH == Key)
                {
                    WM_DeleteWindow(pMsg->hWin);
                    g_CurPageId = g_PrePageId;
                    TurnToFocus();
                }
                else if(GUI_KEY_ENTER == Key)
                {
                    hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_0);
                    if(0 == (g_DataInput.UnSelMask & (1 << LISTBOX_GetSel(hItem))))
                    {
                        Val = LISTBOX_GetSel(hItem) + g_DataInput.Min;
                        if(NULL != g_DataInput.pData)
                        {
                            if(1 == g_DataInput.DataSize)
                            {
                                *((INT8U *)g_DataInput.pData)  = Val;
                            }
                            else if(2 == g_DataInput.DataSize)
                            {
                                *((INT16U *)g_DataInput.pData) = Val;
                            }
                            else if(4 == g_DataInput.DataSize)
                            {
                                *((INT32U *)g_DataInput.pData) = Val;
                            }
                        }
                        if(NULL != g_DataInput.cb)
                        {
                            (*g_DataInput.cb)(Val);
                        }
                        WM_DeleteWindow(pMsg->hWin);
                        g_CurPageId = g_PrePageId;
                        TurnToFocus();
                    }
                }
                else if(KEY_UP == Key)
                {
                    hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_0);
                    LISTBOX_GetUserData(hItem,&ShowIndex,sizeof(ShowIndex));
                    if(0 != ShowIndex)
                    {
                        ShowIndex--;
                    }
                    LISTBOX_SetUserData(hItem,&ShowIndex,sizeof(ShowIndex));
                }
                else if(KEY_DOWN == Key)
                {
                    hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_0);
                    LISTBOX_GetUserData(hItem,&ShowIndex,sizeof(ShowIndex));
                    MaxLen = DATA_INPUT_MAX_ITEMS - 1;
                    if(MaxLen >= LISTBOX_GetNumItems(hItem))
                    {
                        MaxLen = LISTBOX_GetNumItems(hItem) - 1;
                    }
                    if(ShowIndex < MaxLen)
                    {
                        ShowIndex++;
                        LISTBOX_SetUserData(hItem,&ShowIndex,sizeof(ShowIndex));
                    }
                }
            }
        }
        break;
        case WM_NOTIFY_PARENT:
        {
            INT32U Id,NCode;
            INT32U Sel;

            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch (Id)
            {
                case ID_LISTBOX_0:
                switch (NCode)
                {
                    case WM_NOTIFICATION_CLICKED: break;
                    case WM_NOTIFICATION_RELEASED: break;
                    case WM_NOTIFICATION_SEL_CHANGED:
                        WINDOW_GetUserData(pMsg->hWin,&hItem,sizeof(hItem));
                        WM_RestartTimer(hItem,g_DataInput.TimeOutMS/portTICK_PERIOD_MS);
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_0);
                        Sel = LISTBOX_GetSel(hItem);
                        hItem = WM_GetDialogItem(pMsg->hWin,ID_SCROLL_BAR1);
                        ScrollBar_SetValue(hItem,Sel,ScrollBar_GetNumbers(hItem));
                    break;
                }
                break;
            }
        }
        break;


回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
发表于 2025-12-19 11:16:13 | 显示全部楼层
应该是需要重绘的时候会触发。

有个手动强行WM PAINT的API,你试试行不行。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-9 16:56 , Processed in 0.048293 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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