emWin电脑端模拟器之Progress Bar进度条控件

2022年10月24日 25点热度 0人点赞

    Progress Bar进度条控件通常应用在程序中用于实现可视化;例如,油罐液位指示器或油压指示器,文件传输等等。

工具/原料

  • SeggerEval_WIN32_MSVC_MinGW_GUI_V542
  • emWin5_V5.42_CN.pdf
  • Microsoft Visual Studio 2013

方法/步骤

  1. 1

    在目录SeggerEval_WIN32_MSVC_MinGW_GUI_V542中打开SimulationTrial.sln解决方案。

     

    打开SWIPELIST_Demo.c文件,找到MainTask()函数,即为入口函数。

     

    打开LCDConf.h文件,找到#define XSIZE_PHYS 800   #define YSIZE_PHYS 500修改模拟器屏幕尺寸大小。

  2. 2

    int LCD_XWIDTH_SIZE = 0;

    int LCD_YHIGH_SIZE  = 0;

    void MainTask(void)

    {

    GUI_Init();

    GUI_UC_SetEncodeUTF8(); 

    GUI_SetBkColor(GUI_WHITE); 

    GUI_SetColor(GUI_BLUE); 

    GUI_Clear();

     

    LCD_XWIDTH_SIZE = LCD_GetXSize(); 

    LCD_YHIGH_SIZE = LCD_GetYSize(); 

    GUI_SetColor(0xFF901E);

    GUI_FillRect(0, 0, LCD_XWIDTH_SIZE, 30); 

     

    GUI_SetFont(&GUI_Font8x18);

    GUI_SetBkColor(0xFF901E); 

    GUI_SetColor(GUI_WHITE); 

    GUI_DispStringAt("emWin Demo For Progress Bar", 270, 7); 

     

    GUI_SetColor(0xFF901E); 

    GUI_DrawLine(560, 31, 560, LCD_YHIGH_SIZE); 

     

    GUI_SetColor(GUI_BLACK); 

    GUI_SetBkColor(GUI_WHITE); 

    GUI_DispStringAt("LCD X Physics Size :    px", 570, 45); 

    GUI_DispDecAt(LCD_XWIDTH_SIZE, 735, 45, 3);

     

    GUI_DispStringAt("LCD Y Physics Size :    px", 570, 70); 

    GUI_DispDecAt(LCD_YHIGH_SIZE, 735, 70, 3); 

    GUI_DrawLine(560, 95, LCD_XWIDTH_SIZE, 95);

    while (1)

    {

    GUI_Delay(200);

    }

    }

  3. 3

    #define PROG_BAR1_MIN_VALUE 0 

    #define PROG_BAR2_MIN_VALUE 0 

    #define PROG_BAR3_MIN_VALUE 1000

     

    #define PROG_BAR1_MAX_VALUE 99 

    #define PROG_BAR2_MAX_VALUE 500 

    #define PROG_BAR3_MAX_VALUE 9999

     

    int LCD_XWIDTH_SIZE = 0;

    int LCD_YHIGH_SIZE  = 0;

    void MainTask(void)

    {

    PROGBAR_Handle progBar1;

    PROGBAR_Handle progBar2;

    PROGBAR_Handle progBar3;

     

    int curValueBar1 = PROG_BAR1_MIN_VALUE;

    int curValueBar2 = PROG_BAR2_MIN_VALUE;

    int curValueBar3 = PROG_BAR3_MIN_VALUE;

     

    GUI_Init(); 

    GUI_UC_SetEncodeUTF8();

    GUI_SetBkColor(GUI_WHITE); 

    GUI_SetColor(GUI_BLUE); 

    GUI_Clear();

     

     

    GUI_DispStringAt("Progress Bar1", 50, 70); 

    progBar1 = PROGBAR_CreateEx(170, 65, 300, 20, 0, (WM_CF_SHOW | WM_CF_CONST_OUTLINE), 0, 0);

    PROGBAR_SetFont(progBar1, &GUI_Font8x18); 

    PROGBAR_SetMinMax(progBar1, PROG_BAR1_MIN_VALUE, PROG_BAR1_MAX_VALUE); 

    PROGBAR_SetValue(progBar1, PROG_BAR1_MIN_VALUE);

     

    GUI_DispStringAt("Progress Bar2", 50, 120); 

    progBar2 = PROGBAR_CreateEx(170, 115, 300, 20, 0, (WM_CF_SHOW | WM_CF_CONST_OUTLINE), 0, 0);

    PROGBAR_SetFont(progBar2, &GUI_Font8x18); 

    PROGBAR_SetMinMax(progBar2, PROG_BAR2_MIN_VALUE, PROG_BAR2_MAX_VALUE);

    PROGBAR_SetValue(progBar2, PROG_BAR2_MIN_VALUE); 

     

    GUI_DispStringAt("Progress Bar3", 50, 170); 

    progBar3 = PROGBAR_CreateEx(170, 165, 300, 20, 0, (WM_CF_SHOW | WM_CF_CONST_OUTLINE), 0, 0);

    PROGBAR_SetFont(progBar3, &GUI_Font8x18); 

    PROGBAR_SetMinMax(progBar3, PROG_BAR3_MIN_VALUE, PROG_BAR3_MAX_VALUE); 

    PROGBAR_SetValue(progBar3, PROG_BAR3_MIN_VALUE); 

    GUI_DrawLine(0, 230, 560, 230); 

    while (1)

    {

    GUI_Delay(200);

    }

    }

  4. 4

    在指定位置创建指定大小的 PROGBAR 控件。

    PROGBAR_Handle PROGBAR_CreateEx(int x0, int y0,

     

    int xSize, int ySize,

     

    WM_HWIN hParent, int WinFlags,

     

    int ExFlags, int Id);

     

    选择 PROGBAR 控件内显示的文本的字体。

     

    void PROGBAR_SetFont(PROGBAR_Handle hObj, const GUI_FONT * pFont);

     

    设置 PROGBAR 控件的最小值和最大值。

    void PROGBAR_SetMinMax(PROGBAR_Handle hObj, int Min, int Max);

     

    设置 PROGBAR 控件的值。

    void PROGBAR_SetValue(PROGBAR_Handle hObj, int v);

  5. 5

    进度条最小值和最大值

    #define PROG_BAR1_MIN_VALUE 0 

    #define PROG_BAR2_MIN_VALUE 0

    #define PROG_BAR3_MIN_VALUE 1000 

     

    #define PROG_BAR1_MAX_VALUE 99 

    #define PROG_BAR2_MAX_VALUE 500 

    #define PROG_BAR3_MAX_VALUE 9999

     

    进度条句柄

    PROGBAR_Handle progBar1;

    PROGBAR_Handle progBar2;

    PROGBAR_Handle progBar3;

     

    进度条当前值

    int curValueBar1 = PROG_BAR1_MIN_VALUE;

    int curValueBar2 = PROG_BAR2_MIN_VALUE;

    int curValueBar3 = PROG_BAR3_MIN_VALUE;

  6. 6

    初始化 emWin 内部数据结构和变量。

    int GUI_Init(void);

     

    启用 UTF-8 编码。

    void GUI_UC_SetEncodeUTF8(void);

     

    设置当前背景色。

    GUI_COLOR GUI_SetBkColor(GUI_COLOR Color);

     

    设置当前前景色。

    void GUI_SetColor(GUI_COLOR Color);

     

    清除当前窗口。

    void GUI_Clear(void);

     

    分别返回 LCD 的物理 X 尺寸和 Y 尺寸 (单位:像素)。

    int LCD_GetXSize(void);

    int LCD_GetYSize(void);

     

    在当前窗口中的指定位置绘制填充的矩形区域。

     

    void GUI_FillRect(int x0, int y0, int x1, int y1);

     

    设置用于文本输出的字体。

    const GUI_FONT * GUI_SetFont(const GUI_FONT * pNewFont);

     

    在当前窗口的指定位置处,使用当前字体显示作为参数的字符串。

     

    void GUI_DispStringAt(const char * s, int x, int y);

     

    在当前窗口中绘制从某个指定起点到某个指定终点之间的线(绝对坐标)。

    void GUI_DrawLine(int x0, int y0, int x1, int y1);

     

    在当前窗口的指定位置处,使用当前字体显示指定字符数的十进制数值。

    void GUI_DispDecAt(I32 v, I16P x, I16P y, U8 Len);

  7. 7

    #define PROG_BAR1_MIN_VALUE 0

    #define PROG_BAR2_MIN_VALUE 0 

    #define PROG_BAR3_MIN_VALUE 1000

     

    #define PROG_BAR1_MAX_VALUE 99 

    #define PROG_BAR2_MAX_VALUE 500 

    #define PROG_BAR3_MAX_VALUE 9999 

     

    int LCD_XWIDTH_SIZE = 0;

    int LCD_YHIGH_SIZE  = 0;

    void MainTask(void)

    {

    GUI_DispStringAt("Progress Bar2", 50, 120); 

    progBar2 = PROGBAR_CreateEx(170, 115, 300, 20, 0, (WM_CF_SHOW | WM_CF_CONST_OUTLINE), 0, 0);

    PROGBAR_SetFont(progBar2, &GUI_Font8x18); 

    PROGBAR_SetMinMax(progBar2, PROG_BAR2_MIN_VALUE, PROG_BAR2_MAX_VALUE); 

    PROGBAR_SetValue(progBar2, PROG_BAR2_MIN_VALUE);

     

    GUI_DispStringAt("Progress Bar3", 50, 170); 

    progBar3 = PROGBAR_CreateEx(170, 165, 300, 20, 0, (WM_CF_SHOW | WM_CF_CONST_OUTLINE), 0, 0);

    PROGBAR_SetFont(progBar3, &GUI_Font8x18); 

    PROGBAR_SetMinMax(progBar3, PROG_BAR3_MIN_VALUE, PROG_BAR3_MAX_VALUE); 

    PROGBAR_SetValue(progBar3, PROG_BAR3_MIN_VALUE); 

    GUI_DrawLine(0, 230, 560, 230); 

     

    GUI_DispStringAt("Items", 20, 260); 

    GUI_DispStringAt("Bar1", 25, 290);

    GUI_DispStringAt("Bar2", 25, 320);

    GUI_DispStringAt("Bar3", 25, 350);

     

    GUI_DispStringAt("Progress", 150, 260); 

    GUI_DispDecAt(PROG_BAR1_MIN_VALUE, 170, 290, 2); 

    GUI_DispDecAt(PROG_BAR2_MIN_VALUE, 170, 320, 3);

    GUI_DispDecAt(PROG_BAR3_MIN_VALUE, 170, 350, 4);

     

    GUI_DispStringAt("Remain", 300, 260); 

    GUI_DispDecAt(PROG_BAR1_MAX_VALUE, 310, 290, 2); 

    GUI_DispDecAt(PROG_BAR2_MAX_VALUE, 310, 320, 3);

    GUI_DispDecAt(PROG_BAR3_MAX_VALUE, 310, 350, 4);

    while (1)

    {

    GUI_Delay(200);

    }

    }

  8. 8

    #define PROG_BAR1_MIN_VALUE 0 

    #define PROG_BAR2_MIN_VALUE 0 

    #define PROG_BAR3_MIN_VALUE 1000 

     

    #define PROG_BAR1_MAX_VALUE 99 

    #define PROG_BAR2_MAX_VALUE 500 

    #define PROG_BAR3_MAX_VALUE 9999 

     

    int LCD_XWIDTH_SIZE = 0;

    int LCD_YHIGH_SIZE  = 0;

    void MainTask(void)

    {

    PROGBAR_Handle progBar1;

    PROGBAR_Handle progBar2;

    PROGBAR_Handle progBar3;

    int curValueBar1 = PROG_BAR1_MIN_VALUE;

    int curValueBar2 = PROG_BAR2_MIN_VALUE;

    int curValueBar3 = PROG_BAR3_MIN_VALUE;

    int flagBar2 = 0;

     

    GUI_Init(); 

    GUI_UC_SetEncodeUTF8(); 

    GUI_SetBkColor(GUI_WHITE); 

    GUI_SetColor(GUI_BLUE); 

    GUI_Clear(); 

     

    LCD_XWIDTH_SIZE = LCD_GetXSize(); 

    LCD_YHIGH_SIZE = LCD_GetYSize(); 

    GUI_SetColor(0xFF901E); 

    GUI_FillRect(0, 0, LCD_XWIDTH_SIZE, 30);

     

    GUI_SetFont(&GUI_Font8x18);

    GUI_SetBkColor(0xFF901E); 

    GUI_SetColor(GUI_WHITE); 

    GUI_DispStringAt("emWin Demo For Progress Bar", 270, 7); 

     

    GUI_SetColor(0xFF901E); 

    GUI_DrawLine(560, 31, 560, LCD_YHIGH_SIZE); 

     

    GUI_SetColor(GUI_BLACK); 

    GUI_SetBkColor(GUI_WHITE); 

    GUI_DispStringAt("LCD X Physics Size :    px", 570, 45); 

    GUI_DispDecAt(LCD_XWIDTH_SIZE, 735, 45, 3); 

     

    GUI_DispStringAt("LCD Y Physics Size :    px", 570, 70); 

    GUI_DispDecAt(LCD_YHIGH_SIZE, 735, 70, 3); 

    GUI_DrawLine(560, 95, LCD_XWIDTH_SIZE, 95); 

     

    GUI_DispStringAt("Progress Bar1", 50, 70); 

    progBar1 = PROGBAR_CreateEx(170, 65, 300, 20, 0, (WM_CF_SHOW | WM_CF_CONST_OUTLINE), 0, 0);

    PROGBAR_SetFont(progBar1, &GUI_Font8x18); 

    PROGBAR_SetMinMax(progBar1, PROG_BAR1_MIN_VALUE, PROG_BAR1_MAX_VALUE); 

    PROGBAR_SetValue(progBar1, PROG_BAR1_MIN_VALUE); 

     

    GUI_DispStringAt("Progress Bar2", 50, 120);

    progBar2 = PROGBAR_CreateEx(170, 115, 300, 20, 0, (WM_CF_SHOW | WM_CF_CONST_OUTLINE), 0, 0);

    PROGBAR_SetFont(progBar2, &GUI_Font8x18); 

    PROGBAR_SetMinMax(progBar2, PROG_BAR2_MIN_VALUE, PROG_BAR2_MAX_VALUE); 

    PROGBAR_SetValue(progBar2, PROG_BAR2_MIN_VALUE); 

     

    GUI_DispStringAt("Progress Bar3", 50, 170); 

    progBar3 = PROGBAR_CreateEx(170, 165, 300, 20, 0, (WM_CF_SHOW | WM_CF_CONST_OUTLINE), 0, 0);

    PROGBAR_SetFont(progBar3, &GUI_Font8x18); 

    PROGBAR_SetMinMax(progBar3, PROG_BAR3_MIN_VALUE, PROG_BAR3_MAX_VALUE); 

    PROGBAR_SetValue(progBar3, PROG_BAR3_MIN_VALUE); 

    GUI_DrawLine(0, 230, 560, 230); 

     

     

    GUI_DispStringAt("Items", 20, 260); 

    GUI_DispStringAt("Bar1", 25, 290);

    GUI_DispStringAt("Bar2", 25, 320);

    GUI_DispStringAt("Bar3", 25, 350);

     

    GUI_DispStringAt("Progress", 150, 260); 

    GUI_DispDecAt(PROG_BAR1_MIN_VALUE, 170, 290, 2); 

    GUI_DispDecAt(PROG_BAR2_MIN_VALUE, 170, 320, 3);

    GUI_DispDecAt(PROG_BAR3_MIN_VALUE, 170, 350, 4);

     

    GUI_DispStringAt("Remain", 300, 260); 

    GUI_DispDecAt(PROG_BAR1_MAX_VALUE, 310, 290, 2); 

    GUI_DispDecAt(PROG_BAR2_MAX_VALUE, 310, 320, 3);

    GUI_DispDecAt(PROG_BAR3_MAX_VALUE, 310, 350, 4);

    while (1)

    {

    GUI_Delay(200);

    if (curValueBar1 > PROG_BAR1_MAX_VALUE)

    curValueBar1 = PROG_BAR1_MIN_VALUE;

     

    if (curValueBar3 > PROG_BAR3_MAX_VALUE)

    curValueBar3 = PROG_BAR3_MIN_VALUE;

     

     

    PROGBAR_SetValue(progBar1, curValueBar1);

    GUI_DispDecAt(curValueBar1, 170, 290, 2);

    GUI_DispDecAt(PROG_BAR1_MAX_VALUE - curValueBar1, 310, 290, 2);

     

    PROGBAR_SetValue(progBar2, curValueBar2);

    GUI_DispDecAt(curValueBar2, 170, 320, 3);

    GUI_DispDecAt(PROG_BAR2_MAX_VALUE - curValueBar2, 310, 320, 3);

     

    PROGBAR_SetValue(progBar3, curValueBar3);

    GUI_DispDecAt(curValueBar3, 170, 350, 4);

    GUI_DispDecAt(PROG_BAR3_MAX_VALUE - curValueBar3, 310, 350, 4);

     

    curValueBar1++;

    curValueBar3 += 29;

    if (flagBar2)

    {

    curValueBar2 -= 9;

    if (curValueBar2 <= PROG_BAR2_MIN_VALUE)

    flagBar2 = 0;

    }

    else

    {

    curValueBar2 += 7;

    if (curValueBar2 >= PROG_BAR2_MAX_VALUE)

    flagBar2 = 1;

    }

    }

    }

    END

注意事项

  • 本人原创经验,仅供参考,若有不足之处请留言指正,若觉得写得好或凑合的话,请点击本页面左下角投票,谢谢了\(^o^)/
  • 若有任何意见与帮助,请关注后私信留言,非喜勿喷
  • 需要相关帮助请投票后关注私信
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部

laozhao

这个人很懒,什么都没留下

文章评论