simplegui/GUI/src/SGUI_ScrollBar.c
Polarix abe8358fff 2020-12-24:
修改数据项(ItemsBase)相关数据结构定义为动态链表,允许运行时增减项目。
相关的列表、菜单等项目也进行了适应性修改。
为数据项(ItemsBase)、列表(List)和菜单(Menu)增加了一些数据操作接口。
更新了菜单、列表的演示程序。
修正了滚动条的部分代码,增加了一些接口函数。
2020-12-24 22:42:23 +08:00

137 lines
5.4 KiB
C

/*************************************************************************/
/** Copyright. **/
/** FileName: SGUI_ScrollBar.c **/
/** Author: XuYulin **/
/** Description: Create and display a scrollbar on screen. **/
/*************************************************************************/
//=======================================================================//
//= Include files. =//
//=======================================================================//
#include "SGUI_ScrollBar.h"
//=======================================================================//
//= Function define. =//
//=======================================================================//
/*************************************************************************/
/** Function Name: SGUI_ScrollBar_Initialize **/
/** Purpose: Initialize a scroll bar structure. **/
/** Params: **/
/** @ pstObj[in]: Scroll bar object pointer. **/
/** @ pcstInitParam[in]: Initialize parameter data. **/
/** Return: None. **/
/*************************************************************************/
void SGUI_ScrollBar_Initialize(SGUI_SCROLLBAR_STRUCT* pstObj, const SGUI_SCROLLBAR_PARAM* pcstInitParam)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if((NULL != pstObj) && (NULL != pcstInitParam))
{
SGUI_SystemIF_MemorySet(pstObj, 0x00, sizeof(SGUI_SCROLLBAR_STRUCT));
SGUI_SystemIF_MemoryCopy(&(pstObj->stParam), (void*)pcstInitParam, sizeof(SGUI_SCROLLBAR_PARAM));
}
}
/*************************************************************************/
/** Function Name: SGUI_ScrollBar_SetValue **/
/** Purpose: Initialize a scroll bar structure. **/
/** Params: **/
/** @ pstObj[in]: Scroll bar object pointer. **/
/** @ sNewValue[in]: New value will be set. **/
/** Return: None. **/
/*************************************************************************/
void SGUI_ScrollBar_SetValue(SGUI_SCROLLBAR_STRUCT* pstObj, SGUI_SIZE sNewValue)
{
if(NULL != pstObj)
{
if(sNewValue > pstObj->stParam.sMaxValue)
{
pstObj->stData.sValue = pstObj->stParam.sMaxValue;
}
else
{
pstObj->stData.sValue = sNewValue;
}
}
}
/*************************************************************************/
/** Function Name: SGUI_ScrollBar_RefreshScrollBar **/
/** Purpose: Display or update a scroll bar. **/
/** Resources: Scroll bar data structure. **/
/** Params: **/
/** @ pstObj[in]: Scroll bar data structure pointer. **/
/** Return: None. **/
/** Notice: None. **/
/*************************************************************************/
void SGUI_ScrollBar_Repaint(SGUI_SCR_DEV* pstDeviceIF, SGUI_SCROLLBAR_STRUCT* pstObj)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
SGUI_INT uiScrollBlockPos;
SGUI_SIZE uiScrollBlockSize;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
if(SGUI_SCROLLBAR_VERTICAL == pstObj->stParam.eDirection)
{
uiScrollBlockSize = pstObj->stParam.stLayout.iWidth-2;
}
else
{
uiScrollBlockSize = pstObj->stParam.stLayout.iHeight-2;
}
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if(((pstObj->stParam.stLayout.iHeight > 2) && (pstObj->stParam.stLayout.iWidth > 2)) && (pstObj->stParam.stLayout.iHeight != pstObj->stParam.stLayout.iWidth))
{
// Check new value must be less then max value.
if(pstObj->stData.sValue > pstObj->stParam.sMaxValue)
{
pstObj->stData.sValue = pstObj->stParam.sMaxValue;
}
// Draw scroll bar edge.
SGUI_Basic_DrawRectangle(pstDeviceIF, pstObj->stParam.stLayout.iX, pstObj->stParam.stLayout.iY,
pstObj->stParam.stLayout.iWidth, pstObj->stParam.stLayout.iHeight,
SGUI_COLOR_FRGCLR, SGUI_COLOR_BKGCLR);
if(SGUI_SCROLLBAR_VERTICAL == pstObj->stParam.eDirection)
{
// Value lower limit is 0, scroll blocks must be greater then 0.
if(pstObj->stParam.sMaxValue > 0)
{
uiScrollBlockPos = pstObj->stParam.stLayout.iY+1+((pstObj->stParam.stLayout.iHeight-uiScrollBlockSize-2)*pstObj->stData.sValue/pstObj->stParam.sMaxValue);
// Redraw process block
SGUI_Basic_DrawRectangle(pstDeviceIF, pstObj->stParam.stLayout.iX+1, uiScrollBlockPos,
uiScrollBlockSize, uiScrollBlockSize, SGUI_COLOR_FRGCLR, SGUI_COLOR_FRGCLR);
}
else
{
SGUI_Basic_DrawRectangle(pstDeviceIF, pstObj->stParam.stLayout.iX+1, pstObj->stParam.stLayout.iY+1,
uiScrollBlockSize, uiScrollBlockSize, SGUI_COLOR_FRGCLR, SGUI_COLOR_FRGCLR);
}
}
else // Horizontal
{
// Value lower limit is 0, scroll blocks must be greater then 0.
if(pstObj->stParam.sMaxValue > 0)
{
uiScrollBlockPos = pstObj->stParam.stLayout.iX+1+((pstObj->stParam.stLayout.iWidth-uiScrollBlockSize-2)*pstObj->stData.sValue/pstObj->stParam.sMaxValue);
// Redraw process block
SGUI_Basic_DrawRectangle(pstDeviceIF, uiScrollBlockPos, pstObj->stParam.stLayout.iY+1,
uiScrollBlockSize, uiScrollBlockSize, SGUI_COLOR_FRGCLR, SGUI_COLOR_FRGCLR);
}
else
{
SGUI_Basic_DrawRectangle(pstDeviceIF, pstObj->stParam.stLayout.iX+1, pstObj->stParam.stLayout.iY+1,
uiScrollBlockSize, uiScrollBlockSize, SGUI_COLOR_FRGCLR, SGUI_COLOR_FRGCLR);
}
}
}
}