📄 uimenuw.c
字号:
PUHPOINT touchPoint = (PUHPOINT)lParam;
INT16 SelectLine, gap;
if (touchPoint->x < WmenuObj->ItemLeft)
return TRUE;
if (touchPoint->y <= WmenuObj->TitleHeight)
return TRUE;
if (wParam == TM_STATE_DOWN)
{
SelectLine = (touchPoint->y - WmenuObj->TitleHeight) / WmenuObj->Itemheight;
SelectLine++;
if (SelectLine != WmenuObj->CurrItemDispLine)
{
gap = SelectLine - (INT16)(WmenuObj->CurrItemDispLine);
WmenuObj->CurrItemIndex = WmenuObj->CurrItemIndex + gap;
WmenuObj->CurrItemDispLine = SelectLine;
}
WinSendCommand(win, EV_MenuSelect);
}
WindowInvalidateWindow(win);
return TRUE;
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinCommand
Desc : 菜单类command消息处理,主要处理子窗口发来的command
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinCommand(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
INT16U cwID = WM_CMD_GETCWID(wParam);
INT16U cwEvent = WM_CMD_GETEVENT(wParam);
W_MENU *WmenuObj = (W_MENU *)win->Data;
UINT16 ScrollPercent;
//滚动条发生改变的事件
if (EV_ScrollChange == cwEvent)
{
ScrollPercent = WindowChildIDSendMessage(win, cwID, WM_GetPercent, 0, NULL);
WmenuObj->CurrItemIndex = (WmenuObj->MaxItemIndex - 1) * ScrollPercent / MaxScroll;
WmenuObj->CurrItemDispLine = 1;
WindowInvalidateWindow(win);
}
//重设滚动条
if ((EV_ScrollSet == cwEvent) || (EV_MenuSelect == cwEvent))
{
//WindowGetChildByID(win,WID_ScrollExample);
WindowChildIDSendMessage(win, WID_ScrollExample, WM_SetPercent, WmenuObj->CurrItemIndex*100 / (WmenuObj->MaxItemIndex - 1), NULL);
}
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinSetCurrLine
Desc : 菜单类设置当前行,从1开始到最大
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinSetCurrLine(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = (W_MENU *)win->Data;
INT16 SelectLine, gap;
SelectLine = (INT16)wParam;
if (SelectLine != WmenuObj->CurrItemDispLine)
{
gap = SelectLine - (INT16)(WmenuObj->CurrItemDispLine);
WmenuObj->CurrItemIndex = WmenuObj->CurrItemIndex + gap;
WmenuObj->CurrItemDispLine = SelectLine;
}
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinPaint
Desc : 菜单类画屏
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinPaint(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
UHRECT rect = {0, 0, WindowMaxX, WindowMaxY};
W_MENU *WmenuObj = (W_MENU *)win->Data;
MenuItem *pItem = NULL;
FileListItem *FileList = NULL;
UINT16 i, j, FirstLineIndx, EndLineIndx;
DispMode TranspLevel = WinGetTranStyle(win->style);
if (!(WIN_NEEDPAIT(win)))
return TRUE;
DrawBmpIdEx(win->x, win->y, WmenuObj->IconBackground, NULL, TranspLevel); //显示背景图
TxtBox(win, WmenuObj->TitleText, Font16X16, TopStyle); //显示标题
//当前行的背景
WmenuObj->IconItemSelect.Y = WmenuObj->TitleHeight + (WmenuObj->Itemheight * (WmenuObj->CurrItemDispLine - 1));
DrawPicture(WmenuObj->IconItemSelect);
FirstLineIndx = WmenuObj->CurrItemIndex - (WmenuObj->CurrItemDispLine - 1);
EndLineIndx = FirstLineIndx + WmenuObj->WinFullLine;
if (EndLineIndx > WmenuObj->MaxItemIndex)
EndLineIndx = WmenuObj->MaxItemIndex;
j = 0;
for (i = FirstLineIndx;i < EndLineIndx;i++)
{
if (win->style&WES_MenuFileList) //资源管理器,文件列表型
{
FileList = (FileListItem*)ListGetItem(WmenuObj->MenuList, i);
DrawBmpIdEx(WmenuObj->ItemLeft, (UINT16)(5 + (WmenuObj->Itemheight*j + WmenuObj->TitleHeight)), (UINT16)FileList->ICON, NULL, DSPM_Transp);
if (win->style&WES_Unicode) //unicode
DrawStringEx((UINT16)(WmenuObj->ItemLeft + 20) , (UINT16)(5 + (WmenuObj->Itemheight*j + WmenuObj->TitleHeight)) , 200 , (FileList->pText) , Font16X16, NULL , 0);
else
DrawStringGbkEx((UINT16)(WmenuObj->ItemLeft + 20) , (UINT16)(5 + (WmenuObj->Itemheight*j + WmenuObj->TitleHeight)) , 200 , FileList->pText , Font16X16, NULL , 0);
}
else
{ //普通菜单
pItem = (MenuItem*)ListGetItem(WmenuObj->MenuList, i);
DrawBmpIdEx(WmenuObj->ItemLeft, (UINT16)(5 + (WmenuObj->Itemheight*j + WmenuObj->TitleHeight)), pItem->ICON, NULL, DSPM_Transp);
DrawStringIdEx((UINT16)(WmenuObj->ItemLeft + 20) , (UINT16)(5 + (WmenuObj->Itemheight*j + WmenuObj->TitleHeight)) , 200 , pItem->Text , Font16X16, NULL , 0);
}
j++;
}
WIN_CLEARPAIT(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinCreate
Desc : 菜单类窗口创建
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinCreate(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = NULL;
// UILISTFTABLE Fun;
WmenuObj = MallocClass(W_MENU);
if (NULL == WmenuObj)
return FALSE;
WmenuObj->style = win->style | WS_TOUCHUP;
WmenuObj->Itemheight = 24; /*条目高度*/
WmenuObj->ItemLeft = 30; /*条目左缩进*/
WmenuObj->TitleHeight = 30; /*标题高度*/
WmenuObj->TitleText = win->CaptionID; /*标题文本*/
WmenuObj->IconBackground = win->BmpID; /*背景图片*/
WmenuObj->IconItemSelect.BmpID = win->BmpID + 1; /*选中条图片*/
WmenuObj->IconItemSelect.X = win->x + 8;
WmenuObj->IconItemSelect.Y = WmenuObj->Itemheight;
WmenuObj->WinFullLine = (WindowMaxY - WmenuObj->TitleHeight) / WmenuObj->Itemheight; /*一屏可显示的条目数*/
WmenuObj->CurrItem = NULL; /*当前条目指针*/
WmenuObj->CurrItemIndex = 0; /*当前条目ID*/
WmenuObj->MaxItemIndex = 0; /*添加的总条目数*/
WmenuObj->CurrItemDispLine = 1; /*当前条目所在行*/
WmenuObj->MenuList = ListCreate(LS_NONE, NULL); /*创建动态链表*/
if (NULL == WmenuObj->MenuList)
return FALSE;
win->Data = WmenuObj;
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinDestroy
Desc : 菜单类窗口关闭
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinDestroy(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = (W_MENU *)win->Data;
ListDestroy(WmenuObj->MenuList);
FreeClass(WmenuObj);
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinSetPic
Desc : 菜单类窗口设置图片
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinSetPic(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = (W_MENU *)win->Data;
UINT16*pID = (UINT16*)lParam;
IconType Type = wParam;
switch (Type)
{
case Icon_Background:
WmenuObj->IconBackground = *pID;
break;
case Icon_MenuSel:
WmenuObj->IconItemSelect.BmpID = *pID;
break;
}
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : ListWinCreate
Desc : 菜单类窗口设置标题文本
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinSetTxt(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = (W_MENU *)win->Data;
WmenuObj->TitleText = (UINT16)wParam;
return TRUE;
}
/*----------------------------------------------------------------------
Name : ListWinCreate
Desc : 菜单类
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
int MenuItemCmp(MenuItem* cs, MenuItem* ct)
{
if ((cs->Text == ct->Text) && (cs->ICON == ct->ICON))
return 0;
return -1;;
}
/*菜单类消息描述表*/
BEGIN_CHILDMESSAGE_MAP(WinMenuProcMap , CW_TYPE_MENU)
ON_MESSAGE(WM_PAINT , MenuWinPaint)
ON_MESSAGE(WM_TOUCH , MenuWinTouch)
ON_MESSAGE(WM_COMMAND, MenuWinCommand)
ON_MESSAGE(WM_KEY, MenuWinKey)
ON_MESSAGE(WM_DESTROY , MenuWinDestroy)
ON_MESSAGE(WM_CREATE, MenuWinCreate)
ON_MESSAGE(WM_MenuAddItem, MenuWinAddItem) /*增加菜单项*/
ON_MESSAGE(WM_MenuDeleteItem, MenuWinDeleteItem) //删除一行菜单
ON_MESSAGE(WM_MenuChangeItem, MenuWinChangeItem) //更改一条菜单的内容
ON_MESSAGE(WM_MenuSetCurrLine, MenuWinSetCurrLine) //设置当前光标行,从第一行开始
ON_MESSAGE(WM_SetPic, MenuWinSetPic)
ON_MESSAGE(WM_SetTxt, MenuWinSetTxt)
ON_MESSAGE(WM_MenuGetMaxItem, MenuWinGetMaxItem)
ON_MESSAGE(WM_MenuDeleteItemAll, MenuWinDeleteAll)
END_MESSAGE_MAP()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -