📄 multipage.c
字号:
(*WM_H2P(hBelow)->cb) (pMsg);
}
}
else
{
WM_BringToTop(hObj);
}
Notification = WM_NOTIFICATION_CLICKED;
}
else
{
Notification = WM_NOTIFICATION_RELEASED;
}
}
else
{
Notification = WM_NOTIFICATION_MOVED_OUT;
}
WM_NotifyParent(hObj, Notification);
}
/*********************************************************************
*
* _Callback
*/
static void _Callback(WM_MESSAGE *pMsg)
{
MULTIPAGE_Handle hObj = pMsg->hWin;
MULTIPAGE_Obj* pObj;
int Handled;
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
Handled = WIDGET_HandleActive(hObj, pMsg);
switch (pMsg->MsgId)
{
case WM_PAINT:
_Paint(pObj);
break;
case WM_TOUCH:
_OnTouch(hObj, pObj, pMsg);
break;
case WM_NOTIFY_PARENT:
if (pMsg->Data.v == WM_NOTIFICATION_VALUE_CHANGED)
{
if (WM_GetId(pMsg->hWinSrc) == GUI_ID_HSCROLL)
{
pObj->ScrollState = SCROLLBAR_GetValue(pMsg->hWinSrc);
WM_InvalidateWindow(hObj);
}
}
break;
case WM_GET_CLIENT_WINDOW:
pMsg->Data.v = (int) pObj->hClient;
break;
case WM_GET_INSIDE_RECT:
_CalcClientRect(pObj, (GUI_RECT *) (pMsg->Data.p));
break;
case WM_WIDGET_SET_EFFECT:
WIDGET_SetEffect(WM_GetScrollbarH(hObj), (WIDGET_EFFECT const *) pMsg->Data.p);
case WM_SIZE:
_UpdatePositions(hObj, pObj);
break;
case WM_DELETE:
GUI_ARRAY_Delete(&pObj->Handles);
/* No break here ... WM_DefaultProc needs to be called */
default:
/* Let widget handle the standard messages */
if (Handled)
{
WM_DefaultProc(pMsg);
}
}
WM_UNLOCK();
}
/*********************************************************************
*
* _ClientCallback
*/
static void _ClientCallback(WM_MESSAGE *pMsg)
{
WM_HWIN hObj = pMsg->hWin;
WM_HWIN hParent = WM_GetParent(hObj);
MULTIPAGE_Obj* pParent;
WM_LOCK();
pParent = MULTIPAGE_H2P(hParent);
switch (pMsg->MsgId)
{
case WM_PAINT:
LCD_SetBkColor(pParent->aBkColor[1]);
GUI_Clear();
break;
case WM_TOUCH:
WM_SetFocus(hParent);
WM_BringToTop(hParent);
break;
case WM_GET_CLIENT_WINDOW:
pMsg->Data.v = (int) hObj;
break;
case WM_GET_INSIDE_RECT:
WM_DefaultProc(pMsg);
}
WM_UNLOCK();
}
/*********************************************************************
*
* Exported routines: Create
*
**********************************************************************
*/
/* Note: the parameters to a create function may vary.
Some widgets may have multiple create functions */
/*********************************************************************
*
* MULTIPAGE_CreateEx
*/
MULTIPAGE_Handle MULTIPAGE_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id)
{
MULTIPAGE_Handle hObj;
GUI_USE_PARA(ExFlags);
/* Create the window */
hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags | WM_CF_HASTRANS, &_Callback, sizeof(MULTIPAGE_Obj) - sizeof(WM_Obj));
if (hObj)
{
MULTIPAGE_Obj* pObj;
GUI_RECT rClient;
int Flags;
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
/* Init sub-classes */
GUI_ARRAY_CREATE(&pObj->Handles);
/* init widget specific variables */
WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE);
/* init member variables */
MULTIPAGE_INIT_ID(pObj);
pObj->aBkColor[0] = MULTIPAGE__DefaultBkColor[0];
pObj->aBkColor[1] = MULTIPAGE__DefaultBkColor[1];
pObj->aTextColor[0] = MULTIPAGE__DefaultTextColor[0];
pObj->aTextColor[1] = MULTIPAGE__DefaultTextColor[1];
pObj->Font = MULTIPAGE__pDefaultFont;
pObj->Align = MULTIPAGE__DefaultAlign;
pObj->Selection = 0xffff;
pObj->ScrollState = 0;
pObj->Widget.State = 0;
_CalcClientRect(pObj, &rClient);
Flags = WM_CF_SHOW | WM_CF_ANCHOR_LEFT | WM_CF_ANCHOR_RIGHT | WM_CF_ANCHOR_TOP | WM_CF_ANCHOR_BOTTOM;
pObj->hClient = WM_CreateWindowAsChild(rClient.x0, rClient.y0, rClient.x1 - rClient.x0 + 1, rClient.y1 - rClient.y0 + 1, hObj, Flags, &_ClientCallback, 0);
_UpdatePositions(hObj, pObj);
WM_UNLOCK();
}
else
{
GUI_DEBUG_ERROROUT_IF(hObj == 0, "MULTIPAGE_Create failed")
}
return hObj;
}
/*********************************************************************
*
* Exported routines: Page management
*
**********************************************************************
*/
/*********************************************************************
*
* MULTIPAGE_AddPage
*/
void MULTIPAGE_AddPage(MULTIPAGE_Handle hObj, WM_HWIN hWin, const char *pText)
{
MULTIPAGE_Obj* pObj;
GUI_USE_PARA(hWin);
if (hObj)
{
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (!hWin)
{
/* If we get no handle we must find it. To do this, we search */
/* all children until we found one that has not yet become a page. */
MULTIPAGE_PAGE* pPage;
WM_HWIN hChild;
WM_Obj* pChild;
WM_Obj* pClient = WM_H2P(pObj->hClient);
int i;
for (hChild = pClient->hFirstChild; hChild && !hWin; hChild = pChild->hNext)
{
pChild = WM_H2P(hChild);
hWin = hChild;
for (i = 0; i < pObj->Handles.NumItems; i++)
{
pPage = (MULTIPAGE_PAGE *) GUI_ARRAY_GetpItem(&pObj->Handles, i);
if (pPage->hWin == hChild)
{
hWin = 0;
break;
}
}
}
}
else
{
/* If we get a handle we must ensure that it was attached to the multipage */
WM_AttachWindowAt(hWin, pObj->hClient, 0, 0);
}
if (hWin)
{
MULTIPAGE_PAGE Page;
char NullByte = 0;
if (!pText)
{
pText = &NullByte;
}
Page.hWin = hWin;
Page.Status = MULTIPAGE_STATE_ENABLED;
if (GUI_ARRAY_AddItem(&pObj->Handles, &Page, sizeof(MULTIPAGE_PAGE) + strlen(pText)) == 0)
{
MULTIPAGE_PAGE* pPage;
pPage = (MULTIPAGE_PAGE *) GUI_ARRAY_GetpItem(&pObj->Handles, pObj->Handles.NumItems - 1);
memcpy(&pPage->acText, pText, strlen(pText) + 1);
}
MULTIPAGE_SelectPage(hObj, pObj->Handles.NumItems - 1);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIPAGE_DeletePage
*/
void MULTIPAGE_DeletePage(MULTIPAGE_Handle hObj, unsigned Index, int Delete)
{
if (hObj)
{
MULTIPAGE_Obj* pObj;
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
if ((int) Index < pObj->Handles.NumItems)
{
WM_HWIN hWin;
MULTIPAGE_PAGE* pPage;
pPage = (MULTIPAGE_PAGE *) GUI_ARRAY_GetpItem(&pObj->Handles, Index);
hWin = pPage->hWin;
/* Remove the page from the multipage object */
if (Index == pObj->Selection)
{
if (Index == ((unsigned) pObj->Handles.NumItems - 1))
{
_ShowPage(pObj, Index - 1);
pObj->Selection--;
}
else
{
_ShowPage(pObj, Index + 1);
}
}
else
{
if (Index < pObj->Selection)
{
pObj->Selection--;
}
}
GUI_ARRAY_DeleteItem(&pObj->Handles, Index);
_UpdatePositions(hObj, pObj);
/* Delete the window of the page */
if (Delete)
{
WM_DeleteWindow(hWin);
}
}
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIPAGE_SelectPage
*/
void MULTIPAGE_SelectPage(MULTIPAGE_Handle hObj, unsigned Index)
{
if (hObj)
{
MULTIPAGE_Obj* pObj;
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
if ((int) Index < pObj->Handles.NumItems)
{
if (Index != pObj->Selection && _GetEnable(pObj, Index))
{
_ShowPage(pObj, Index);
pObj->Selection = Index;
_UpdatePositions(hObj, pObj);
}
}
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIPAGE_DisablePage
*/
void MULTIPAGE_DisablePage(MULTIPAGE_Handle hObj, unsigned Index)
{
if (hObj)
{
MULTIPAGE_Obj* pObj;
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
_SetEnable(pObj, Index, 0);
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIPAGE_EnablePage
*/
void MULTIPAGE_EnablePage(MULTIPAGE_Handle hObj, unsigned Index)
{
if (hObj)
{
MULTIPAGE_Obj* pObj;
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
_SetEnable(pObj, Index, 1);
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* Exported routines: Various methods
*
**********************************************************************
*/
/*********************************************************************
*
* MULTIPAGE_SetText
*/
void MULTIPAGE_SetText(MULTIPAGE_Handle hObj, const char *pText, unsigned Index)
{
MULTIPAGE_Obj* pObj;
if (hObj && pText)
{
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
if ((int) Index < pObj->Handles.NumItems)
{
MULTIPAGE_PAGE* pPage;
MULTIPAGE_PAGE Page;
pPage = (MULTIPAGE_PAGE *) GUI_ARRAY_GetpItem(&pObj->Handles, Index);
Page.hWin = pPage->hWin;
Page.Status = pPage->Status;
if (GUI_ARRAY_SetItem(&pObj->Handles, Index, &Page, sizeof(MULTIPAGE_PAGE) + strlen(pText)))
{
pPage = (MULTIPAGE_PAGE *) GUI_ARRAY_GetpItem(&pObj->Handles, Index);
memcpy(&pPage->acText, pText, strlen(pText) + 1);
_UpdatePositions(hObj, pObj);
}
}
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIPAGE_SetBkColor
*/
void MULTIPAGE_SetBkColor(MULTIPAGE_Handle hObj, GUI_COLOR Color, unsigned Index)
{
MULTIPAGE_Obj* pObj;
if (hObj && ((int) Index < MULTIPAGE_NUMCOLORS))
{
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
pObj->aBkColor[Index] = Color;
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIPAGE_SetTextColor
*/
void MULTIPAGE_SetTextColor(MULTIPAGE_Handle hObj, GUI_COLOR Color, unsigned Index)
{
MULTIPAGE_Obj* pObj;
if (hObj && ((int) Index < MULTIPAGE_NUMCOLORS))
{
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
pObj->aTextColor[Index] = Color;
WM_InvalidateWindow(hObj);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIPAGE_SetFont
*/
void MULTIPAGE_SetFont(MULTIPAGE_Handle hObj, const GUI_FONT GUI_UNI_PTR *pFont)
{
MULTIPAGE_Obj* pObj;
if (hObj && pFont)
{
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
pObj->Font = pFont;
_UpdatePositions(hObj, pObj);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIPAGE_SetAlign
*/
void MULTIPAGE_SetAlign(MULTIPAGE_Handle hObj, unsigned Align)
{
MULTIPAGE_Obj* pObj;
GUI_RECT rClient;
if (hObj)
{
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
pObj->Align = Align;
_CalcClientRect(pObj, &rClient);
WM_MoveTo(pObj->hClient, rClient.x0 + pObj->Widget.Win.Rect.x0, rClient.y0 + pObj->Widget.Win.Rect.y0);
_UpdatePositions(hObj, pObj);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIPAGE_GetSelection
*/
int MULTIPAGE_GetSelection(MULTIPAGE_Handle hObj)
{
int r = 0;
if (hObj)
{
MULTIPAGE_Obj* pObj;
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
r = pObj->Selection;
}
WM_UNLOCK();
}
return r;
}
/*********************************************************************
*
* MULTIPAGE_GetWindow
*/
WM_HWIN MULTIPAGE_GetWindow(MULTIPAGE_Handle hObj, unsigned Index)
{
WM_HWIN r = 0;
if (hObj)
{
MULTIPAGE_Obj* pObj;
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
if ((int) Index < pObj->Handles.NumItems)
{
MULTIPAGE_PAGE* pPage;
pPage = (MULTIPAGE_PAGE *) GUI_ARRAY_GetpItem(&pObj->Handles, Index);
r = pPage->hWin;
}
}
WM_UNLOCK();
}
return r;
}
/*********************************************************************
*
* MULTIPAGE_IsPageEnabled
*/
int MULTIPAGE_IsPageEnabled(MULTIPAGE_Handle hObj, unsigned Index)
{
int r = 0;
if (hObj)
{
MULTIPAGE_Obj* pObj;
WM_LOCK();
pObj = MULTIPAGE_H2P(hObj);
MULTIPAGE_ASSERT_IS_VALID_PTR(pObj);
if (pObj)
{
r = _GetEnable(pObj, Index);
}
WM_UNLOCK();
}
return r;
}
#else /* avoid empty object files */
void MULTIPAGE_C(void);
void MULTIPAGE_C(void)
{
}
#endif /* #if GUI_WINSUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -