EMWIN窗口创建通用布局及页面创建

EMWIN窗口创建通用布局及页面创建

索引页面

索引页面主要功能:

  • 创建26个字母按钮作为首字母索引进入交互口
  • 创建页面后通过按键移动聚焦,查找对应的字符串添加到虚拟页面层2显示出来
/**
 *  @file GW_ItemIndex.c
 *
 *  @date 2020/5/19
 *
 *  @author aron566
 *
 *  @copyright None
 *
 *  @brief 参数列表索引展示
 *
 *  @details 文件编码使用UTF-8 无BOM
 *
 *  @version V1.0
 */
#ifdef __cplusplus ///<use C compiler
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
/* Private includes ----------------------------------------------------------*/
#include "GW_ItemIndex.h"
#include "DRV_LcdPar.h"

/** Private typedef ----------------------------------------------------------*/

/** Private macros -----------------------------------------------------------*/
#define ITEMINDEX_ID_WINDOW_0            	(GUI_ID_USER + 0x00)
#define ITEMINDEX_ID_TITLE_L				(GUI_ID_USER + 1)
#define ITEMINDEX_ID_TITLE_M				(GUI_ID_USER + 2)
#define ITEMINDEX_ID_TITLE_R				(GUI_ID_USER + 3)
/*常用字段9个*/
#define ITEMINDEX_ID_ORIGIN_VA1_FIELD		(GUI_ID_USER + 4)/**< 起始控件ID*/
#define ITEMINDEX_VAL_FIELD_NUM_MAX			(9)/**< 最大控件数量*/										
#define ITEMINDEX_ID_VAL_MAX				(ITEMINDEX_ID_ORIGIN_VA1_FIELD+ITEMINDEX_VAL_FIELD_NUM_MAX-1)/**< 尾部控件ID*/
/*26个字母索引控件起始资源ID*/
#define ITEMINDEX_ID_ORIGIN_KEY_FIELD		(ITEMINDEX_ID_VAL_NUM_MAX + 1)/**< 起始控件ID*/
#define ITEMINDEX_KEY_FIELD_NUM_MAX			(26)/**< 最大控件数量*/
#define ITEMINDEX_ID_KEY_NUM_MAX			(ITEMINDEX_ID_ORIGIN_KEY_FIELD+ITEMINDEX_KEY_FIELD_NUM_MAX-1)/**< 尾部控件ID*/

/*层级信息*/
#define ITEMINDEX_KEY_LAYER					(0U)/**< 字段层*/
#define ITEMINDEX_VALUE_LAYER				(ITEMINDEX_KEY_LAYER+1U)/**< 结果层*/
#define ITEMINDEX_PAGE_LAYER_MAX			(2U)/**< 页面最大层级*/
/** Private constants --------------------------------------------------------*/
/** Public variables ---------------------------------------------------------*/

/** Private variables --------------------------------------------------------*/
static WM_HWIN MAINWin = 0;

/*多层级页面信息*/
static ItemIndexPage_Typedef ItemIndexPage[ITEMINDEX_PAGE_LAYER_MAX];

/** Private function prototypes ----------------------------------------------*/
static void ItemIndexPage_Init(void);
static WM_HWIN CreateitemsChSearchWindow(void);
static void Mainwidow_Init(WM_MESSAGE *pMsg);	        /**< 初始化主窗口*/
static void CreateTittle(WM_MESSAGE *pMsg);		        /**< 建立标题控件*/
static void CreateTimer(WM_MESSAGE *pMsg);		        /**< 建立时间控件*/
static void CreateButton(WM_MESSAGE *pMsg);		        /**< 建立按钮控件*/
static void cbDialog(WM_MESSAGE *pMsg);				    /**< 初始化索引页面*/
static void WidgetFocusUpdate(void);					/**< 更新控件聚焦*/
static uint32_t Get_FocusWidgetOffset(void);	        /**< 获取已聚焦控件偏移*/
static char Get_Search_Char(void);						/**< 获取需索引的字段*/
static const char *Get_IndexStr(uint32_t index);
static const char *Get_WidgetStr(char ch ,uint32_t index);
static uint32_t Get_CurrentPage_Button_Num(void);
static void ItemIndexPage_ResLayerUpdate(void);
static uint32_t Calc_CurrentPage_WidgetNum(void);
static uint32_t Calc_CurrentWidgetOffsetInLayer(void);
static void ItemIndexPage_Forward(void);			    /**< 页面右翻页*/
static void ItemIndexPage_Back(void);					/**< 页面左翻页*/
static void ItemIndexPage_Reload(void);				    /**< 主窗口重绘*/
static void ItemIndexPage_Down(void);					/**< 下移*/
static void ItemIndexPage_Up(void);                     /**< 上移*/
/** Private user code --------------------------------------------------------*/
/** Private application code -------------------------------------------------*/

/*******************************************************************************
*
*       Static code
*
********************************************************************************
*/
/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "WINDOW", ITEMINDEX_ID_WINDOW_0, 0, 0, UI_MAINWINDOW_WIDTH, UI_MAINWINDOW_HEIGHT, 0, 0x0, 0 }
};

/**
  ******************************************************************
  * @brief   建立主窗口
  * @param   [in]None
  * @retval  窗口句柄
  * @author  aron566
  * @version V1.0
  * @date    2020-5-18
  ******************************************************************
  */
static WM_HWIN CreateitemsChSearchWindow(void)
{
    return GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), cbDialog, WM_HBKWIN, 0, 0);
}

/**
  ******************************************************************
  * @brief   初始化索引页面
  * @param   [in]WM_MESSAGE 窗口管理消息指针
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-18
  ******************************************************************
  */
static void cbDialog(WM_MESSAGE * pMsg)
{
    WM_EnableMemdev(pMsg->hWin);
    switch (pMsg->MsgId) 
    {
        case WM_INIT_DIALOG:
            /*初始化主窗口*/
            Mainwidow_Init(pMsg);
            /*创建标题*/
            CreateTittle(pMsg);
            /*创建按钮*/
            CreateButton(pMsg);
            /*创建定时器*/
            WM_CreateTimer(pMsg->hWin, 0, PAGE_TIMER_PERIOD, 0);	
            break;
        case WM_NOTIFY_PARENT:
            break;
        case GW_WM_KEY:
        case WM_KEY:
            break;
        case WM_TIMER:
            CreateTimer(pMsg);
            break;
        default:
            WM_DefaultProc(pMsg);
            break;
    }
}

/**
  ******************************************************************
  * @brief   初始化索引页面定时器
  * @param   [in]WM_MESSAGE 窗口管理消息指针
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-18
  ******************************************************************
  */
static void CreateTimer(WM_MESSAGE * pMsg)
{
    WM_EnableMemdev(pMsg->hWin);
    /*重启定时器*/
    WM_RestartTimer(pMsg->Data.v, PAGE_TIMER_PERIOD);

    /*显示时间*/
    WM_HWIN hItem = WM_GetDialogItem(pMsg->hWin, ITEMINDEX_ID_TITLE_R);
    WM_EnableMemdev(hItem);
    char timeStr[10];
    TEXT_SetFont(hItem,GUI_FONT_16_1);
    GDT_get_current_time(timeStr);
    TEXT_SetText(hItem, timeStr);
}

/**
  ******************************************************************
  * @brief   页面信息初始化
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void ItemIndexPage_Init(void)
{
    memset(ItemIndexPage ,0 ,ITEMINDEX_PAGE_LAYER_MAX*sizeof(ItemIndexPage_Typedef));

    /*层1作为9个常用字段+26个字母索引层*/
    ItemIndexPage[ITEMINDEX_KEY_LAYER].PageType = ITEMINDEX_KEY_LAYER;
    ItemIndexPage[ITEMINDEX_KEY_LAYER].Widget_Num = (ARRAYNUM(Key_Search_Map))+ITEMINDEX_VAL_FIELD_NUM_MAX;
    ItemIndexPage[ITEMINDEX_KEY_LAYER].Widget_Offset = 0;
    ItemIndexPage[ITEMINDEX_KEY_LAYER].PageNum = (ARRAYNUM(Key_Search_Map)+ITEMINDEX_VAL_FIELD_NUM_MAX-1)/ITEM_INDEX_PAGE_BUTTON_NUM_MAX;/**<减1防止控件数量正好1页而错误的计算为2页*/
    ItemIndexPage[ITEMINDEX_KEY_LAYER].CurrentPageNum = 0;
    ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult = 0;
    ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 1;/**< 默认当前层激活*/
    
    /*层2作为索引结果层*/
    ItemIndexPage[ITEMINDEX_VALUE_LAYER].PageType = ITEMINDEX_VALUE_LAYER;
    ItemIndexPage[ITEMINDEX_VALUE_LAYER].Widget_Num = 0;
    ItemIndexPage[ITEMINDEX_VALUE_LAYER].Widget_Offset = 0;
    ItemIndexPage[ITEMINDEX_VALUE_LAYER].PageNum = 0;
    ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum = 0;
    ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult = 0;
    ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 0;
}

/**
  ******************************************************************
  * @brief   初始化主窗口
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-18
  ******************************************************************
  */
static void Mainwidow_Init(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem = pMsg->hWin;
    WM_EnableMemdev(hItem);
    /*do something ...*/
}

/**
  ******************************************************************
  * @brief   初始化索引页面标题
  * @param   [in]WM_MESSAGE 窗口管理消息指针
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void CreateTittle(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;
    WM_EnableMemdev(pMsg->hWin);

    /*左侧标题*/
    hItem = TEXT_CreateEx(ITEM_INDEX_PAGE_DEVICE_STATE_START_X, ITEM_INDEX_PAGE_TITLE_START_Y, ITEM_INDEX_PAGE_DEVICE_STATE_END_X, ITEM_INDEX_PAGE_TITLE_END_Y,
													pMsg->hWin, WM_CF_SHOW, GUI_TA_VCENTER|GUI_TA_HCENTER ,ITEMINDEX_ID_TITLE_L ,"");
    WM_EnableMemdev(hItem);
    TEXT_SetBkColor(hItem, GUI_BK_TITLE);
	
    /*中部标题*/
    hItem = TEXT_CreateEx(ITEM_INDEX_PAGE_TITLE_START_X, ITEM_INDEX_PAGE_TITLE_START_Y, ITEM_INDEX_PAGE_TITLE_END_X, ITEM_INDEX_PAGE_TITLE_END_Y,
													pMsg->hWin, WM_CF_SHOW, GUI_TA_VCENTER|GUI_TA_HCENTER ,ITEMINDEX_ID_TITLE_M ,"字段表");
    WM_EnableMemdev(hItem);
    TEXT_SetBkColor(hItem, GUI_BK_TITLE);
	
    /*右侧标题*/
    hItem = TEXT_CreateEx(ITEM_INDEX_PAGE_CLOCK_START_X, ITEM_INDEX_PAGE_TITLE_START_Y, ITEM_INDEX_PAGE_CLOCK_END_X, ITEM_INDEX_PAGE_TITLE_END_Y,
													pMsg->hWin, WM_CF_SHOW, GUI_TA_VCENTER|GUI_TA_HCENTER ,ITEMINDEX_ID_TITLE_R ,"");
    WM_EnableMemdev(hItem);
    TEXT_SetBkColor(hItem, GUI_BK_TITLE);

}

/**
  ******************************************************************
  * @brief   初始化索引页面按钮
  * @param   [in]WM_MESSAGE 窗口管理消息指针
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void CreateButton(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;
    WM_EnableMemdev(pMsg->hWin);
	
    /*判断当前页面可创建按钮数目*/
    int ButtonNum = Get_CurrentPage_Button_Num();

    /*循环创建字母索引字段按钮*/
    for(int i = 0; i < ButtonNum;i++)
    {
        /*建立按钮*/
        hItem = BUTTON_CreateEx(ITEM_INDEX_PAGE_BUTTON_MULTI_RECT_H_X(i),ITEM_INDEX_PAGE_BUTTON_MULTI_RECT_Y_X(i), ITEM_INDEX_PAGE_BUTTON_WIDTH, ITEM_INDEX_PAGE_BUTTON_END_Y,
                                                        pMsg->hWin, WM_CF_SHOW, 0,ITEMINDEX_ID_ORIGIN_VA1_FIELD+i);
        WM_EnableMemdev(hItem);
        /*取消3D色*/
        BUTTON_SetSkinClassic(hItem);
        /*设定背景色*/
        BUTTON_SetBkColor(hItem ,BUTTON_CI_UNPRESSED ,Key_Search_Map[i%ITEMINDEX_KEY_FIELD_NUM_MAX].Color);
        /*设定前景色*/
        BUTTON_SetTextColor(hItem ,BUTTON_CI_UNPRESSED  ,GUI_WHITE);
        /*设置聚焦虚线色*/
        if(Key_Search_Map[i%ITEMINDEX_KEY_FIELD_NUM_MAX].Color == GUI_RED)
        {
            BUTTON_SetFocusColor(hItem ,GUI_BLACK);
        }
        else
        {
            BUTTON_SetFocusColor(hItem ,GUI_RED);
        }
        /*设置显示内容*/
        BUTTON_SetText(hItem, Get_IndexStr(i));
    }
    /*设定初始聚焦*/
    WidgetFocusUpdate();
}

/**
  ******************************************************************
  * @brief   更新页面控件聚焦
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-21
  ******************************************************************
  */
static void WidgetFocusUpdate(void)
{
    /*判断主窗口已建立*/
    if(MAINWin != 0)
    {
        WM_HWIN hItem = WM_GetDialogItem(MAINWin, ITEMINDEX_ID_ORIGIN_VA1_FIELD + Get_FocusWidgetOffset());
        WM_EnableMemdev(hItem);
        WM_SetFocus(hItem);
    }
}

/**
  ******************************************************************
  * @brief   获取上次聚焦的索引字段,转换为首字符
  * @param   [in]None
  * @retval  首字符
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static char Get_Search_Char(void)
{
    char ch = 'A';
    uint32_t CurrentPage = ItemIndexPage[ITEMINDEX_KEY_LAYER].CurrentPageNum;
    uint32_t CurrentPageWidgetOffset = ItemIndexPage[ITEMINDEX_KEY_LAYER].Widget_Offset;
    /*打开字段索引层激活状态*/
    uint32_t temp = ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive;
    ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 1;
    uint32_t Widget_OffsetInLayer = Calc_CurrentWidgetOffsetInLayer();
    /*恢复状态*/
    ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = temp;
    uint32_t Offset = 0;
    if(Widget_OffsetInLayer >= ITEMINDEX_VAL_FIELD_NUM_MAX)
    {
        Offset = CurrentPageWidgetOffset+((CurrentPage-1)*ITEM_INDEX_PAGE_BUTTON_NUM_MAX)+ITEM_INDEX_PAGE_BUTTON_NUM_MAX-ITEMINDEX_VAL_FIELD_NUM_MAX;
        ch += Offset;
        return ch;
    }
    return ch;
}

/**
  ******************************************************************
  * @brief   获取当前页面,指定偏移控件所在字符串
  * @param   [in]ch 索引首部字段
  * @param   [in]index 当前页面所在偏移
  * @retval  字符串所在地址
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static const char *Get_WidgetStr(char ch ,uint32_t index)
{
    /*计算当前控件在全部页面的索引值*/
    uint32_t IN_ALLPAGE_WidgetIndex = ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum==0?index:ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum*ITEM_INDEX_PAGE_BUTTON_NUM_MAX+index;
    /*获取指定字段,指定索引号的 字符串地址*/
    return Get_Special_Ch_Str(ch ,IN_ALLPAGE_WidgetIndex);
}

/**
  ******************************************************************
  * @brief   获取当前页面,指定控件的字符串
  * @param   [in]在当前页面的控件号
  * @retval  字符串地址
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static const char *Get_IndexStr(uint32_t index)
{
    uint32_t CurrentPage = 0;
    /*字段层激活*/
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        if(ItemIndexPage[ITEMINDEX_KEY_LAYER].CurrentPageNum == 0)
        {
            if(index < ITEMINDEX_VAL_FIELD_NUM_MAX)
            {
                return Get_Special_Index_Str(index+1);
            }
            else
            {
                return Key_Search_Map[index-ITEMINDEX_VAL_FIELD_NUM_MAX].Str;
            }
        }
        else
        {
            CurrentPage = ItemIndexPage[ITEMINDEX_KEY_LAYER].CurrentPageNum;
            return Key_Search_Map[index+((CurrentPage-1)*ITEM_INDEX_PAGE_BUTTON_NUM_MAX)+ITEM_INDEX_PAGE_BUTTON_NUM_MAX-ITEMINDEX_VAL_FIELD_NUM_MAX].Str;
        }	
    }
    
    /*索引结果层激活*/
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        /*获取索引的字段*/
        char ch = Get_Search_Char();
        return Get_WidgetStr(ch ,index);
    }
    return "";
}

/**
  ******************************************************************
  * @brief   获取当前层,当前页面,需绘制的按钮总数
  * @param   [in]None
  * @retval  当页按钮总数
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static uint32_t Get_CurrentPage_Button_Num(void)
{
    /*判断当前激活层*/

    /*字段层激活*/
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        return Calc_CurrentPage_WidgetNum();
    }
    
    /*索引结果层激活*/
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        /*更新索引层*/
        ItemIndexPage_ResLayerUpdate();
        return Calc_CurrentPage_WidgetNum();
    }
    return 0;
}

/**
  ******************************************************************
  * @brief   更新索引结果层,可创建控件数目,总页数
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void ItemIndexPage_ResLayerUpdate(void)
{
    static char Last_SerachCh = 0;
    /*获取索引的字段*/
    char ch = Get_Search_Char();
    /*上次查询不一致则重置当前页面号*/
    if(ch != Last_SerachCh)
    {
        Last_SerachCh = ch;
        ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum = 0;
    }
    /*更新该字段在当前层中数目*/
    ItemIndexPage[ITEMINDEX_VALUE_LAYER].Widget_Num = Get_Special_Ch_Num(ch);
    /*更新该字段总页数*/
    ItemIndexPage[ITEMINDEX_VALUE_LAYER].PageNum = (Get_Special_Ch_Num(ch)-1)/ITEM_INDEX_PAGE_BUTTON_NUM_MAX;
}

/**
  ******************************************************************
  * @brief   计算当前页可建立控件数目
  * @param   [in]None
  * @retval  可创建数目
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static uint32_t Calc_CurrentPage_WidgetNum(void)
{
    uint32_t WidgetNum = 0;
    uint8_t CurrentLayer = 0;
    /*获取当前激活层*/
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_KEY_LAYER;
    }
    else if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_VALUE_LAYER;
    }	
	
    if(ItemIndexPage[CurrentLayer].IsActive)
    {
        /*判断当前页面是否是最首页*/
        if(0 == ItemIndexPage[CurrentLayer].CurrentPageNum)
        {
            WidgetNum = ItemIndexPage[CurrentLayer].Widget_Num>ITEM_INDEX_PAGE_BUTTON_NUM_MAX?ITEM_INDEX_PAGE_BUTTON_NUM_MAX:ItemIndexPage[CurrentLayer].Widget_Num;
        }
        else
        {
            /*不是首页则判断,剩余页,剩余数目*/
            /*获取剩余控件数,包含当前页*/
            WidgetNum = ItemIndexPage[CurrentLayer].Widget_Num-ItemIndexPage[CurrentLayer].CurrentPageNum*ITEM_INDEX_PAGE_BUTTON_NUM_MAX;
            /*限制绘制控件数目*/
            WidgetNum = WidgetNum>ITEM_INDEX_PAGE_BUTTON_NUM_MAX?ITEM_INDEX_PAGE_BUTTON_NUM_MAX:WidgetNum;
        }
        return WidgetNum;
    }
    return 0;
}

/**
  ******************************************************************
  * @brief   计算控件在当前层中的偏移索引号
  * @param   [in]None
  * @retval  索引号
  * @author  aron566
  * @version V1.0
  * @date    2020-5-22
  ******************************************************************
  */
static uint32_t Calc_CurrentWidgetOffsetInLayer(void)
{
    uint32_t ret = 0;
    uint8_t CurrentLayer = 0;
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_KEY_LAYER;
    }
    else if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_VALUE_LAYER;
    }		
    else
    {
        return ret;
    }
    return (ItemIndexPage[CurrentLayer].CurrentPageNum*ITEM_INDEX_PAGE_BUTTON_NUM_MAX)+ItemIndexPage[CurrentLayer].Widget_Offset;
}


/**
  ******************************************************************
  * @brief   获取当前已激活层,当前页面聚焦控件所在偏移
  * @param   [in]None
  * @retval  聚焦控件在当前页面偏移
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static uint32_t Get_FocusWidgetOffset(void)
{
    /*字段层激活*/
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        return ItemIndexPage[ITEMINDEX_KEY_LAYER].Widget_Offset;
    }
    
    /*索引结果层*/
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        return ItemIndexPage[ITEMINDEX_VALUE_LAYER].Widget_Offset;
    }
    return 0;
}

/**
  ******************************************************************
  * @brief   左翻页处理,或左移处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void ItemIndexPage_Back(void)
{
    uint8_t CurrentLayer = 0;
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_KEY_LAYER;
    }
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_VALUE_LAYER;
    }
#if USE_NEXT_PAGE
    /*判断是否是索引结果层*/
    if(ItemIndexPage[CurrentLayer].IsActive)
    {
        /*判断是否是首页,则不可翻页*/
        if(ItemIndexPage[CurrentLayer].CurrentPageNum == 0)
        {
            return;
        }
        else
        {
            ItemIndexPage[CurrentLayer].CurrentPageNum -= 1;
            /*主窗口重绘*/
            ItemIndexPage_Reload();
        }
    }
#else
    /*字段层或索引层激活*/
    if(ItemIndexPage[CurrentLayer].IsActive)
    {
        /*判断是否可以继续左移*/
        if(ItemIndexPage[CurrentLayer].Widget_Offset >= ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX)
        {
            ItemIndexPage[CurrentLayer].Widget_Offset -= ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX;
            /*更新聚焦*/
            WidgetFocusUpdate();
            return;
        }
        else
        {
            /*判断是否是一页,则不可翻页*/
            if(ItemIndexPage[CurrentLayer].CurrentPageNum == 0)
            {
                /*改为上移动*/
                ItemIndexPage_Up();
                /*更新聚焦*/
                WidgetFocusUpdate();
                return;
            }
            else
            {
                if(ItemIndexPage[CurrentLayer].CurrentPageNum > 0)
                {
                    /*向左翻页*/
                    ItemIndexPage[CurrentLayer].CurrentPageNum -= 1;
                    /*控件聚焦到最右侧*/
                    ItemIndexPage[CurrentLayer].Widget_Offset +=  ((ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX-1)*ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX);
                    /*限制超出可聚焦控件数*/
                    uint32_t temp = Get_CurrentPage_Button_Num();
                    ItemIndexPage[CurrentLayer].Widget_Offset = temp>ItemIndexPage[CurrentLayer].Widget_Offset?ItemIndexPage[CurrentLayer].Widget_Offset:temp;
                }
            }
        }	
        /*主窗口重绘*/
        ItemIndexPage_Reload();		
    }	
#endif
}

/**
  ******************************************************************
  * @brief   右翻页处理,或右移处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void ItemIndexPage_Forward(void)
{
    uint8_t CurrentLayer = 0;
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_KEY_LAYER;
    }
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_VALUE_LAYER;
    }
#if USE_NEXT_PAGE
    /*判断是否是索引结果层*/
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        /*判断是否是尾页,则不可翻页*/
        if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum == ItemIndexPage[ITEMINDEX_VALUE_LAYER].PageNum)
        {
            return;
        }
        else
        {
            ItemIndexPage[ITEMINDEX_VALUE_LAYER].CurrentPageNum += 1;
            /*主窗口重绘*/
            ItemIndexPage_Reload();
        }
    }
#else
    /*字段层或索引层激活*/
    if(ItemIndexPage[CurrentLayer].IsActive)
    {
        /*判断是否可以继续右移*/
        if((ItemIndexPage[CurrentLayer].Widget_Offset+ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX) <= (Get_CurrentPage_Button_Num()-1))
        {
            ItemIndexPage[CurrentLayer].Widget_Offset += ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX;
            /*更新聚焦*/
            WidgetFocusUpdate();
            return;
        }
        else
        {
            /*判断是否是最后页,则不可翻页*/
            if(ItemIndexPage[CurrentLayer].CurrentPageNum == ItemIndexPage[CurrentLayer].PageNum)
            {
                /*改为下移动*/
                ItemIndexPage_Down();
                /*更新聚焦*/
                WidgetFocusUpdate();
                return;
            }
            else
            {
                if(ItemIndexPage[CurrentLayer].CurrentPageNum < ItemIndexPage[CurrentLayer].PageNum)
                {
                    /*向右翻页*/
                    ItemIndexPage[CurrentLayer].CurrentPageNum += 1;
                    /*控件聚焦到最左侧*/
                    ItemIndexPage[CurrentLayer].Widget_Offset -=  ((ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX-1)*ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX);
                    /*限制超出可聚焦控件数*/
                    uint32_t temp = Get_CurrentPage_Button_Num();
                    ItemIndexPage[CurrentLayer].Widget_Offset = temp>ItemIndexPage[CurrentLayer].Widget_Offset?ItemIndexPage[CurrentLayer].Widget_Offset:temp;
                }
            }
        }	
        /*主窗口重绘*/
        ItemIndexPage_Reload();
    }	
#endif
}

/**
  ******************************************************************
  * @brief	 上键处理,单页循环聚焦
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void ItemIndexPage_Up(void)
{
    uint8_t CurrentLayer = 0;
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_KEY_LAYER;
    }
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_VALUE_LAYER;
    }
    /*字段层或索引层激活*/
    if(ItemIndexPage[CurrentLayer].IsActive)
    {
        /*判断是否是当前页面首个控件,则不可移动*/
        if(ItemIndexPage[CurrentLayer].Widget_Offset == 0)
        {
            if(ItemIndexPage[CurrentLayer].Widget_Num >= ITEM_INDEX_PAGE_BUTTON_NUM_MAX)
            {
                ItemIndexPage[CurrentLayer].Widget_Offset = Get_CurrentPage_Button_Num()-1;
            }
            else
            {
                ItemIndexPage[CurrentLayer].Widget_Offset = ItemIndexPage[CurrentLayer].Widget_Num-1;
            }
        }
        else
        {
            ItemIndexPage[CurrentLayer].Widget_Offset--;
        }
    }
    /*更新聚焦*/
    WidgetFocusUpdate();
}

/**
  ******************************************************************
  * @brief	 下键处理,单页循环聚焦
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void ItemIndexPage_Down(void)
{
    uint8_t CurrentLayer = 0;
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_KEY_LAYER;
    }
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        CurrentLayer = ITEMINDEX_VALUE_LAYER;
    }
    /*字段层或索引层激活*/
    if(ItemIndexPage[CurrentLayer].IsActive)
    {
        /*判断是否是当前页面最后一个控件,则不可移动*/
        if(ItemIndexPage[CurrentLayer].Widget_Offset == (ItemIndexPage[CurrentLayer].Widget_Num-1) ||
           ItemIndexPage[CurrentLayer].Widget_Offset == (Get_CurrentPage_Button_Num()-1))
        {
            ItemIndexPage[CurrentLayer].Widget_Offset = 0;
        }
        else
        {
            ItemIndexPage[CurrentLayer].Widget_Offset++;
        }
    }
    /*更新聚焦*/
    WidgetFocusUpdate();
}

/**
  ******************************************************************
  * @brief	 OK键处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void ItemIndexPage_Ok(void)
{
    /*字段层激活-->进入当前字段索引结果层或选中常用字符时完成索引退出*/
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        if(Calc_CurrentWidgetOffsetInLayer() < ITEMINDEX_VAL_FIELD_NUM_MAX)
        {
            /*已选中常用字段*/
            /*判断索引结果*/
            ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult = 1;
            if(ItemIndexWindowGetResult() != NULL)
            {
                ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult = 1;
            }
            else
            {
                ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult = 0;
            }

            ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 0;
            ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 0;
            /*隐藏删除窗口*/
            ItemIndexWindowHide();
        }
        else
        {
            ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 0;
            ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 1;
        }
        ItemIndexPage_Reload();
        return;
    }
    
    /*索引结果层-->确认选择*/
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        /*判断索引结果*/
        ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult = 1;
        if(ItemIndexWindowGetResult() != NULL)
        {
            ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult = 1;
        }
        else
        {
            ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult = 0;
        }
        /*已完成索引-->窗口全部失效*/
        ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 0;
        ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 0;
        /*隐藏删除窗口*/
        ItemIndexWindowHide();
        return;
    }
}

/**
  ******************************************************************
  * @brief	 返回键处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void ItemIndexPage_Return(void)
{
    /*字段层激活*/
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive)
    {
        ItemIndexWindowHide();
        ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 0;
        ItemIndexPage_Reload();
        return;
    }
    
    /*索引结果层*/
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive = 0;
        ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive = 1;
        ItemIndexPage_Reload();
        return;
    }
}

/**
  ******************************************************************
  * @brief   主窗口重新绘制
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void ItemIndexPage_Reload(void)
{
    /*窗口失效-->重新绘制*/
    if(MAINWin != 0)
    {
        WM_InvalidateWindow(MAINWin);
        WM_DeleteWindow(MAINWin);
        MAINWin = CreateitemsChSearchWindow();
    }		
}

/** Public application code --------------------------------------------------*/
/*******************************************************************************
*
*       Public code
*
********************************************************************************
*/

/**
  ******************************************************************
  * @brief   获取运行结果状态
  * @param   [in]None
  * @retval  1  成功
  * @retval  0  失败
  * @author  aron566
  * @version V1.0
  * @date    2020-5-21
  ******************************************************************
  */
uint32_t ItemIndexWindowGetTaskResult(void)
{
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult || ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}


/**
  ******************************************************************
  * @brief   字段索引窗口,已索引到数据获取
  * @param   [in]None
  * @retval  索引结果字符串地址
  * @author  aron566
  * @version V1.0
  * @date    2020-5-21
  ******************************************************************
  */
const char *ItemIndexWindowGetResult(void)
{
    uint32_t temp;
    uint8_t CurrentLayer = 0;
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].TaskResult)
    {
        CurrentLayer = ITEMINDEX_KEY_LAYER;
    }
    if(ItemIndexPage[ITEMINDEX_VALUE_LAYER].TaskResult)
    {
        CurrentLayer = ITEMINDEX_VALUE_LAYER;
    }	
    if(ItemIndexPage[CurrentLayer].TaskResult)
    {
        temp = ItemIndexPage[CurrentLayer].IsActive;
        /*激活当前需获取数据的层*/
        ItemIndexPage[CurrentLayer].IsActive = 1;
        const char *ret = Get_IndexStr(ItemIndexPage[CurrentLayer].Widget_Offset);
        ItemIndexPage[CurrentLayer].IsActive = temp;
        return ret;
    }
    return NULL;
}


/**
  ******************************************************************
  * @brief   字段索引窗口,状态获取
  * @param   [in]None
  * @retval  1  窗口显示中
  * @retval  0  窗口已失效
  * @author  aron566
  * @version V1.0
  * @date    2020-5-18
  ******************************************************************
  */
uint8_t ItemIndexWindowGetState(void)
{
    if(ItemIndexPage[ITEMINDEX_KEY_LAYER].IsActive || ItemIndexPage[ITEMINDEX_VALUE_LAYER].IsActive)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

/**
  ******************************************************************
  * @brief   字段索引窗口按键处理
  * @param   [in]Key
  * @retval  当前窗口状态:1显示 0关闭
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
uint8_t ItemIndexWindowSendKey(int key)
{
    /*判断窗口是否处于激活状态则下发按键*/
    if(ItemIndexWindowGetState())
    {
        switch(key)
        {
          case GUI_KEY_UP:
              ItemIndexPage_Up();
              break;
          case GUI_KEY_DOWN:
              ItemIndexPage_Down();
              break;
          case GUI_KEY_LEFT:
              ItemIndexPage_Back();
              break;
          case GUI_KEY_RIGHT:
              ItemIndexPage_Forward();
              break;
          case GUI_KEY_ENTER:
              ItemIndexPage_Ok();
              break;
          case GUI_KEY_ESCAPE:
              ItemIndexPage_Return();
              break;
          default:
              break;
        }
    }
    /*返回当前窗口状态*/
    return ItemIndexWindowGetState();
}

/**
  ******************************************************************
  * @brief   字段索引窗口显示
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-18
  ******************************************************************
  */
void ItemIndexWindowShow(void)
{
    if(MAINWin == 0)
    {
        /*重置窗口资源*/
        ItemIndexPage_Init();
        MAINWin = CreateitemsChSearchWindow();
    }
}

/**
  ******************************************************************
  * @brief   字段索引窗口隐藏
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-18
  ******************************************************************
  */
void ItemIndexWindowHide(void)
{
    if(MAINWin)
    {
        WM_DeleteWindow(MAINWin);
        MAINWin = 0;
    }
}
#ifdef __cplusplus ///<end extern c
}
#endif

索引页面头文件

/**
 *  @file GW_ItemIndex.h
 *
 *  @date 2020/5/19
 *
 *  @author aron566
 *
 *  @brief 参数列表索引展示 文件编码使用UTF-8 无BOM
 *  
 *  @version V1.0
 */
#ifndef GW_ITEMINDEX_H
#define GW_ITEMINDEX_H
#ifdef __cplusplus ///<use C compiler
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
#include <stdint.h> /**< nedd definition of uint8_t */
#include <stddef.h> /**< need definition of NULL    */
//#include <stdbool.h>/**< need definition of BOOL    */
#include <stdio.h>  /**< if need printf             */
#include <stdlib.h>
#include <string.h>
/** Private includes ---------------------------------------------------------*/
/** Private defines ----------------------------------------------------------*//** Exported typedefines -----------------------------------------------------*/
/*索引表建立*/
typedef enum
{
    GL_SEARCH_CHAR_A = 0,/**< 参数字段首字母索引*/
    GL_SEARCH_CHAR_B,
    GL_SEARCH_CHAR_C,
    GL_SEARCH_CHAR_D,
    GL_SEARCH_CHAR_E,
    GL_SEARCH_CHAR_F,
    GL_SEARCH_CHAR_G,
    GL_SEARCH_CHAR_H,
    GL_SEARCH_CHAR_I,
    GL_SEARCH_CHAR_J,
    GL_SEARCH_CHAR_K,
    GL_SEARCH_CHAR_L,
    GL_SEARCH_CHAR_M,
    GL_SEARCH_CHAR_N,
    GL_SEARCH_CHAR_O,
    GL_SEARCH_CHAR_P,
    GL_SEARCH_CHAR_Q,
    GL_SEARCH_CHAR_R,
    GL_SEARCH_CHAR_S,
    GL_SEARCH_CHAR_T,
    GL_SEARCH_CHAR_U,
    GL_SEARCH_CHAR_V,
    GL_SEARCH_CHAR_W,
    GL_SEARCH_CHAR_X,
    GL_SEARCH_CHAR_Y,
    GL_SEARCH_CHAR_Z,}IndexKey_Typedef;
/** 索引页面控件属性*/
typedef struct 
{
    IndexKey_Typedef WidgetIndex;    /**< 控件属性所在索引号*/
 	char Str[32];                    /**< 控件对应的字符串描述*/
    uint32_t Color;                  /**< 背景色*/
}ItemIndexWidget_Typedef;
/** 索引页面结构体*/
typedef struct
{
    uint32_t PageType;            	/**< 该页面类型。eg:根据页面类型查找填入该写入的参数*/
    uint32_t Widget_Num;        	/**< 该页面类型全部控件总数*/
    uint32_t Widget_Offset;    		/**< 该页面已聚焦控件偏移数*/
    uint32_t PageNum;               /**< 该类型页面总数。eg:根据预设单页显示控件数宏,与页面控件总数,转换为页数*/
    uint32_t CurrentPageNum;		/**< 当前显示页面号*/
    uint32_t IsActive;           	/**< 该页面是否激活状态*/
    uint32_t TaskResult;       		/**< 该页面功能运行结果*/
}ItemIndexPage_Typedef;

/** Exported constants -------------------------------------------------------*/
                                        
ItemIndexWidget_Typedef Key_Search_Map[] = 
{
    {GL_SEARCH_CHAR_A,    "A字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(254,  67, 101))},
    {GL_SEARCH_CHAR_B,    "B字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(252, 157, 154))},
    {GL_SEARCH_CHAR_C,    "C字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(249, 205, 173))},
    {GL_SEARCH_CHAR_D,    "D字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(200, 200, 169))},
    {GL_SEARCH_CHAR_E,    "E字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(131, 175, 155))},
    {GL_SEARCH_CHAR_F,    "F字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(178, 200, 187))},
    {GL_SEARCH_CHAR_G,    "G字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 69, 137, 148))},
    {GL_SEARCH_CHAR_H,    "H字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(117, 121,  74))},
    {GL_SEARCH_CHAR_I,    "I字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(114,  83,  52))},
    {GL_SEARCH_CHAR_J,    "J字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(130,  57,  53))},
    {GL_SEARCH_CHAR_K,    "K字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(137, 190, 178))},
    {GL_SEARCH_CHAR_L,    "L字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(201, 186, 131))},
    {GL_SEARCH_CHAR_M,    "M字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(222, 211, 140))},
    {GL_SEARCH_CHAR_N,    "N字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(222, 156,  83))},
    {GL_SEARCH_CHAR_O,    "O字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 36,  33,  28))},
    {GL_SEARCH_CHAR_P,    "P字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(172,  81,  24))},
    {GL_SEARCH_CHAR_Q,    "Q字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(159, 125,  80))},
    {GL_SEARCH_CHAR_R,    "R字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(160, 191, 124))},
    {GL_SEARCH_CHAR_S,    "S字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(  3,  35,  14))},
    {GL_SEARCH_CHAR_T,    "T字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(224, 160, 158))},
    {GL_SEARCH_CHAR_U,    "U字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(  0,   0,   0))},
    {GL_SEARCH_CHAR_V,    "V字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(117,  36,  35))},
    {GL_SEARCH_CHAR_W,    "W字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(161,  47,  47))},
    {GL_SEARCH_CHAR_X,    "X字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 30,  41,  61))},
    {GL_SEARCH_CHAR_Y,    "Y字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888(173, 137, 118))},
    {GL_SEARCH_CHAR_Z,    "Z字段"  ,TL_CV_RGB888_SWAP(TL_GET_RGB888( 38, 188, 213))},
};

/** Exported macros-----------------------------------------------------------*//** Exported variables -------------------------------------------------------*/
/** Exported functions prototypes --------------------------------------------*/
void ItemIndexWindowHide(void);
void ItemIndexWindowShow(void);
void ItemIndexWindowSendKey(int key);
uint8_t ItemIndexWindowGetState(void);
const char *ItemIndexWindowGetResult(void);
uint32_t ItemIndexWindowGetTaskResult(void);
#ifdef __cplusplus ///<end extern c
}
#endif
#endif
/******************************** End of file *********************************/

通用页面布局

通用页面布局主要功能:

  • 实现通过设置页面的像素自动整定各个控件的相对位置区域
  • 具备通用label位置/edit位置/button位置/标题位置
  • 通过设置控件行数列数,排列方式,垂直间隙,水平间隙自动计算控件大小,及每个控件的相对位置
/*
 *  FILE: DRV_LcdPar.c
 *
 *  Created on: 2020/4/24
 *
 *      Author: aron566
 *
 *  DESCRIPTION:--
 */
#ifdef __cplusplus //use C compiler
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "DRV_LcdPar.h"
/* Private macros-------------------------------------------------------------*/
/* Private constants ---------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/*运行时间*/
static volatile uint32_t userOS_TimeMS  = 0;
static volatile uint32_t OS_TimeSec = 0;
/* Private function prototypes -----------------------------------------------*/
/* Private user code ---------------------------------------------------------*/
/* Public variables ----------------------------------------------------------*/
/*******************************************************************************
*
*       Static code
*
********************************************************************************
*/
/*******************************************************************************
*
*       Public code
*
********************************************************************************
*/
/* 放入1ms中断 */
void millsec_IRQ_handler(void)
{
    static uint16_t cnt_ms = 0;
    
    userOS_TimeMS++;
    if (++cnt_ms >= 1000)
    {
        OS_TimeSec++;
        cnt_ms = 0;
    }
}/**
  ******************************************************************
  * @brief   获取ms计数
  * @param   None
  * @retval  userOS_TimeMS
  * @author  aron566
  * @version v1.0
  * @date    2020/5/6
  ******************************************************************
  */
uint32_t get_time_ms(void)
{
    return userOS_TimeMS;
}/**
  ******************************************************************
  * @brief   获取秒计数
  * @param   None
  * @retval  OS_TimeSec
  * @author  aron566
  * @version v1.0
  * @date    2020/5/6
  ******************************************************************
  */
uint32_t get_time_sec(void)
{
    return OS_TimeSec;
}
#ifdef __cplusplus //end extern c
}
#endif
/******************************** End of file *********************************/

/*
 *  FILE: DRV_LcdPar.h
 *
 *  Created on: 2020/4/24
 *
 *      Author: aron566
 *
 *  DESCRIPTION:--
 */
#ifndef DRV_LCDPAR_H
#define DRV_LCDPAR_H
#ifdef __cplusplus //use C compiler
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include <stdint.h> /*nedd definition of uint8_t*/
#include <stddef.h> /*need definition of NULL*/
#include <stdbool.h>/*need definition of BOOL*/
#include <stdio.h>  /*if need printf*/
#include <stdlib.h>
#include <string.h>
/* Private includes ----------------------------------------------------------*/
#include "ipa.h"
/* Private defines -----------------------------------------------------------*/
#define GUI_GRAY_C8     TL_CV_RGB888_SWAP(TL_GET_RGB888(157, 255, 255))                          /**< 菜单按钮界面标题栏色彩设置 */
#define GUI_GRAY_E7     GUI_WHITE
#define GUI_GRAY_9A     GUI_WHITE
#define EDIT_EnableInversion(item,value)    do{}while(0)
#define EDIT_CI_CURSOR  EDIT_CI_ENABLED
#define GUI_MAKE_COLOR(ARGB)    (ARGB)
/*图形最大显示区域设定,单位:像素*/
#define UI_MAINWINDOW_WIDTH         (480U)
#define UI_MAINWINDOW_HEIGHT        (320U)  
/*状态栏高度设定*/
#define TITLE_START_Y               (0U)                                        /*标题栏起始Y*/
#define TITLE_END_Y                 (UI_MAINWINDOW_HEIGHT/10)                   /*标题栏高度Y*/
#define BOTTOM_START_Y              (UI_MAINWINDOW_HEIGHT*9/10)                 /*底部状态栏起始Y*/
#define BOTTOM_END_Y                (UI_MAINWINDOW_HEIGHT-BOTTOM_START_Y)       /*底部状态栏高度Y*/
#define TITLE2_START_Y           	TITLE_END_Y                                                                    /*第二个标题起始Y*/
#define TITLE2_END_Y                (25U)                                                                                /*第二个标题栏高度Y*/    
/*状态栏宽度,位置设定*/
/*upper*/
#define PAGE_DEVICE_STATE_START_X   (0U)                                        /*设备状态起始X*/
#define PAGE_DEVICE_STATE_END_X     (UI_MAINWINDOW_WIDTH*2/10U)                 /*设备状态长度X*/
  
#define PAGE_TITLE_START_X          PAGE_DEVICE_STATE_END_X                     /*页面标题起始X*/
#define PAGE_TITLE_END_X            (UI_MAINWINDOW_WIDTH*6/10U)                 /*页面标题长度X*/
  
#define PAGE_CLOCK_START_X          (UI_MAINWINDOW_WIDTH*8/10U)                 /*页面时钟起始X*/
#define PAGE_CLOCK_END_X            (UI_MAINWINDOW_WIDTH-PAGE_CLOCK_START_X)    /*页面时钟长度X*/    
/*bottom*/  
#define PAGE_TIPS_OPT_START_X       (0U)                                        /*页面操作提示起始X*/
#define PAGE_TIPS_OPT_END_X         (UI_MAINWINDOW_WIDTH*9/10U)                 /*页面操作提示长度X*/
  
#define PAGE_TIPS_PAGENUM_START_X   PAGE_TIPS_OPT_END_X                         /*页面数目提示起始X*/
#define PAGE_TIPS_PAGENUM_END_X     (UI_MAINWINDOW_WIDTH-PAGE_TIPS_OPT_END_X)   /*页面数目提示长度X*/
  
/*设定下拉框属性*/ 
#define PAGE_COMBO_BOX_START_X      (UI_MAINWINDOW_WIDTH*6/10U)                 /*下拉框起始X*/
#define PAGE_COMBO_BOX_END_X        (UI_MAINWINDOW_WIDTH*37/100U)               /*下拉框长度X*/
#define PAGE_COMBO_BOX_NUM_MAX      (8U)                                        /*下拉框列表最大数量*/
#define PAGE_MULTI_COMBO_BOX_V_GAP  (10U)                                       /*下拉框垂直间隙*/
#define PAGE_COMBO_BOX_ORIGIN_Y     TITLE_END_Y                                 /*下拉框起始Y*/  
/*通过计算下拉框允许高度Y*/
#define PAGE_COMBO_BOX_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_COMBO_BOX_V_GAP*(PAGE_COMBO_BOX_NUM_MAX+1)))/PAGE_COMBO_BOX_NUM_MAX)
/*计算多个下拉框Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define PAGE_MULTI_COMBO_BOX_V_Y(X)   (PAGE_COMBO_BOX_ORIGIN_Y+PAGE_MULTI_COMBO_BOX_V_GAP*(X+1)+PAGE_COMBO_BOX_HEIGHT*X)  
/*设定通用多按钮 垂直分布 属性*/
#define PAGE_BUTTON_START_X         (UI_MAINWINDOW_WIDTH*1/10U)                 /*按钮起始X*/
#define PAGE_BUTTON_END_X           (UI_MAINWINDOW_WIDTH*8/10U)                 /*按钮长度X*/
#define PAGE_MULTI_BUTTON_V_GAP     (5U)                                        /*按钮垂直间隙*/
#define PAGE_BUTTON_V_NUM_MAX       (8U)                                        /*最大允许按钮数目*/
#define PAGE_BUTTON_ORIGIN_Y        TITLE_END_Y                                 /*按钮起始Y*//*通过计算按钮允许高度Y*/
#define PAGE_BUTTON_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_BUTTON_V_GAP*(PAGE_BUTTON_V_NUM_MAX+1)))/PAGE_BUTTON_V_NUM_MAX)
/*计算多个按钮Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define PAGE_MULTI_BUTTON_V_Y(X)   (PAGE_BUTTON_ORIGIN_Y+PAGE_MULTI_BUTTON_V_GAP*(X+1)+PAGE_BUTTON_HEIGHT*X) 
/*设定通用多按钮 水平分布 属性*/
#define PAGE_BUTTON_START_Y         (UI_MAINWINDOW_WIDTH*1/10U)                 /*按钮起始Y*/
#define PAGE_BUTTON_END_Y           (UI_MAINWINDOW_WIDTH*1/10U)                 /*按钮高度Y*/
#define PAGE_MULTI_BUTTON_X_GAP     (10U)                                       /*按钮水平间隙*/
#define PAGE_BUTTON_H_NUM_MAX       (4U)                                        /*最大允许按钮数目*/
#define PAGE_BUTTON_LEFT_INVALID_LEN     (0U)                                   /*左边不可用长度*/
#define PAGE_BUTTON_RIGHT_INVALID_LEN    (0U)                                   /*右边不可用长度*/
#define PAGE_BUTTON_ORIGIN_X        PAGE_BUTTON_LEFT_INVALID_LEN                /*按钮起始X*/
/*通过计算按钮允许宽度X*/
#define PAGE_BUTTON_WIDTH       \
((UI_MAINWINDOW_WIDTH-PAGE_BUTTON_LEFT_INVALID_LEN-PAGE_BUTTON_RIGHT_INVALID_LEN-(PAGE_MULTI_BUTTON_X_GAP*(PAGE_BUTTON_H_NUM_MAX+1)))/PAGE_BUTTON_H_NUM_MAX)
/*计算多个按钮X坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define PAGE_MULTI_BUTTON_H_X(X)   (PAGE_BUTTON_ORIGIN_X+PAGE_MULTI_BUTTON_X_GAP*(X+1)+PAGE_BUTTON_WIDTH*X) 
/*设定显示框属性*/
#define PAGE_DISPLAY_BOX_START_X      (UI_MAINWINDOW_WIDTH*6/10U)               /*显示框起始X*/
#define PAGE_DISPLAY_BOX_END_X        (UI_MAINWINDOW_WIDTH*37/100U)             /*显示框长度X*/
#define PAGE_MULTI_DISPLAY_BOX_V_GAP  (10U)                                     /*显示框垂直间隙*/
#define PAGE_DISPLAY_BOX_V_NUM_MAX    (8U)                                      /*最大允许显示框数目*/
#define PAGE_DISPLAY_BOX_ORIGIN_Y     TITLE_END_Y                               /*显示框起始Y*/
/*通过计算显示框允许高度Y*/
#define PAGE_DISPLAY_BOX_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_DISPLAY_BOX_V_GAP*(PAGE_DISPLAY_BOX_V_NUM_MAX+1)))/PAGE_DISPLAY_BOX_V_NUM_MAX)
/*计算多个显示框Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define PAGE_MULTI_DISPLAY_BOX_V_Y(X)   (PAGE_DISPLAY_BOX_ORIGIN_Y+PAGE_MULTI_DISPLAY_BOX_V_GAP*(X+1)+PAGE_DISPLAY_BOX_HEIGHT*X)  
/*设定编辑框属性*/
#define PAGE_EDIT_BOX_START_X         (UI_MAINWINDOW_WIDTH*6/10U)               /*编辑框起始X*/
#define PAGE_EDIT_BOX_END_X           (UI_MAINWINDOW_WIDTH*37/100U)             /*编辑框长度X*/
#define PAGE_MULTI_EDIT_BOX_V_GAP     (10U)                                     /*编辑框垂直间隙*/
#define PAGE_EDIT_BOX_NUM_MAX         (8U)                                      /*最大允许编辑框数目*/
#define PAGE_EDIT_BOX_ORIGIN_Y        TITLE_END_Y                               /*编辑框起始Y*/
/*通过计算编辑框允许高度Y*/
#define PAGE_EDIT_BOX_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_EDIT_BOX_V_GAP*(PAGE_EDIT_BOX_NUM_MAX+1)))/PAGE_EDIT_BOX_NUM_MAX)
/*计算多个编辑框Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define PAGE_MULTI_EDIT_BOX_V_Y(X)   (PAGE_EDIT_BOX_ORIGIN_Y+PAGE_MULTI_EDIT_BOX_V_GAP*(X+1)+PAGE_EDIT_BOX_HEIGHT*X)  
/*设定通用标签属性*/
#define PAGE_LABEL_START_X            (UI_MAINWINDOW_WIDTH*4/100U)              /*标签起始X*/
#define PAGE_LABEL_END_X              (UI_MAINWINDOW_WIDTH*55/100U)             /*标签长度X*/
#define PAGE_MULTI_LABEL_V_GAP        (10U)                                     /*标签垂直间隙*/
#define PAGE_LABEL_NUM_MAX            (8U)                                      /*最大允许标签数目*/
#define PAGE_LABEL_ORIGIN_Y           TITLE_END_Y                               /*标签起始Y*/
/*通过计算标签允许高度Y*/
#define PAGE_LABEL_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(PAGE_MULTI_LABEL_V_GAP*(PAGE_LABEL_NUM_MAX+1)))/PAGE_LABEL_NUM_MAX)
/*计算多个标签Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define PAGE_MULTI_LABEL_V_Y(X)   (PAGE_LABEL_ORIGIN_Y+PAGE_MULTI_LABEL_V_GAP*(X+1)+PAGE_LABEL_HEIGHT*X) /*设定对话框显示区域*/
#define PAGE_DIGLOG_BOX_START_X         (UI_MAINWINDOW_WIDTH*2/10U)             /*对话框起始X*/
#define PAGE_DIGLOG_BOX_END_X           (UI_MAINWINDOW_WIDTH*6/10U)             /*对话框长度X*/
#define PAGE_DIGLOG_BOX_START_Y         (UI_MAINWINDOW_HEIGHT*3/10U)            /*对话框起始Y*/
#define PAGE_DIGLOG_BOX_END_Y           (UI_MAINWINDOW_HEIGHT*4/10U)            /*对话框高度Y*/
#define PAGE_DIGLOG_BOX_TEXT_START_X    (5U)                                    /*对话框文本相对起始X*/
#define PAGE_DIGLOG_BOX_TEXT_END_X      (PAGE_DIGLOG_BOX_END_X-5U)              /*对话框文本长度X*/
#define PAGE_DIGLOG_BOX_TEXT_START_Y    (10U)                                   /*对话框文本相对起始Y*/
#define PAGE_DIGLOG_BOX_TEXT_END_Y      (20U)                                   /*对话框文本高度Y*/
#define PAGE_DIGLOG_BOX_BUTTON1_START_X (PASSWD_DIGLOG_BOX_END_X*2/10)          /*对话框按钮相对起始X*/
#define PAGE_DIGLOG_BOX_BUTTON1_END_X   (PASSWD_DIGLOG_BOX_END_X*3/10)          /*对话框按钮长度X*/
#define PAGE_DIGLOG_BOX_BUTTON1_START_Y (PASSWD_DIGLOG_BOX_END_Y*4/10)          /*对话框按钮相对起始Y*/
#define PAGE_DIGLOG_BOX_BUTTON1_END_Y   (25U)                                   /*对话框按钮高度Y*/
#define PAGE_DIGLOG_BOX_BUTTON2_START_X (PASSWD_DIGLOG_BOX_END_X*5/10)          /*对话框按钮相对起始X*/
#define PAGE_DIGLOG_BOX_BUTTON2_END_X   (PASSWD_DIGLOG_BOX_END_X*3/10)          /*对话框按钮长度X*/
#define PAGE_DIGLOG_BOX_BUTTON2_START_Y (PASSWD_DIGLOG_BOX_END_Y*4/10)          /*对话框按钮相对起始Y*/
#define PAGE_DIGLOG_BOX_BUTTON2_END_Y   (25U)                                   /*对话框按钮高度Y*/
/*===============================特殊指定坐标=================================*/
/*===寻参界面参数坐标===*/
/*设定标签属性*/
#define PARA_LABEL_START_X            (UI_MAINWINDOW_WIDTH*4/100U)              /*标签起始X*/
#define PARA_LABEL_END_X              (UI_MAINWINDOW_WIDTH*55/100U)             /*标签长度X*/
#define PARA_MULTI_LABEL_V_GAP        (10U)                                     /*标签垂直间隙*/
#define PARA_LABEL_NUM_MAX            (8U)                                      /*最大允许标签数目*/
#define PARA_LABEL_ORIGIN_Y           (TITLE_END_Y+TITLE2_END_Y)                /*标签起始Y*/
/*通过计算标签允许高度Y*/
#define PARA_LABEL_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-TITLE2_END_Y-BOTTOM_END_Y-(PARA_MULTI_LABEL_V_GAP*(PARA_LABEL_NUM_MAX+1)))/PARA_LABEL_NUM_MAX)
/*计算多个标签Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define PARA_MULTI_LABEL_V_Y(X)   (PARA_LABEL_ORIGIN_Y+PARA_MULTI_LABEL_V_GAP*(X+1)+PARA_LABEL_HEIGHT*X) /*设定显示框属性*/
#define PARA_DISPLAY_BOX_START_X      (UI_MAINWINDOW_WIDTH*6/10U)               /*显示框起始X*/
#define PARA_DISPLAY_BOX_END_X        (UI_MAINWINDOW_WIDTH*37/100U)             /*显示框长度X*/
#define PARA_MULTI_DISPLAY_BOX_V_GAP  (10U)                                     /*显示框垂直间隙*/
#define PARA_DISPLAY_BOX_V_NUM_MAX    (8U)                                      /*最大允许显示框数目*/
#define PARA_DISPLAY_BOX_ORIGIN_Y     (TITLE_END_Y+TITLE2_END_Y)                /*显示框起始Y*/
/*通过计算显示框允许高度Y*/
#define PARA_DISPLAY_BOX_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-TITLE2_END_Y-BOTTOM_END_Y-(PARA_MULTI_DISPLAY_BOX_V_GAP*(PARA_DISPLAY_BOX_V_NUM_MAX+1)))/PARA_DISPLAY_BOX_V_NUM_MAX)
/*计算多个显示框Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define PARA_MULTI_DISPLAY_BOX_V_Y(X)   (PARA_DISPLAY_BOX_ORIGIN_Y+PARA_MULTI_DISPLAY_BOX_V_GAP*(X+1)+PARA_DISPLAY_BOX_HEIGHT*X)  
/*进度条属性设置*/
#define PROGBAR_START_X               (0U)
#define PROGBAR_END_X                 UI_MAINWINDOW_WIDTH
#define PROGBAR_START_Y               BOTTOM_START_Y
#define PROGBAR_END_Y                 BOTTOM_END_Y
/*===重置参数坐标===*/
#define PAGE_RESET_LABEL_START_X      (0U)                                      /*重置提示起始X*/
#define PAGE_RESET_LABEL_END_X        UI_MAINWINDOW_WIDTH                       /*重置提示长度X*/
#define PAGE_RESET_LABEL_START_Y      (TITLE_START_Y+TITLE_END_Y)               /*重置提示起始Y*/
#define PAGE_RESET_LABEL_END_Y        (UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y)  
#define PAGE_RESET_BUTTON_START_X     (UI_MAINWINDOW_WIDTH*2/10U)               /*重置按钮起始X*/
#define PAGE_RESET_BUTTON_END_X       (UI_MAINWINDOW_WIDTH*6/10U)               /*重置按钮长度X*/
#define PAGE_RESET_BUTTON_START_Y     BOTTOM_START_Y                            /*重置按钮起始Y*/
#define PAGE_RESET_BUTTON_END_Y       BOTTOM_END_Y                              /*重置按钮高度Y*/
/*===设定实时界面坐标===*/
/*设定通道数量显示区域属性*/
#define REALTIME_CHANNEL_NUMBER_START_X  (UI_MAINWINDOW_WIDTH/2U)               /*实时页面通道数量起始X*/
#define REALTIME_CHANNEL_NUMBER_START_Y  (UI_MAINWINDOW_WIDTH*1/100U)           /*实时页面通道数量起始Y*/
/*设定时间显示区域属性*/
#define REALTIME_CLOCK_START_X        (UI_MAINWINDOW_WIDTH*75/100U)             /*实时页面时间起始X*/
#define REALTIME_CLOCK_END_X          UI_MAINWINDOW_WIDTH                       /*实时页面时间终点X*/
#define REALTIME_CLOCK_START_Y        (0U)                                      /*实时页面时间起始Y*/
#define REALtime_CLOCK_END_Y          TITLE_END_Y                        
/*设定锁屏状态区域*/
#define REALTIME_LOCK_START_X         (UI_MAINWINDOW_WIDTH*7/10U)               /*实时页面锁屏起始X*/
#define REALTIME_LOCK_END_X           (REALTIME_LOCK_START_X+10U)               /*实时页面锁屏终点X*/
#define REALTIME_LOCK_START_Y         (0U)                                      /*实时页面锁屏起始Y*/
#define REALTIME_LOCK_END_Y           TITLE_END_Y                               /*实时页面锁屏终点Y*/
/*设定报警状态显示区域*/
#define REALTIME_ALARM_STATE_START_X        (UI_MAINWINDOW_WIDTH*12/100U)       /*实时页面报警状态起始X*/
#define REALTIME_ALARM_STATE_START_Y        (4U)                                /*实时页面报警状态起始Y*/
/*报警通道号*/       
#define REALTIME_ALARM_CHANNEL_NUM_START_X  (UI_MAINWINDOW_WIDTH*23/100U)       /*实时页面报警通道起始X*/
#define REALTIME_ALARM_CHANNEL_NUM_START_Y  (UI_MAINWINDOW_WIDTH*3/100U)        /*实时页面报警通道起始Y*/
/*设定链接状态显示*/
#define REALTIME_CONNECT_STATE_START_X      (6U)                                /*实时页面链接状态起始X*/
#define REALTIME_CONNECT_STATE_START_Y      (6U)                                /*实时页面链接状态起始Y*/
/*设定电池图标*/
#define REALTIME_BATTERY_START_X      (2U)                                      /*实时页面电池图标显示起始X*/
#define REALTIME_BATTERY_END_X        (8U)                                      /*实时页面电池图标显示起始Y*/
/*设定不支持类型信息区域*/
#define BOARD_NOSUPPORT_START_X       (UI_MAINWINDOW_WIDTH/2U)                  /*实时页面不支持类型信息起始X*/
#define BOARD_NOSUPPORT_START_Y       (UI_MAINWINDOW_HEIGHT*3/10U)              /*实时页面不支持类型信息起始Y*/
/*设定支持类型信息区域*/
#define BOARD_SUPPORT_START_X         (UI_MAINWINDOW_WIDTH/2U)                  /*实时页面支持类型信息起始X*/
#define BOARD_SUPPORT_START_Y         (UI_MAINWINDOW_HEIGHT*45/100U)            /*实时页面支持类型信息起始Y*/
/*----------------------通道块状显示------------------*/
#define REALTIME_BLOCKSTYLE_MULTI_RECT_X_GAP     (2U)                           /*实时页面矩形水平间隙*/
#define REALTIME_BLOCKSTYLE_MULTI_RECT_Y_GAP     (2U)                           /*实时页面矩形垂直间隙*/
#define REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX       (3U)                           /*实时页面最大允许每行矩形数目*/
#define REALTIME_BLOCKSTYLE_RECT_V_NUM_MAX       (2U)                           /*实时页面最大允许矩形行数目*/
#define REALTIME_BLOCKSTYLE_RECT_LEFT_INVALID_LEN     (0U)                      /*实时页面左边不可用长度*/
#define REALTIME_BLOCKSTYLE_RECT_RIGHT_INVALID_LEN    (0U)                      /*实时页面右边不可用长度*/
#define REALTIME_BLOCKSTYLE_RECT_START_Y         (TITLE_START_Y+TITLE_END_Y)    /*实时页面矩形起始Y*/
#define REALTIME_BLOCKSTYLE_RECT_ORIGIN_X        REALTIME_BLOCKSTYLE_RECT_LEFT_INVALID_LEN /*实时页面矩形起始X*/
/*通过计算每通道矩形允许宽度X*/
#define REALTIME_BLOCKSTYLE_RECT_WIDTH       \
((UI_MAINWINDOW_WIDTH-REALTIME_BLOCKSTYLE_RECT_LEFT_INVALID_LEN-REALTIME_BLOCKSTYLE_RECT_RIGHT_INVALID_LEN-(REALTIME_BLOCKSTYLE_MULTI_RECT_X_GAP*(REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX+1)))/REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX)
/*通过计算每通道矩形允许高度Y*/
#define REALTIME_BLOCKSTYLE_RECT_END_Y       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(REALTIME_BLOCKSTYLE_MULTI_RECT_Y_GAP*(REALTIME_BLOCKSTYLE_RECT_V_NUM_MAX+1)))/REALTIME_BLOCKSTYLE_RECT_V_NUM_MAX) /*实时页面矩形宽度Y*/
/*计算多个通道矩形X坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define REALTIME_BLOCKSTYLE_MULTI_RECT_H_X(X)   (REALTIME_BLOCKSTYLE_RECT_ORIGIN_X+REALTIME_BLOCKSTYLE_MULTI_RECT_X_GAP*((X%REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCKSTYLE_RECT_WIDTH*(X%REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX))
/*计算多个通道矩形Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_BLOCKSTYLE_MULTI_RECT_Y_X(X)   (REALTIME_BLOCKSTYLE_RECT_START_Y+REALTIME_BLOCKSTYLE_MULTI_RECT_Y_GAP*((X/REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCKSTYLE_RECT_END_Y*(X/REALTIME_BLOCKSTYLE_RECT_H_NUM_MAX))
/*设定块状线条*/
#define REALTIME_BLOCKSTYLE_LINE_START_X           (REALTIME_UNIT_START_X+REALTIME_UNIT_END_X+5U)    /*实时页面线条起始X*/
#define REALTIME_BLOCKSTYLE_LINE_END_X             (UI_MAINWINDOW_WIDTH-REALTIME_LINE_START_X-REALTIME_SLIP_START_X) /*实时页面线条长度X*/
#define REALTIME_BLOCKSTYLE_LINE_START_Y(X)        (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_SLIP_HEIGHT/2U)   /*实时页面线条起始Y*/
#define REALTIME_BLOCKSTYLE_LINE_END_Y             (0U) 
/*设定块状通道编号*/
/*设定块状浓度值*/
/*设定块状单位*/
/*设定块状报警铃*/
/*设定块状报警时间*/
/*气体类型化学式*/
/*气体类型中文*/
/*----设定1通道块状高度----*/
#define REALTIME_BLOCK_1_STYLE_RECT_START_Y        (TITLE_START_Y+TITLE_END_Y)  /*块状1通道显示起始Y*/
#define REALTIME_BLOCKS_1_TYLE_MULTI_RECT_X_GAP    (5U)                         /*块状1通道水平间隙*/
#define REALTIME_BLOCK_1_STYLE_MULTI_RECT_Y_GAP    (5U)                         /*块状1通道垂直间隙*/
#define REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX      (1U)                         /*块状1通道水平数量*/
#define REALTIME_BLOCK_1_STYLE_RECT_V_NUM_MAX      (1U)                         /*块状1通道放置行数以1开始*/
#define REALTIME_BLOCK_1_STYLE_RECT_ORIGIN_X       (0U)                         /*块状1通道显示起始X*/
/*通过计算每通道矩形允许宽度X*/
#define REALTIME_BLOCK_1_STYLE_RECT_WIDTH       \
((UI_MAINWINDOW_WIDTH-(REALTIME_BLOCKS_1_TYLE_MULTI_RECT_X_GAP*(REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX+1)))/REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX)
/*通过计算每通道矩形允许高度Y*/
#define REALTIME_BLOCK_1_STYLE_RECT_END_Y       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(REALTIME_BLOCK_1_STYLE_MULTI_RECT_Y_GAP*(REALTIME_BLOCK_1_STYLE_RECT_V_NUM_MAX+1)))/REALTIME_BLOCK_1_STYLE_RECT_V_NUM_MAX)                                /*实时页面矩形宽度Y*/
/*计算2通道矩形X坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define REALTIME_BLOCK_1_STYLE_MULTI_RECT_H_X(X)   (REALTIME_BLOCK_1_STYLE_RECT_ORIGIN_X+REALTIME_BLOCKS_1_TYLE_MULTI_RECT_X_GAP*((X%REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCK_1_STYLE_RECT_WIDTH*(X%REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX))
/*计算2通道矩形Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_BLOCK_1_STYLE_MULTI_RECT_Y_X(X)   (REALTIME_BLOCK_1_STYLE_RECT_START_Y+REALTIME_BLOCK_1_STYLE_MULTI_RECT_Y_GAP*((X/REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCK_1_STYLE_RECT_END_Y*(X/REALTIME_BLOCK_1_STYLE_RECT_H_NUM_MAX))
/*----设定2通道块状高度----*/
#define REALTIME_BLOCK_2_STYLE_RECT_START_Y        (TITLE_START_Y+TITLE_END_Y)  /*块状2通道显示起始Y*/
#define REALTIME_BLOCKS_2_TYLE_MULTI_RECT_X_GAP    (5U)                         /*块状2通道水平间隙*/
#define REALTIME_BLOCK_2_STYLE_MULTI_RECT_Y_GAP    (5U)                         /*块状2通道垂直间隙*/
#define REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX      (2U)                         /*块状2通道水平数量*/
#define REALTIME_BLOCK_2_STYLE_RECT_V_NUM_MAX      (1U)                         /*块状2通道放置行数以1开始*/
#define REALTIME_BLOCK_2_STYLE_RECT_ORIGIN_X       (0U)                         /*块状2通道显示起始X*/
/*通过计算每通道矩形允许宽度X*/
#define REALTIME_BLOCK_2_STYLE_RECT_WIDTH       \
((UI_MAINWINDOW_WIDTH-(REALTIME_BLOCKS_2_TYLE_MULTI_RECT_X_GAP*(REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX+1)))/REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX)
/*通过计算每通道矩形允许高度Y*/
#define REALTIME_BLOCK_2_STYLE_RECT_END_Y       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(REALTIME_BLOCK_2_STYLE_MULTI_RECT_Y_GAP*(REALTIME_BLOCK_2_STYLE_RECT_V_NUM_MAX+1)))/REALTIME_BLOCK_2_STYLE_RECT_V_NUM_MAX)                                /*实时页面矩形宽度Y*/
/*计算2通道矩形X坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define REALTIME_BLOCK_2_STYLE_MULTI_RECT_H_X(X)   (REALTIME_BLOCK_2_STYLE_RECT_ORIGIN_X+REALTIME_BLOCKS_2_TYLE_MULTI_RECT_X_GAP*((X%REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCK_2_STYLE_RECT_WIDTH*(X%REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX))
/*计算2通道矩形Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define REALTIME_BLOCK_2_STYLE_MULTI_RECT_Y_X(X)   (REALTIME_BLOCK_2_STYLE_RECT_START_Y+REALTIME_BLOCK_2_STYLE_MULTI_RECT_Y_GAP*((X/REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX)+1)+REALTIME_BLOCK_2_STYLE_RECT_END_Y*(X/REALTIME_BLOCK_2_STYLE_RECT_H_NUM_MAX))
/*-------------------------通道条状显示-------------------*/
#define REALTIME_SLIP_START_X         (2U)                                            /*实时页面通道条状起始X*/
#define REALTIME_SLIP_END_X           (UI_MAINWINDOW_WIDTH-REALTIME_SLIP_START_X*2U)  /*实时页面通道条状长度X*/
#define REALTIME_MULTI_SLIP_V_GAP     (4U)                                            /*实时页面通道条状垂直间隙*/
#define REALTIME_SLIP_V_NUM_MAX       (4U)                                            /*最大允许实时页面通道条状数目*/
#define REALTIME_SLIP_ORIGIN_Y        TITLE_END_Y                                     /*实时页面通道条状起始Y*/
#define REALTIME_ROUND_VALUE          (6U)                                            /*设定倒角*/
/*通过计算条状显示允许高度Y*/
#define REALTIME_SLIP_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-BOTTOM_END_Y-(REALTIME_MULTI_SLIP_V_GAP*(REALTIME_SLIP_V_NUM_MAX+1)))/REALTIME_SLIP_V_NUM_MAX)
/*计算多个条状显示Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define REALTIME_MULTI_SLIP_V_Y(X)   (REALTIME_SLIP_ORIGIN_Y+REALTIME_MULTI_SLIP_V_GAP*(X+1)+REALTIME_SLIP_HEIGHT*X) 
/*设定通道编号显示区域*/
#define REALTIME_CHANNEL_NUM_START_X    (REALTIME_SLIP_START_X+2U)                   /*实时页面编号显示起始X*/
#define REALTIME_CHANNEL_NUM_END_X      (32U)                                        /*实时页面编号显示长度X*/
#define REALTIME_CHANNEL_NUM_GAP_V      (2U)                                         /*实时页面编号显示垂直间隙*/
#define REALTIME_CHANNEL_NUM_START_Y(X) (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_CHANNEL_NUM_GAP_V) /*实时页面编号起始Y*/
#define REALTIME_CHANNEL_NUM_END_Y      (REALTIME_SLIP_HEIGHT-REALTIME_UNIT_GAP_V*2) /*实时页面编号高度Y*/
/*设定报警铃显示区域*/
#define REALTIME_ICO_START_X            (REALTIME_CHANNEL_NUM_START_X+REALTIME_CHANNEL_NUM_END_X+4U) /*实时页面图标显示起始X*/
#define REALTIME_ICO_END_X              (32U)                                            /*实时页面图标显示长度X*/
#define REALTIME_ICO_GAP_V              (2U)                                             /*实时页面图标显示垂直间隙*/
#define REALTIME_ICO_START_Y(X)         (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_ICO_GAP_V)  /*实时页面图标显示起始Y*/
#define REALTIME_ICO_END_Y              (REALTIME_SLIP_HEIGHT-REALTIME_ICO_GAP_V*2U)     /*实时页面图标显示高度Y*/
/*设定浓度显示区域*/
#define REALTIME_VALUE_START_X          (REALTIME_ICO_START_X+REALTIME_ICO_END_X+4U)    /*实时页面浓度值起始X*/
#define REALTIME_VALUE_END_X            (160U)                                           /*实时页面浓度值长度X*/
#define REALTIME_VALUE_GAP_V            (2U)                                             /*实时页面浓度显示垂直间隙*/
#define REALTIME_VALUE_START_Y(X)       (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_VALUE_GAP_V)/*实时页面浓度值起始Y*/
#define REALTIME_VALUE_END_Y            (REALTIME_SLIP_HEIGHT-REALTIME_VALUE_GAP_V*2U)    /*实时页面浓度值高度Y*/
/*设定单位显示区域*/
#define REALTIME_UNIT_START_X           (REALTIME_VALUE_START_X+REALTIME_VALUE_END_X+2U) /*实时页面单位显示起始X*/
#define REALTIME_UNIT_END_X             (32U)                                            /*实时页面单位显示长度X*/
#define REALTIME_UNIT_GAP_V             (2U)                                             /*实时页面单位显示垂直间隙*/
#define REALTIME_UNIT_START_Y(X)        (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_UNIT_GAP_V) /*实时页面单位显示起始Y*/
#define REALTIME_UNIT_END_Y             (REALTIME_SLIP_HEIGHT-REALTIME_UNIT_GAP_V*2U)    /*实时页面单位显示高度Y*/
/*设定线条显示区域*/
#define REALTIME_LINE_START_X           (REALTIME_UNIT_START_X+REALTIME_UNIT_END_X+5U)    /*实时页面线条起始X*/
#define REALTIME_LINE_END_X             (UI_MAINWINDOW_WIDTH-REALTIME_LINE_START_X-REALTIME_SLIP_START_X) /*实时页面线条长度X*/
#define REALTIME_LINE_START_Y(X)        (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_SLIP_HEIGHT/2U)   /*实时页面线条起始Y*/
#define REALTIME_LINE_END_Y             (0U)                                                   /*实时页面线条高度Y*/
/*设定气体类型显示区域*/
#define REALTIME_GASTYPE_START_X        (REALTIME_LINE_START_X+REALTIME_LINE_END_X-36*3U)                      /*实时页面气体类型起始X*/
#define REALTIME_GASTYPE_END_X          (UI_MAINWINDOW_WIDTH-REALTIME_GASTYPE_START_X-REALTIME_SLIP_START_X)/*实时页面气体类型长度X*/
#define REALTIME_GASTYPE_GAP_V          (2U)                                                  /*实时页面气体类型垂直间隙*/
#define REALTIME_GASTYPE_START_Y(X)     (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_GASTYPE_GAP_V)   /*实时页面气体类型显示起始Y*/
#define REALTIME_GASTYPE_END_Y          (REALTIME_SLIP_HEIGHT/2U-REALTIME_GASTYPE_GAP_V*2U)   /*实时页面气体类型高度Y*/
/*设定气体名称显示区域----bottom*/
#define REALTIME_GASNAME_START_X        REALTIME_GASTYPE_START_X                          /*实时页面气体名称起始X*/
#define REALTIME_GASNAME_END_X          (UI_MAINWINDOW_WIDTH-REALTIME_GASTYPE_START_X-REALTIME_SLIP_START_X)/*实时页面气体名称程度X*/
#define REALTIME_GASNAME_GAP_V          (2U)                                              /*实时页面气体名称垂直间隙*/
#define REALTIME_GASNAME_START_Y(X)     (REALTIME_LINE_START_Y(X)+REALTIME_GASNAME_GAP_V) /*实时页面气体名称显示起始Y*/
#define REALTIME_GASNAME_END_Y          (REALTIME_SLIP_HEIGHT/2U-REALTIME_GASNAME_GAP_V*2U)    /*时页面气体名称高度Y*/
/*设定报警时间显示区域----upper*/
#define REALTIME_ALARMTIME_START_X      REALTIME_LINE_START_X                                   /*实时页面报警时间显示起始X*/
#define REALTIME_ALARMTIME_END_X        (REALTIME_LINE_END_X/2U)                                /*实时页面报警时间显示长度X*/
#define REALTIME_ALARMTIME_GAP_V        (2U)                                                    /*实时页面报警时间显示垂直间隙*/
#define REALTIME_ALARMTIME_START_Y(X)   (REALTIME_MULTI_SLIP_V_Y(X)+REALTIME_ALARMTIME_GAP_V)   /*实时页面报警时间显示起始Y*/
#define REALTIME_ALARMTIME_END_Y        (REALTIME_SLIP_HEIGHT/2U-REALTIME_ALARMTIME_GAP_V*2U)   /*实时页面报警时间显示高度Y*/
/*设定房间名称显示区域----bottom*/
#define REALTIME_ROOM_START_X           REALTIME_ALARMTIME_START_X                              /*实时页面房间名称显示起始X*/
#define REALTIME_ROOM_END_X             (REALTIME_LINE_END_X/2U)                                /*实时页面房间名称显示长度X*/
#define REALTIME_ROOM_GAP_V             (2U)                                                    /*实时页面房间名称显示垂直间隙*/
#define REALTIME_ROOM_START_Y(X)        (REALTIME_LINE_START_Y(X)+REALTIME_ROOM_GAP_V)          /*实时页面房间名称显示起始Y*/
#define REALTIME_ROOM_END_Y             (REALTIME_SLIP_HEIGHT/2U-REALTIME_ALARMTIME_GAP_V*2U)   /*实时页面房间名称显示高度Y*/
/*===菜单 按钮最小间隙设定===*/
#define MENU_TITLE_START_Y            (0U)                                      /*菜单标题栏起始Y*/
#define MENU_TITLE_END_Y              (UI_MAINWINDOW_HEIGHT*12/100)             /*菜单标题栏高度Y*/
#define MENU_BOTTOM_START_Y           (UI_MAINWINDOW_HEIGHT*9/10)               /*菜单底部状态栏起始Y*/
#define MENU_BOTTOM_END_Y             (UI_MAINWINDOW_HEIGHT-BOTTOM_START_Y)     /*菜单底部状态栏高度Y*/
/*upper*/
#define MENU_DEVICE_STATE_START_X     (0U)                                      /*菜单设备状态起始X*/
#define MENU_DEVICE_STATE_END_X       (UI_MAINWINDOW_WIDTH/4)                   /*菜单设备状态长度X*/
  
#define MENU_TITLE_START_X            MENU_DEVICE_STATE_END_X                   /*菜单标题起始X*/
#define MENU_TITLE_END_X              (UI_MAINWINDOW_WIDTH/2)                   /*菜单标题长度X*/
                                                                                  
#define MENU_CLOCK_START_X            (UI_MAINWINDOW_WIDTH*3/4)                 /*菜单时钟起始X*/
#define MENU_CLOCK_END_X              (UI_MAINWINDOW_WIDTH-MENU_CLOCK_START_X)  /*菜单时钟长度X*/    
                                                                                  
/*bottom*/                                                                        
#define MENU_TIPS_OPT_START_X         (0U)                                      /*菜单操作提示起始X*/
#define MENU_TIPS_OPT_END_X           (UI_MAINWINDOW_WIDTH*3/10U)               /*菜单操作提示长度X*/
                                                                                  
#define MENU_TIPS_PAGENUM_START_X     MENU_TIPS_OPT_END_X                       /*菜单数目提示起始X*/
#define MENU_TIPS_PAGENUM_END_X       (UI_MAINWINDOW_WIDTH-MENU_TIPS_OPT_END_X) /*菜单数目提示长度X*/
/*菜单 按钮属性*/
#define MENU_BUTTON_START_X           (UI_MAINWINDOW_WIDTH*3/10)                /*菜单按钮起始X*/ 
#define MENU_BUTTON_END_X             (UI_MAINWINDOW_WIDTH*4/10)                /*菜单按钮长度X*/ 
#define MENU_BUTTON_V_NUM_MAX         (5U)                                      /*菜单最大允许按钮数目*/
#define MENU_V_GAP_MIN                (5U)                                      /*菜单按钮垂直间隙*/ 
#define MENU_BUTTON_ORIGIN_Y          MENU_TITLE_END_Y                          /*菜单按钮起始Y*//*通过计算菜单按钮允许高度Y*/
#define MENU_BUTTON_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-MENU_TITLE_END_Y-MENU_BOTTOM_END_Y-(MENU_V_GAP_MIN*(MENU_BUTTON_V_NUM_MAX+1)))/MENU_BUTTON_V_NUM_MAX)
/*计算多个菜单按钮Y坐标起点,数目从0开始则间隙X需+1,高度*x不变*/  
#define MENU_MULTI_BUTTON_V_Y(X)   (MENU_BUTTON_ORIGIN_Y+MENU_V_GAP_MIN*(X+1)+MENU_BUTTON_HEIGHT*X) 
/*===设定产品名称区域===*/
#define LOGO_PRODUCT_MAME_START_X     (UI_MAINWINDOW_WIDTH/2U)                  /*产品名称起始X*/
#define LOGO_PRODUCT_MAME_START_Y     (UI_MAINWINDOW_HEIGHT*3/10U)              /*产品名称起始Y*//*设定版本号区域*/
#define LOGO_VERSION_NUM_START_X      (UI_MAINWINDOW_WIDTH/2U)                  /*版本号起始X*/
#define LOGO_VERSION_NUM_START_Y      (UI_MAINWINDOW_HEIGHT*45/100U)            /*版本号起始Y*//*产品开发进展区域*/
#define DEVELOPING_STATE_START_X      (UI_MAINWINDOW_WIDTH/2U)                  /*开发进展起始X*/
#define DEVELOPING_STATE_START_Y      (UI_MAINWINDOW_HEIGHT*3/10U)              /*开发进展起始Y*/
/*===设定密码输入对话框区域===*/
#define PASSWD_DIGLOG_BOX_START_X     (UI_MAINWINDOW_WIDTH*2/10U)               /*密码输入框起始X*/
#define PASSWD_DIGLOG_BOX_END_X       (UI_MAINWINDOW_WIDTH*6/10U)               /*密码输入框长度X*/
#define PASSWD_DIGLOG_BOX_START_Y     (UI_MAINWINDOW_HEIGHT*3/10U)              /*密码输入框起始Y*/
#define PASSWD_DIGLOG_BOX_END_Y       (UI_MAINWINDOW_HEIGHT*4/10U)              /*密码输入框高度Y*/
#define PASSWD_DIGLOG_BOX_TEXT_START_X  (5U)                                    /*密码输入框文本相对起始X*/
#define PASSWD_DIGLOG_BOX_TEXT_END_X    (150U)                                  /*密码输入框文本长度X*/
#define PASSWD_DIGLOG_BOX_TEXT_START_Y  (10U)                                   /*密码输入框文本相对起始Y*/
#define PASSWD_DIGLOG_BOX_TEXT_END_Y    (20U)                                   /*密码输入框文本高度Y*/
#define PASSWD_DIGLOG_BOX_EDIT_START_X  (PASSWD_DIGLOG_BOX_END_X*3/10)          /*密码输入框编辑相对起始X*/
#define PASSWD_DIGLOG_BOX_EDIT_END_X    (PASSWD_DIGLOG_BOX_END_X*4/10)          /*密码输入框编辑长度X*/
#define PASSWD_DIGLOG_BOX_EDIT_START_Y  (PASSWD_DIGLOG_BOX_END_Y*5/10)          /*密码输入框编辑相对起始Y*/
#define PASSWD_DIGLOG_BOX_EDIT_END_Y    (25U)                                   /*密码输入框编辑高度Y*/
/*===设定电流环校准页面文本及按钮区域===*/
#define CURRENTLOOP_BUTTON_START_X    (UI_MAINWINDOW_WIDTH*2/10U)               /*校准按钮起始X*/
#define CURRENTLOOP_BUTTON_END_X      (UI_MAINWINDOW_WIDTH*6/10U)               /*校准按钮长度X*/
#define CURRENTLOOP_BUTTON_START_Y    (BOTTOM_START_Y-2U)                       /*校准按钮起始Y*/
#define CURRENTLOOP_BUTTON_END_Y      BOTTOM_END_Y                              /*校准按钮高度Y*/
#define CURRENTLOOP_TEXT_START_X    (UI_MAINWINDOW_WIDTH*4/100U)                /*校准文本起始X*/
#define CURRENTLOOP_TEXT_END_X      (UI_MAINWINDOW_WIDTH*92/100U)               /*校准按钮长度X*/
#define CURRENTLOOP_MULTI_TEXT_V_GAP        (5U)                                /*文本垂直间隙*/
#define CURRENTLOOP_TEXT_NUM_MAX            (4U)                                /*最大允许文本数目*/
#define CURRENTLOOP_TEXT_ORIGIN_Y           TITLE_END_Y                         /*文本起始Y*//*通过计算校准页面文本允许高度Y*/
#define CURRENTLOOP_TEXT_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-TITLE_END_Y-CURRENTLOOP_BUTTON_END_Y-(CURRENTLOOP_MULTI_TEXT_V_GAP*(CURRENTLOOP_TEXT_NUM_MAX+1)))/CURRENTLOOP_TEXT_NUM_MAX)
/*计算多个文本Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define CURRENTLOOP_MULTI_TEXT_V_Y(X)   (CURRENTLOOP_TEXT_ORIGIN_Y+CURRENTLOOP_MULTI_TEXT_V_GAP*(X+1)+CURRENTLOOP_TEXT_HEIGHT*X) 
/*===设定历史数据表格及转动圆区域===*/
#define HISTRORY_CIRCLE_START_X     (UI_MAINWINDOW_WIDTH/2U)                    /*圆心在X的起点*/
#define HISTRORY_CIRCLE_START_Y     (UI_MAINWINDOW_HEIGHT/2U)                   /*圆心在Y的起点*/
#define HISTRORY_CIRCLE_R_SIZE      (UI_MAINWINDOW_HEIGHT/10U)                  /*设定圆的半径*/
#define HISTRORY_CIRCLE_ANGLE_START (0)                                         /*设定圆的起始角度--通过增大实现转动*/
#define HISTRORY_CIRCLE_ANGLE_END   (330)                                       /*设定圆的终点角度*/
#define HISTRORY_REDRAW_RECT_START_X    (HISTRORY_CIRCLE_START_X-HISTRORY_CIRCLE_R_SIZE-1)        /*重绘区域起始X*/
#define HISTRORY_REDRAW_RECT_END_X      (HISTRORY_REDRAW_RECT_START_X+HISTRORY_CIRCLE_R_SIZE*2+1) /*重绘区域终点X*/    
#define HISTRORY_REDRAW_RECT_START_Y    (HISTRORY_CIRCLE_START_Y-HISTRORY_CIRCLE_R_SIZE-1)        /*重绘区域起始Y*/  
#define HISTRORY_REDRAW_RECT_END_Y      (HISTRORY_REDRAW_RECT_START_Y+HISTRORY_CIRCLE_R_SIZE*2+1) /*重绘区域终点Y*/
#define HISTRORY_LISTVIEW_COLUMN_1_SIZE (UI_MAINWINDOW_WIDTH*2/10U)                                                             /*表格宽度*/
#define HISTRORY_LISTVIEW_COLUMN_2_SIZE (UI_MAINWINDOW_WIDTH*4/10U)                                                             /*表格宽度*/
#define HISTRORY_LISTVIEW_COLUMN_3_SIZE (UI_MAINWINDOW_WIDTH-HISTRORY_LISTVIEW_COLUMN_1_SIZE-HISTRORY_LISTVIEW_COLUMN_2_SIZE)   /*表格宽度*/
#define HISTRORY_LISTVIEW_HEAD_HEIGHT   (25U)                                           /*表格标题高度*/
#define HISTRORY_LISTVIEW_V_NUM_MAX     (8U)                                            /*表格最大允许行数目*/
#define HISTRORY_LISTVIEW_ORIGIN_Y      (HISTRORY_LISTVIEW_HEAD_HEIGHT+MENU_TITLE_END_Y)/*表格内容起始Y*/
/*通过计算表格允许高度Y*/
#define HISTRORY_LISTVIEW_ROW_HEIGHT       \
((UI_MAINWINDOW_HEIGHT-HISTRORY_LISTVIEW_ORIGIN_Y)/HISTRORY_LISTVIEW_V_NUM_MAX)
/*===设定通道搜索页面文本显示属性===*/
#define CHANNELSEARCH_LABEL_START_X (UI_MAINWINDOW_WIDTH*2/100U)                           /*通道搜索标签起始X*/    
#define CHANNELSEARCH_LABEL_END_X   (UI_MAINWINDOW_WIDTH*14/100U)                          /*通道搜索标签长度X*/
#define CHANNELSEARCH_LABEL_START_Y (UI_MAINWINDOW_HEIGHT*38/100U)                         /*通道搜索标签起始Y*/
#define CHANNELSEARCH_LABEL_END_Y   (UI_MAINWINDOW_HEIGHT*6/100U)                          /*通道搜索标签高度Y*/
#define CHANNELSEARCH_TIPS_START_X  (0U)                                                   /*通道搜索提示起始X*/
#define CHANNELSEARCH_TIPS_END_X    (UI_MAINWINDOW_WIDTH-CHANNELSEARCH_TIPS_START_X*2U)    /*通道搜索提示长度X*/
#define CHANNELSEARCH_TIPS_START_Y  (CHANNELSEARCH_LABEL_START_Y+CHANNELSEARCH_LABEL_END_Y)/*通道搜索提示起始Y*/
#define CHANNELSEARCH_TIPS_END_Y    (UI_MAINWINDOW_HEIGHT-CHANNELSEARCH_TIPS_START_Y)      /*通道搜索提示高度Y*/
/*搜索结果 正方形属性*/
#define CHANNELSEARCH_RECT_START_Y         (CHANNELSEARCH_LABEL_START_Y+CHANNELSEARCH_LABEL_END_Y+2) /*矩形起始Y*/
#define CHANNELSEARCH_MULTI_RECT_X_GAP     (2U)                                                      /*矩形水平间隙*/
#define CHANNELSEARCH_MULTI_RECT_Y_GAP     (2U)                                                      /*矩形垂直间隙*/
#define CHANNELSEARCH_RECT_H_NUM_MAX       (12U)                                                     /*最大允许矩形数目*/
#define CHANNELSEARCH_RECT_LEFT_INVALID_LEN     (0U)                                                 /*左边不可用长度*/
#define CHANNELSEARCH_RECT_RIGHT_INVALID_LEN    (0U)                                                 /*右边不可用长度*/
#define CHANNELSEARCH_RECT_ORIGIN_X        CHANNELSEARCH_RECT_LEFT_INVALID_LEN                       /*矩形起始X*/
/*通过计算矩形允许宽度X*/
#define CHANNELSEARCH_RECT_WIDTH       \
((UI_MAINWINDOW_WIDTH-CHANNELSEARCH_RECT_LEFT_INVALID_LEN-CHANNELSEARCH_RECT_RIGHT_INVALID_LEN-(CHANNELSEARCH_MULTI_RECT_X_GAP*(CHANNELSEARCH_RECT_H_NUM_MAX+1)))/CHANNELSEARCH_RECT_H_NUM_MAX)
#define CHANNELSEARCH_RECT_END_Y          (CHANNELSEARCH_RECT_WIDTH)                                 /*矩形宽度Y*/
/*计算多个矩形X坐标起点,数目从0开始则间隙X需+1,高度x不变*/  
#define CHANNELSEARCH_MULTI_RECT_H_X(X)   (CHANNELSEARCH_RECT_ORIGIN_X+CHANNELSEARCH_MULTI_RECT_X_GAP*((X%CHANNELSEARCH_RECT_H_NUM_MAX)+1)+CHANNELSEARCH_RECT_WIDTH*(X%CHANNELSEARCH_RECT_H_NUM_MAX))
/*计算多个矩形Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define CHANNELSEARCH_MULTI_RECT_Y_X(X)   (CHANNELSEARCH_RECT_START_Y+CHANNELSEARCH_MULTI_RECT_Y_GAP*((X/CHANNELSEARCH_RECT_H_NUM_MAX)+1)+CHANNELSEARCH_RECT_END_Y*(X/CHANNELSEARCH_RECT_H_NUM_MAX))
/*通道参数设置页面按钮文字空格,用于居中文字*/
#define CHANNEL_ADDSPACE_NUM_MAX        17U                                     /*按钮标签文本添加空格数,应 < 20 */
/*===设定气体类型索引页面显示属性===*/
#define ITEM_INDEX_PAGE_START_X                         (0U)                                                                /*气体类型参数索引页面起始X*/
#define ITEM_INDEX_PAGE_END_X                             UI_MAINWINDOW_WIDTH                                    /*气体类型参数索引页面长度X*/
#define ITEM_INDEX_PAGE_START_Y                         (0U)                                                                /*气体类型参数索引页面起始Y*/
#define ITEM_INDEX_PAGE_END_Y                             UI_MAINWINDOW_HEIGHT                              /*气体类型参数索引页面长度Y*/    
/*页面标题*/
#define ITEM_INDEX_PAGE_DEVICE_STATE_START_X   ITEM_INDEX_PAGE_START_X                                                                                                     /*气体类型参数索引页面设备状态起始X*/
#define ITEM_INDEX_PAGE_DEVICE_STATE_END_X     (ITEM_INDEX_PAGE_END_X*2/10U)                                                                                               /*气体类型参数索引页面设备状态长度X*/
  
#define ITEM_INDEX_PAGE_TITLE_START_X          (ITEM_INDEX_PAGE_DEVICE_STATE_START_X+ITEM_INDEX_PAGE_DEVICE_STATE_END_X)          /*气体类型参数索引页面页面标题起始X*/
#define ITEM_INDEX_PAGE_TITLE_END_X            (ITEM_INDEX_PAGE_END_X*6/10U)                                                                                               /*气体类型参数索引页面页面标题长度X*/
  
#define ITEM_INDEX_PAGE_CLOCK_START_X          (ITEM_INDEX_PAGE_TITLE_START_X+ITEM_INDEX_PAGE_TITLE_END_X)                                 /*气体类型参数索引页面页面时钟起始X*/
#define ITEM_INDEX_PAGE_CLOCK_END_X            (ITEM_INDEX_PAGE_END_X-PAGE_CLOCK_START_X)        /*气体类型参数索引页面时钟长度X*/ 
#define ITEM_INDEX_PAGE_TITLE_START_Y          ITEM_INDEX_PAGE_START_Y                        /*气体类型参数索引页面标题栏起始Y*/
#define ITEM_INDEX_PAGE_TITLE_END_Y            (ITEM_INDEX_PAGE_END_Y/10)                       /*气体类型参数索引页面标题栏高度Y*/
/*索引页面按钮,垂直布局*/
#define ITEM_INDEX_PAGE_BUTTON_START_Y        (ITEM_INDEX_PAGE_TITLE_START_Y+ITEM_INDEX_PAGE_TITLE_END_Y)      /*气体类型参数索引页面按钮显示起始Y*/
#define ITEM_INDEX_PAGE_BUTTON_X_GAP                (10U)                             /*气体类型参数索引页面按钮水平间隙*/
#define ITEM_INDEX_PAGE_BUTTON_Y_GAP                (10U)                             /*气体类型参数索引页面按钮垂直间隙*/
#define ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX      (5U)                                 /*气体类型参数索引页面按钮水平数量*/
#define ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX      (6U)                                 /*气体类型参数索引页面按钮放置行数以1开始*/
#define ITEM_INDEX_PAGE_BUTTON_ORIGIN_X       (ITEM_INDEX_PAGE_START_X+0U)      /*气体类型参数索引页面按钮显示起始X*/
/*通过计算每个页面最多按钮数目*/
#define ITEM_INDEX_PAGE_BUTTON_NUM_MAX                (ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX*ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX)
/*通过计算个按钮允许宽度X*/
#define ITEM_INDEX_PAGE_BUTTON_WIDTH       \
((ITEM_INDEX_PAGE_END_X-ITEM_INDEX_PAGE_BUTTON_ORIGIN_X-(ITEM_INDEX_PAGE_BUTTON_X_GAP*(ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX+1)))/ITEM_INDEX_PAGE_BUTTON_H_NUM_MAX)
/*通过计算个按钮允许高度Y*/
#define ITEM_INDEX_PAGE_BUTTON_END_Y       \
((ITEM_INDEX_PAGE_END_Y-ITEM_INDEX_PAGE_TITLE_END_Y-(ITEM_INDEX_PAGE_BUTTON_Y_GAP*(ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX+1)))/ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX)  /*索引页面按钮宽度Y*/
/*计算按钮X坐标起点,数目从0开始,则垂直数目未到情况下X起点不变,每列满则向X增大一个宽度*/  
#define ITEM_INDEX_PAGE_BUTTON_MULTI_RECT_H_X(X)   (ITEM_INDEX_PAGE_BUTTON_ORIGIN_X+ITEM_INDEX_PAGE_BUTTON_X_GAP*((X/ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX)+1)+ITEM_INDEX_PAGE_BUTTON_WIDTH*(X/ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX))
/*计算按钮Y坐标起点,数目从0开始则间隙X需+1,高度x不变*/
#define ITEM_INDEX_PAGE_BUTTON_MULTI_RECT_Y_X(X)   (ITEM_INDEX_PAGE_BUTTON_START_Y+ITEM_INDEX_PAGE_BUTTON_Y_GAP*((X%ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX)+1)+ITEM_INDEX_PAGE_BUTTON_END_Y*(X%ITEM_INDEX_PAGE_BUTTON_V_NUM_MAX))
/* Exported typedefines ------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macros------------------------------------------------------------*/
#define ARRAYNUM(arr_name)     (uint32_t)(sizeof(arr_name)/sizeof(*(arr_name)))
/* Exported functions prototypes ---------------------------------------------*/
void millsec_IRQ_handler(void);
uint32_t get_time_ms(void);
uint32_t get_time_sec(void);#ifdef __cplusplus //end extern c
}
#endif
#endif
/******************************** End of file *********************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aron566

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值