硬汉嵌入式论坛

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

[ThreadX全家桶] 分享一下对 guix patient list 控件滑动死机的 初步解决方法

[复制链接]

610

主题

3060

回帖

4910

积分

至尊会员

积分
4910
发表于 2023-9-6 09:06:42 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2023-9-6 09:13 编辑

分享一下对 guix patient list 控件滑动死机的 初步解决方法

01.  patient list 滑动死机的程序:

VOID _patient_row_create(GX_VERTICAL_LIST *list, GX_WIDGET *widget, INT index)
{
        GX_RECTANGLE childsize;
        PATIENT_ROW *row = (PATIENT_ROW *) widget;
        GX_RESOURCE_ID bkgnd_color = GX_COLOR_ID_NEW_COLOR_91AAB4;   // 条目交替显示背景颜色 1
        GX_BOOL result;
        GX_STRING string;
        char  _name_temp_buf[128] = {0};

        if (index & 1)
        {
                bkgnd_color = GX_COLOR_ID_NEW_COLOR_7DA0B4;   // 条目交替显示背景颜色 2
        }

        // Test if the widget is already created 测试小部件是否已创建
        gx_widget_created_test(&row -> background, &result);

        if (!result)
        {

                /* 定义一个矩形框,后续的2D绘制函数都是在这个矩形范围内绘制的 */
                gx_utility_rectangle_define(&childsize, list->gx_window_client.gx_rectangle_left , 0,
                list->gx_window_client.gx_rectangle_right , PATIENT_LIST_VISIBLE_ROWS_H);
                gx_widget_create(&row->background, NULL, list, GX_STYLE_ENABLED, GX_ID_NONE, &childsize);
                gx_widget_status_add(&row -> background, GX_STATUS_SELECTABLE | GX_STATUS_ACCEPTS_FOCUS);

                childsize.gx_rectangle_left += 2;
                childsize.gx_rectangle_right = childsize.gx_rectangle_left + (450-2);           // list 列表最大 Width 设置为 600 像素,
                                                                                                                        // 显示 文件大小字节还需要使用 150 ,所以此处只能是 450 了 ,
                                                                                                                        // -2 是 childsize.gx_rectangle_left += 2 这个使用了 2像素
                // --------------------------------------------------------------------------------------------------
                // 创建显示 文件名称控件
                gx_prompt_create(&row->name, NULL, &row->background, 0,
                                                                GX_STYLE_TRANSPARENT   //显示透明模式
                                                                |GX_STYLE_TEXT_LEFT    //显示左对齐
                                                                |GX_STYLE_TEXT_COPY,   //显示内容动态更新拷贝显示  GX_STYLE_ENABLED
                                                                0, &childsize);
                gx_prompt_font_set((GX_PROMPT *)&row->name, GX_FONT_ID_GBK2312HWZSL_16);
                gx_widget_draw_set(&row->name, patient_prompt_draw);
                gx_prompt_text_color_set(&row->name,GX_COLOR_ID_NEW_COLOR_WRITE, GX_COLOR_ID_NEW_COLOR_BLACK, GX_COLOR_ID_NEW_COLOR_WRITE);

                // --------------------------------------------------------------------------------------------------
                // 创建显示 文件大小控件
                gx_utility_rectangle_shift(&childsize, MR_NUM_SHIFT, 0);
                gx_prompt_create(&row->size, NULL, &row->background, 0,
                                                                GX_STYLE_TRANSPARENT   //显示透明模式
                                                                |GX_STYLE_TEXT_LEFT    //显示左对齐
                                                                |GX_STYLE_TEXT_COPY,   //显示内容动态更新拷贝显示  GX_STYLE_ENABLED
                                                                0, &childsize);
                gx_widget_draw_set(&row->size, patient_prompt_draw);
                gx_prompt_font_set((GX_PROMPT *)&row->size, GX_FONT_ID_GBK2312HWZSL_16);
                gx_prompt_text_color_set(&row->size, GX_COLOR_ID_NEW_COLOR_WRITE, GX_COLOR_ID_NEW_COLOR_BLACK, GX_COLOR_ID_NEW_COLOR_WRITE);
        
        }
        // --------------------------------------------------------------------------------------------------
        gx_widget_fill_color_set(&row->background, bkgnd_color, GX_COLOR_ID_NEW_COLOR_2, bkgnd_color);   // 选中显示的颜色
        
        // --------------------------------------------------------------------------------------------------
        string.gx_string_ptr = &patient_list[index]->file_name[0];        // 从sd卡获取到的文件名,已经转化为 utf8
        string.gx_string_length = string_length_get(string.gx_string_ptr, MAX_STRING_LENGTH);
        gx_prompt_text_set_ext(&row->name, &string);                     // 在 lcd 上显示曲目名称信息

        // -------------------------------------------------------------------------------------------------
        strcpy(_name_temp_buf, &patient_list[index]->file_size[0]);   // 文件大小数据
        strcat(_name_temp_buf, " byte");                                             // 拼接加上 byte
        string.gx_string_ptr = &_name_temp_buf[0];  //patient_list[index].name;
        string.gx_string_length = string_length_get(string.gx_string_ptr, MAX_STRING_LENGTH);
        gx_prompt_text_set_ext(&row->size, &string);   
}


******************************************************************************************************************
******************************************************************************************************************
******************************************************************************************************************
02.   patient list 滑动 不 死机的程序:

VOID _patient_row_create(GX_VERTICAL_LIST *list, GX_WIDGET *widget, INT index)
{
        GX_RECTANGLE childsize;
        PATIENT_ROW *row = (PATIENT_ROW *) widget;
        GX_RESOURCE_ID bkgnd_color = GX_COLOR_ID_NEW_COLOR_91AAB4;   // 条目交替显示背景颜色 1
        //        GX_RESOURCE_ID bkgnd_color = GX_COLOR_ID_NEW_COLOR_909090;   // 条目交替显示背景颜色 1
        GX_BOOL result;
        GX_STRING string;
        char  _name_temp_buf[128] = {0};

        if (index & 1)
        {
                bkgnd_color = GX_COLOR_ID_NEW_COLOR_7DA0B4;   // 条目交替显示背景颜色 2
        }

        // Test if the widget is already created 测试小部件是否已创建
        gx_widget_created_test(&row -> background, &result);

        if (!result)
        {
                //list->gx_window_client.gx_rectangle_left  : 5
                //list->gx_window_client.gx_rectangle_right : 604
                //                 __log("list->gx_window_client.gx_rectangle_left  : %d \r\n", list->gx_window_client.gx_rectangle_left);
                //                 __log("list->gx_window_client.gx_rectangle_right : %d \r\n", list->gx_window_client.gx_rectangle_right);

                /* 定义一个矩形框,后续的2D绘制函数都是在这个矩形范围内绘制的 */
                gx_utility_rectangle_define(&childsize, list->gx_window_client.gx_rectangle_left , 0,
                list->gx_window_client.gx_rectangle_right , PATIENT_LIST_VISIBLE_ROWS_H);
                gx_widget_create(&row->background, NULL, list, GX_STYLE_ENABLED, GX_ID_NONE, &childsize);
                gx_widget_status_add(&row -> background, GX_STATUS_SELECTABLE | GX_STATUS_ACCEPTS_FOCUS);

                childsize.gx_rectangle_left += 2;
                childsize.gx_rectangle_right = childsize.gx_rectangle_left + (450-2);           // list 列表最大 Width 设置为 600 像素,
                                                                                                                        // 显示 文件大小字节还需要使用 150 ,所以此处只能是 450 了 ,
                                                                                                                        // -2 是 childsize.gx_rectangle_left += 2 这个使用了 2像素
                // --------------------------------------------------------------------------------------------------
                // 创建显示 文件名称控件
                gx_prompt_create(&row->name, NULL, &row->background, 0,
                                                                GX_STYLE_TRANSPARENT   //显示透明模式
                                                                |GX_STYLE_TEXT_LEFT    //显示左对齐
                                                                |GX_STYLE_TEXT_COPY,   //显示内容动态更新拷贝显示  GX_STYLE_ENABLED
                                                                0, &childsize);
                gx_prompt_font_set((GX_PROMPT *)&row->name, GX_FONT_ID_GBK2312HWZSL_16);
                gx_widget_draw_set(&row->name, patient_prompt_draw);
                gx_prompt_text_color_set(&row->name,GX_COLOR_ID_NEW_COLOR_WRITE, GX_COLOR_ID_NEW_COLOR_BLACK, GX_COLOR_ID_NEW_COLOR_WRITE);

                // --------------------------------------------------------------------------------------------------
                // 创建显示 文件大小控件
                gx_utility_rectangle_shift(&childsize, MR_NUM_SHIFT, 0);
                gx_prompt_create(&row->size, NULL, &row->background, 0,
                                                                GX_STYLE_TRANSPARENT   //显示透明模式
                                                                |GX_STYLE_TEXT_LEFT    //显示左对齐
                                                                |GX_STYLE_TEXT_COPY,   //显示内容动态更新拷贝显示  GX_STYLE_ENABLED
                                                                0, &childsize);
                gx_widget_draw_set(&row->size, patient_prompt_draw);
                gx_prompt_font_set((GX_PROMPT *)&row->size, GX_FONT_ID_GBK2312HWZSL_16);  
                gx_prompt_text_color_set(&row->size, GX_COLOR_ID_NEW_COLOR_WRITE, GX_COLOR_ID_NEW_COLOR_BLACK, GX_COLOR_ID_NEW_COLOR_WRITE);
        
                // --------------------------------------------------------------------------------------------------
                // 放在此处显示条目会超过 _list_info_user._count 这个最大值,但不会超过 guix studio 所配置的 total rows 最大条目数
                gx_widget_fill_color_set(&row->background, bkgnd_color, GX_COLOR_ID_NEW_COLOR_2, bkgnd_color);   // 选中显示的颜色
               
                // --------------------------------------------------------------------------------------------------
                string.gx_string_ptr = &patient_list[index]->file_name[0];// 从sd卡获取到的文件名,已经转化为 utf8
                string.gx_string_length = string_length_get(string.gx_string_ptr, MAX_STRING_LENGTH);
                gx_prompt_text_set_ext(&row->name, &string);   // 在 lcd 上显示曲目名称信息
               
                // -------------------------------------------------------------------------------------------------
                strcpy(_name_temp_buf, &patient_list[index]->file_size[0]);   // 文件大小数据
                strcat(_name_temp_buf, " byte");                                             // 拼接加上 byte
                string.gx_string_ptr = &_name_temp_buf[0];  //patient_list[index].name;
                string.gx_string_length = string_length_get(string.gx_string_ptr, MAX_STRING_LENGTH);
                gx_prompt_text_set_ext(&row->size, &string);   // 在 lcd 上显示曲目大小信息
        
        }
}




******************************************************************************************************************
******************************************************************************************************************
******************************************************************************************************************


03.  
    a.  在 使用 01 方法中, 显示条目上的内容可自由控制,只要不超过   total rows 这个所配置的大小即可, 但滑动控件里面的条目时会出现卡死
    b.  在 使用 02 方法中,显示条目上的内容会 以 total rows  这个 设置的大小显示完整个条目,这点感觉有些不妥,目前还没有找到比较完善的解决方法,
        显示条目数量最大能不会超过 total rows  这个配置的大小, 但滑动控件里面的条目不会出现卡死
    c. 使用 guix studio 配置后,在软件里面 total rows  这个大小配置不知道能否动态 修改,有哪位大神知道啊 ????????  
    d. 如有不对的地方,望各位大神 纠正哟















回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
发表于 2023-9-6 09:52:59 | 显示全部楼层
谢谢楼主分享。如果total rows是以变量的方式存在,不是const,是没问题的。
回复

使用道具 举报

610

主题

3060

回帖

4910

积分

至尊会员

积分
4910
 楼主| 发表于 2023-9-6 10:32:01 | 显示全部楼层
本帖最后由 hpdell 于 2023-9-6 20:09 编辑
eric2013 发表于 2023-9-6 09:52
谢谢楼主分享。如果total rows是以变量的方式存在,不是const,是没问题的。


貌似嵌套的很深,一时半会也没有看明白

patient_list-1.png


patient_list-2.png

patient_list-3.png

patient_list-4.png



GX_CONST GX_STUDIO_WIDGET_ENTRY    ___guix_chinese_main_widget_table[] =
{
    { &window_game_list_define, (GX_WIDGET *) &window_game_list },

...
};

嵌套了好几层封装,


GX_VERTICAL_LIST_PROPERTIES 定义:
patient_list-5.png    

貌似 int total_rows; 是这样的定义,没有使用 const

定义嵌套太深,有些蒙圈了哟


貌似这样用以失败而告终 哟 ....  
extern GX_VERTICAL_LIST_PROPERTIES window_game_list_patient_list_properties;
window_game_list_patient_list_properties.total_rows = 34;  // 当前搜索到文件的数目
估计这个方法得重新绘制应该是可以的,

我目前使用的是 guix studio 自动生成的框架, 之后再修改 应该是没有用的 吧 ... ??

重新不使用 guix studio 在 软件里面重新绘制目前不会 呀 ...   

不知道 官方有没有这方面在软件里面绘制的例程啊 ??????







回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 04:09 , Processed in 0.156021 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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