📄 dropdown.c
字号:
* Exported routines: Create
*
**********************************************************************
*/
/*********************************************************************
*
* DROPDOWN_CreateEx
*/
DROPDOWN_Handle DROPDOWN_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id)
{
DROPDOWN_Handle hObj;
hObj = WM_CreateWindowAsChild(x0, y0, xsize, -1, hParent, WinFlags, _DROPDOWN_Callback, sizeof(DROPDOWN_Obj) - sizeof(WM_Obj));
if (hObj)
{
DROPDOWN_Obj* pObj;
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
/* Init sub-classes */
GUI_ARRAY_CREATE(&pObj->Handles);
/* init widget specific variables */
WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE);
pObj->Flags = ExFlags;
pObj->Props = DROPDOWN__DefaultProps;
pObj->ScrollbarWidth = 0;
INIT_ID(pObj);
pObj->ySizeEx = ysize;
DROPDOWN__AdjustHeight(hObj, pObj);
WM_UNLOCK();
}
return hObj;
}
/*********************************************************************
*
* Exported routines: Various methods
*
**********************************************************************
*/
/*********************************************************************
*
* DROPDOWN_Collapse
*/
void DROPDOWN_Collapse(DROPDOWN_Handle hObj)
{
DROPDOWN_Obj* pObj;
if (hObj)
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
if (pObj->hListWin)
{
WM_DeleteWindow(pObj->hListWin);
pObj->hListWin = 0;
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* DROPDOWN_Expand
*/
void DROPDOWN_Expand(DROPDOWN_Handle hObj)
{
int xSize, ySize, i, NumItems;
WM_HWIN hLst;
GUI_RECT r;
WM_HWIN hParent;
WM_Obj* pParent;
DROPDOWN_Obj* pObj;
if (hObj)
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
if (pObj->hListWin == 0)
{
hParent = WM_GetParent(hObj);
pParent = WM_H2P(hParent);
xSize = WM__GetWindowSizeX(&pObj->Widget.Win);
ySize = pObj->ySizeEx;
NumItems = _GetNumItems(pObj);
/* Get coordinates of window in client coordiantes of parent */
r = pObj->Widget.Win.Rect;
GUI_MoveRect(&r, -pParent->Rect.x0, -pParent->Rect.y0);
if (pObj->Flags & DROPDOWN_CF_UP)
{
r.y0 -= ySize;
}
else
{
r.y0 = r.y1;
}
hLst = LISTBOX_CreateAsChild(NULL, WM_GetParent(hObj), r.x0, r.y0, xSize, ySize, WM_CF_SHOW);
if (pObj->Flags & DROPDOWN_SF_AUTOSCROLLBAR)
{
LISTBOX_SetScrollbarWidth(hLst, pObj->ScrollbarWidth);
LISTBOX_SetAutoScrollV(hLst, 1);
}
for (i = 0; i < NumItems; i++)
{
LISTBOX_AddString(hLst, _GetpItem(pObj, i));
}
for (i = 0; i < GUI_COUNTOF(pObj->Props.aBackColor); i++)
{
LISTBOX_SetBkColor(hLst, i, pObj->Props.aBackColor[i]);
}
for (i = 0; i < GUI_COUNTOF(pObj->Props.aTextColor); i++)
{
LISTBOX_SetTextColor(hLst, i, pObj->Props.aTextColor[i]);
}
LISTBOX_SetItemSpacing(hLst, pObj->ItemSpacing);
LISTBOX_SetFont(hLst, pObj->Props.pFont);
WM_SetFocus(hLst);
pObj->hListWin = hLst;
LISTBOX_SetOwner(hLst, hObj);
LISTBOX_SetSel(hLst, pObj->Sel);
WM_NotifyParent(hObj, WM_NOTIFICATION_CLICKED);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* DROPDOWN_AddKey
*/
void DROPDOWN_AddKey(DROPDOWN_Handle hObj, int Key)
{
if (hObj)
{
WM_LOCK();
switch (Key)
{
case GUI_KEY_DOWN:
DROPDOWN_IncSel(hObj);
break;
case GUI_KEY_UP:
DROPDOWN_DecSel(hObj);
break;
default:
_SelectByKey(hObj, Key);
break;
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* DROPDOWN_AddString
*/
void DROPDOWN_AddString(DROPDOWN_Handle hObj, const char *s)
{
DROPDOWN_Obj* pObj;
if (hObj && s)
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
GUI_ARRAY_AddItem(&pObj->Handles, s, strlen(s) + 1);
DROPDOWN_Invalidate(hObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* DROPDOWN_GetNumItems
*/
int DROPDOWN_GetNumItems(DROPDOWN_Handle hObj)
{
DROPDOWN_Obj* pObj;
int r = 0;
if (hObj)
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
ASSERT_IS_VALID_PTR(pObj);
r = _GetNumItems(pObj);
WM_UNLOCK();
}
return r;
}
/*********************************************************************
*
* DROPDOWN_SetFont
*/
void DROPDOWN_SetFont(DROPDOWN_Handle hObj, const GUI_FONT GUI_UNI_PTR *pfont)
{
int OldHeight;
DROPDOWN_Obj* pObj;
if (hObj)
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
ASSERT_IS_VALID_PTR(pObj);
OldHeight = GUI_GetYDistOfFont(pObj->Props.pFont);
pObj->Props.pFont = pfont;
DROPDOWN__AdjustHeight(hObj, pObj);
DROPDOWN_Invalidate(hObj);
if (pObj->hListWin)
{
if (OldHeight != GUI_GetYDistOfFont(pObj->Props.pFont))
{
DROPDOWN_Collapse(hObj);
DROPDOWN_Expand(hObj);
}
LISTBOX_SetFont(pObj->hListWin, pfont);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* DROPDOWN_SetBkColor
*/
void DROPDOWN_SetBkColor(DROPDOWN_Handle hObj, unsigned int Index, GUI_COLOR color)
{
DROPDOWN_Obj* pObj;
if (hObj)
{
if (Index < GUI_COUNTOF(pObj->Props.aBackColor))
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
ASSERT_IS_VALID_PTR(pObj);
pObj->Props.aBackColor[Index] = color;
DROPDOWN_Invalidate(hObj);
if (pObj->hListWin)
{
LISTBOX_SetBkColor(pObj->hListWin, Index, color);
}
WM_UNLOCK();
}
}
}
/*********************************************************************
*
* DROPDOWN_SetTextColor
*/
void DROPDOWN_SetTextColor(DROPDOWN_Handle hObj, unsigned int Index, GUI_COLOR color)
{
DROPDOWN_Obj* pObj;
if (hObj)
{
if (Index < GUI_COUNTOF(pObj->Props.aBackColor))
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
ASSERT_IS_VALID_PTR(pObj);
pObj->Props.aTextColor[Index] = color;
DROPDOWN_Invalidate(hObj);
if (pObj->hListWin)
{
LISTBOX_SetTextColor(pObj->hListWin, Index, color);
}
WM_UNLOCK();
}
}
}
/*********************************************************************
*
* DROPDOWN_SetSel
*/
void DROPDOWN_SetSel(DROPDOWN_Handle hObj, int Sel)
{
int NumItems, MaxSel;
DROPDOWN_Obj* pObj;
if (hObj)
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
ASSERT_IS_VALID_PTR(pObj);
NumItems = _GetNumItems(pObj);
MaxSel = NumItems ? NumItems - 1 : 0;
if (Sel > MaxSel)
{
Sel = MaxSel;
}
if (Sel != pObj->Sel)
{
pObj->Sel = Sel;
DROPDOWN_Invalidate(hObj);
WM_NotifyParent(hObj, WM_NOTIFICATION_SEL_CHANGED);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* DROPDOWN_IncSel
*/
void DROPDOWN_IncSel(DROPDOWN_Handle hObj)
{
int Sel = DROPDOWN_GetSel(hObj);
DROPDOWN_SetSel(hObj, Sel + 1);
}
/*********************************************************************
*
* DROPDOWN_DecSel
*/
void DROPDOWN_DecSel(DROPDOWN_Handle hObj)
{
int Sel = DROPDOWN_GetSel(hObj);
if (Sel)
{
Sel--;
}
DROPDOWN_SetSel(hObj, Sel);
}
int DROPDOWN_GetSel(DROPDOWN_Handle hObj)
{
int r = 0;
DROPDOWN_Obj* pObj;
if (hObj)
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
ASSERT_IS_VALID_PTR(pObj);
r = pObj->Sel;
WM_UNLOCK();
}
return r;
}
/*********************************************************************
*
* DROPDOWN_SetScrollbarWidth
*/
void DROPDOWN_SetScrollbarWidth(DROPDOWN_Handle hObj, unsigned Width)
{
DROPDOWN_Obj* pObj;
if (hObj)
{
WM_LOCK();
pObj = DROPDOWN_H2P(hObj);
ASSERT_IS_VALID_PTR(pObj);
if (Width != (unsigned) pObj->ScrollbarWidth)
{
pObj->ScrollbarWidth = Width;
if (pObj->hListWin)
{
LISTBOX_SetScrollbarWidth(pObj->hListWin, Width);
}
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* DROPDOWN_SetDefaultFont
*/
void DROPDOWN_SetDefaultFont(const GUI_FONT *pFont)
{
DROPDOWN__DefaultProps.pFont = pFont;
}
/*********************************************************************
*
* DROPDOWN_GetDefaultFont
*/
const GUI_FONT GUI_UNI_PTR * DROPDOWN_GetDefaultFont(void)
{
return DROPDOWN__DefaultProps.pFont;
}
#else /* Avoid problems with empty object modules */
void DROPDOWN_C(void)
{
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -