硬汉嵌入式论坛

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

[emWin] ListBox绘制

[复制链接]

7

主题

13

回帖

34

积分

新手上路

积分
34
发表于 2024-10-20 21:11:10 | 显示全部楼层 |阅读模式
请问一下:emWin里的ListBox列表框选中某一行,这一行是有数据的,我进去设置然后出来为什么会从第一行开始绘制,正常应该是保持选中行
的相对位置来绘制整个列表框的,现在从第一行开始绘制,选中行的相对位置就下移了,是哪里的问题呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2024-10-21 09:26:25 | 显示全部楼层
没太理解楼主的意思,意思是选中listbox的一行,弹出个对话框,在对话框里面设置listbox样式,关闭后,希望继续选择这行,是这样的意思不
回复

使用道具 举报

7

主题

13

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2024-10-21 10:03:53 | 显示全部楼层
eric2013 发表于 2024-10-21 09:26
没太理解楼主的意思,意思是选中listbox的一行,弹出个对话框,在对话框里面设置listbox样式,关闭后,希望 ...

大佬,现在选中的行是正确的
我的情况是:现在列表框显示不完所有的选项,当我向上滑动,第一行或者前面几行被隐藏了之后,我从当前选中的行点击进去设置好数据(选中进去也是一个列表框)返回之后,列表框是从被隐藏的第一行开始绘制的,那这样我原来选中的行的位置不就在整个页面提前了吗?但是我希望还是保持选中之前的相对位置,就是说不要从原始的第一行开始绘制,就从点击进去的时候显示的第一行开始显示
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2024-10-21 11:58:43 | 显示全部楼层
YISHUI 发表于 2024-10-21 10:03
大佬,现在选中的行是正确的
我的情况是:现在列表框显示不完所有的选项,当我向上滑动,第一行或者前面 ...

明白你的意思了,返回前,调用函数LISTBOX_SetSel()设置下有效果没
回复

使用道具 举报

7

主题

13

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2024-10-21 13:41:56 | 显示全部楼层
eric2013 发表于 2024-10-21 11:58
明白你的意思了,返回前,调用函数LISTBOX_SetSel()设置下有效果没

大佬,下面这个是我描述的函数,已经是调用了LISTBOX_SetSel()
//========================================================================
void _cbViewTaskSet2Win(WM_MESSAGE * pMsg)
{
        int     NCode;
    int     Id;
    WM_HWIN hItem;

    switch (pMsg->MsgId)
    {
                case WM_PAINT:
                {
                        GUI_RECT Rect;

                        if(POWER_CHANNEL_1 == g_CurSelectPowerChannel)
            {
                l_snprintf((char *)g_DispBuf,sizeof(g_DispBuf),"CH1 ");
            }
            else if(POWER_CHANNEL_2 == g_CurSelectPowerChannel)
            {
                l_snprintf((char *)g_DispBuf,sizeof(g_DispBuf),"CH2 ");
            }
            else
            {
                l_snprintf((char *)g_DispBuf,sizeof(g_DispBuf),"CH1&CH2 ");
            }
            strcat((char *)g_DispBuf,(const char *)GetLanguageString(STR_TASK_SETING));
                        GUI_SetColor(VIEW_TITLE_COLOR);
                        GUI_SetBkColor(VIEW_TITLE_BKCOLOR);
                        WM_GetClientRect(&Rect);
                        Rect.y1 = VIEW_TITLE_YSIZE - 1 - 1;
                        GUI_DispStringInRectFill((char *)g_DispBuf,&Rect,GUI_TA_HCENTER | GUI_TA_VCENTER);
                        GUI_SetColor(VIEW_TITLE_LINE_COLOR);
                        GUI_DrawHLine(VIEW_TITLE_YSIZE - 1,0,Rect.x1);
                }
                break;
        case WM_INIT_DIALOG:
        {
            INT32U i;
            INT32U bHaveFocuse;
            ViewTaskData_t ViewTaskData;
                        INT32U Sel,Cnt;

                        g_TaskContent.BalanceVoltage_mV = CalculatorBestBalanceVoltage(g_CurSelectPowerChannel);
            WM_SetCallback(pMsg->hWin,_cbWINDOW);
            hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_0);
            g_TaskContent.PowerVoltage_mV = g_GUIPara.OutputVoltage[g_CurSelectPowerChannel&1] * 100;
                        g_TaskContent.SetPower_mW = g_GUIPara.OutputPower_W[g_CurSelectPowerChannel&1] * 1000;
            //ViewTaskData.ItemDataFocusMsk = 0x3F;
            ViewTaskData.ItemDataFocusMsk = 0xFF;
            //ViewTaskData.ItemNoDataMsk = 0x18;
            ViewTaskData.ItemNoDataMsk = 0x78;
            WINDOW_SetUserData(pMsg->hWin,&ViewTaskData,sizeof(ViewTaskData));
            WINDOW_SetBkColor(pMsg->hWin,VIEW_TITLE_BKCOLOR);
            // Initialization of 'Listbox'
            hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_0);
            bHaveFocuse = TRUE;
            LISTBOX_SetUserData(hItem,&bHaveFocuse,sizeof(bHaveFocuse));

            for(i = ID_VTASK2_TASK;i <= ID_VTASK2_CANCEL;i++)
            {
                LISTBOX_AddString(hItem, "");
            }
            LISTBOX_SetTextAlign(hItem, GUI_TA_VCENTER | GUI_TA_LEFT);
            LISTBOX_SetFont(hItem, &GUI_DEFAULT_FONT);
            LISTBOX_SetItemSpacing(hItem, LIST_BOX_ITEM_SIZE - GUI_GetYDistOfFont(LISTBOX_GetFont(hItem)));
            LISTBOX_SetOwnerDraw(hItem, _ViewTask2ListBoxOwnerDraw);
            LISTBOX_SetSel(hItem,g_CurPageId.Id - 1);
            WM_SetCallback(hItem, _cbViewListBoxUser);
                        //LISTBOX_SetBkColor(hItem,LISTBOX_CI_UNSEL,VIEW_BK_NFCOLOR);
                        Sel = LISTBOX_GetSel(hItem);
            Cnt = LISTBOX_GetNumItems(hItem);

            hItem = WM_GetDialogItem(pMsg->hWin, ID_SCROLL_BAR1);
            ScrollBar_SetValue(hItem,Sel,Cnt);
            ScrollBar_SetColor(hItem,VIEW_ScrollBar_COLOR);
            ScrollBar_SetBkColor(hItem,VIEW_BK_NFCOLOR);
            ScrollBar_SetLBlank(hItem,1);
            ScrollBar_SetRBlank(hItem,1);
        }
        break;
        case WM_USER_UPDATA:
        {
            //ViewTaskData_t ViewTaskData;

            //WINDOW_GetUserData(pMsg->hWin,&ViewTaskData,sizeof(ViewTaskData));
            //g_TaskContent.Current = C_100MA_TO_MA(GetTaskCurrent(g_TaskContent.Task));
            //ViewTaskData.ItemDataFocusMsk = 0x0F;
            //ViewTaskData.ItemNoDataMsk = 0x14;
            //WINDOW_SetUserData(pMsg->hWin,&ViewTaskData,sizeof(ViewTaskData));
        }
        break;
        case WM_KEY:
        {
            if (((WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt)
            {
                ProcessKeyEvent(((WM_KEY_INFO*)(pMsg->Data.p))->Key, ((WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt);
            }
        }
        break;
                case WM_NOTIFY_PARENT:
        {
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch (Id)
            {
                case ID_LISTBOX_0: // Notifications sent by 'Listbox'
                switch (NCode)
                {
                    case WM_NOTIFICATION_CLICKED: break;
                    case WM_NOTIFICATION_RELEASED: break;
                    case WM_NOTIFICATION_SEL_CHANGED:
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_LISTBOX_0);
                                                //LISTBOX_SetBkColor(hItem,LISTBOX_CI_SEL,VIEW_BK_FCOLOR);
                        g_PrePageId.Id= g_CurPageId.Id;
                        g_CurPageId.Id = LISTBOX_GetSel(hItem) + 1;
                                                hItem = WM_GetDialogItem(pMsg->hWin,ID_SCROLL_BAR1);
                        ScrollBar_SetValue(hItem,g_CurPageId.Id - 1,ScrollBar_GetNumbers(hItem));
                    break;
                }
                break;
            }
        }
        break;
        default: WM_DefaultProc(pMsg);  break;
    }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2024-10-22 09:58:21 | 显示全部楼层
YISHUI 发表于 2024-10-21 13:41
大佬,下面这个是我描述的函数,已经是调用了LISTBOX_SetSel()
//==================================== ...

你这个弹出新的窗口后,你的listbox所在的父窗口没有删除吧,如果没有删除,我看你这个仅仅是创建对话框的时候调用了下 LISTBOX_SetSel
回复

使用道具 举报

7

主题

13

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2024-10-22 10:49:51 | 显示全部楼层
eric2013 发表于 2024-10-22 09:58
你这个弹出新的窗口后,你的listbox所在的父窗口没有删除吧,如果没有删除,我看你这个仅仅是创建对话框 ...

大佬,不太理解你说的父窗口是指哪个?是初始的选中项目所在的窗口吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116223
QQ
发表于 2024-10-23 10:27:30 | 显示全部楼层
YISHUI 发表于 2024-10-22 10:49
大佬,不太理解你说的父窗口是指哪个?是初始的选中项目所在的窗口吗?

listbox所在窗口
回复

使用道具 举报

7

主题

13

回帖

34

积分

新手上路

积分
34
 楼主| 发表于 2024-10-24 11:42:56 | 显示全部楼层

大佬,找到问题了,确实是删除了窗口,在绘制函数之前删除了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 11:12 , Processed in 0.281852 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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