⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plxdyncmenu.c

📁 mtk wap和mms代码。。适应mtk 25。26平台
💻 C
📖 第 1 页 / 共 4 页
字号:
    
	pixtel_UI_set_text_color(SavedColor);
}


/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function	GetItemFromLine
<> Purpose	given a line number, get the item in the line
<> Params	
<> Return	
<> Remarks	
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
static PDMENUITEM GetItemFromLine(PDMENUOBJ pObj, int* pCount, int line){
	PDMENUITEM pItem, pRet;
	int i;

	pItem = pObj->pItemsMemBlock;
	for (i = 0; i < (int)(pObj->wUsedItems); ++ i) {
		if (*pCount == line) {
			return(pItem);
		}
		++ *pCount;
		if ((pItem->wFlags & MF_POPUP) && (pItem->wFlags & ST_EXPAND)) {
			pRet = GetItemFromLine((PDMENUOBJ)pItem->hIDorGroup, pCount, line);
			if (pRet != NULL) {
				return pRet;
			}
		}
		++ pItem;
	}
	return NULL;
}

/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function	GetLineFromItem
<> Purpose	get the item line number
<> Params	
<> Return	
<> Remarks	
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
static int GetLineFromItem(int* line, PDMENUOBJ pObj, PDMENUITEM pItem){
	PDMENUITEM pMove;
	int iRet, i = 0;

	pMove = pObj->pItemsMemBlock;

	while (1) {
		if (pMove == pItem) {
			return 0;
		}
		++ *line;
		if ((pMove->wFlags & MF_POPUP) && (pMove->wFlags & ST_EXPAND)) {
			iRet = GetLineFromItem(line, (PDMENUOBJ)pMove->hIDorGroup, pItem);
			if (0 == iRet) {
				return 0;
			}
		}
		++ pMove;
		++ i;
		if (i >= pObj->wUsedItems)
			return -1;
	}
	return -1;
}

/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function	ProcessScrollInfo
<> Purpose	set the scrollbar
<> Params	
<> Return	
<> Remarks	
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
static void ProcessScrollInfo(void){
	pixtel_UI_set_vertical_scrollbar_range(&menuDisp.vScroll, menuDisp.itemCount);
	pixtel_UI_set_vertical_scrollbar_value(&menuDisp.vScroll, menuDisp.firstLine );
	pixtel_UI_set_vertical_scrollbar_scale(&menuDisp.vScroll, menuDisp.linesInScreen);
	pixtel_UI_show_vertical_scrollbar(&menuDisp.vScroll);
	pixtel_UI_BLT_double_buffer(menuDisp.rcVScroll.left, menuDisp.rcVScroll.top,
		menuDisp.rcVScroll.right, menuDisp.rcVScroll.bottom);
}


/****************************************************************************
* Function	OnDMenuNotify
* Purpose	
* Params	
* Return	
* Remarks	
\****************************************************************************/
static void OnDMenuNotify( unsigned long id, unsigned long event)
{
	if (NULL != menuDisp.NotifyFunc) 
	{
		menuDisp.pMenu->firstLine = menuDisp.firstLine;
		menuDisp.pMenu->focuseItem = menuDisp.focuseItem;
		MMI_menu_shortcut_number = menuDisp.focuseItem + 1;
		reset_menu_shortcut_handler();
		MMI_disable_title_shortcut_display = bIsShortcutDisabled;
		menuDisp.NotifyFunc((HDMENU)menuDisp.pMenu, id,event);
	}
}

/****************************************************************************
* Function	
* Purpose	
* Params	
* Return	
* Remarks	
\****************************************************************************/
static void OnDMenuCofirm(void){
	PDMENUITEM pSelItem;
	int count = 0;

	pSelItem = GetItemFromLine(menuDisp.pMenu, &count, menuDisp.focuseItem);
	if (pSelItem->wFlags & MF_DISABLED) 
	{
		return;
	}

	if(pSelItem ->wFlags & MF_POPUP)
	{
		bVirtualKeyPressed = TRUE;
		virtualKey = KEY_ENTER;
		DMenuProcessKeyEvent();
		bVirtualKeyPressed = FALSE;
	}
	else
	{	
		OnDMenuNotify(pSelItem->hIDorGroup, ENT_OK);
	}
}

/****************************************************************************
* Function	
* Purpose	
* Params	
* Return	
* Remarks	
\****************************************************************************/
static void OnDMenuBack(void)
{	
	int 		count = 0;
	PDMENUITEM 	pSelItem;

	pSelItem = GetItemFromLine(menuDisp.pMenu, &count, menuDisp.focuseItem);
	if(pSelItem)
		OnDMenuNotify(0, ENT_BACK);
}


/****************************************************************************
* Function	GetCountToDisplay
* Purpose	get the items count to display
* Params	
* Return	
* Remarks	
\****************************************************************************/
static unsigned long GetCountToDisplay(PDMENUOBJ pObj)
{
    PDMENUITEM pItem;
    int i;
    unsigned long lRet = 0;

    if (NULL == pObj) 
    {
        return 0;
    }
    lRet += pObj->wUsedItems;
    for (pItem = pObj->pItemsMemBlock, i = 0; i < pObj->wUsedItems; ++ i) 
    {
        if (pItem->wFlags & ST_EXPAND) 
        {
            lRet +=GetCountToDisplay((PDMENUOBJ)pItem->hIDorGroup);
        }
        ++ pItem;
    }
    return lRet;
}

/****************************************************************************
* Function	ResetMenuState
* Purpose	reset the menu's state
* Params	
* Return	
* Remarks	
\****************************************************************************/
static void ResetMenuState(PDMENUOBJ pObj)
{
    PDMENUITEM pItem;
    int i;

    if (NULL == pObj) 
    {
        return;
    }
    for (pItem = pObj->pItemsMemBlock, i = 0; i < pObj->wUsedItems; ++ i) 
    {
        if (pItem->wFlags & MF_POPUP) 
        {
            pItem->wFlags &= ~ST_EXPAND;
            ResetMenuState((PDMENUOBJ)pItem->hIDorGroup);
        }
        ++ pItem;
    }
}

#ifdef __MMI_TOUCH_SCREEN__
/****************************************************************************
* Function	OnTouchPenDown
* Purpose	
* Params	
* Return	
* Remarks	
\****************************************************************************/
static void OnTouchPenDown(mmi_pen_point_struct pos)
{
	mmi_wgui_general_pen_down_hdlr(pos);
	if (TRUE == ProcessPenOnScrollbar(pos, MMI_PEN_EVENT_DOWN)) 
	{
		return;
	}

	if (TRUE == ProcessPenOnSoftkey(pos, MMI_PEN_EVENT_DOWN)) 
	{
		return;
	}
	UsePenSelectItem(pos);
}

/****************************************************************************
* Function	OnTouchPenMove
* Purpose	
* Params	
* Return	
* Remarks	
\****************************************************************************/
static void OnTouchPenMove(mmi_pen_point_struct pos)
{
	mmi_wgui_general_pen_move_hdlr(pos);
	
	if (TRUE == ProcessPenOnScrollbar(pos, MMI_PEN_EVENT_MOVE)) 
	{
		return;
	}
	if (TRUE == ProcessPenOnSoftkey(pos, MMI_PEN_EVENT_MOVE)) 
	{
		return;
	}
	if (pos.y < menuDisp.rcList.top) 
	{
		bVirtualKeyPressed = TRUE;
		virtualKey = KEY_UP_ARROW;
		DMenuProcessKeyEvent();
		bVirtualKeyPressed = FALSE;
	}
	else if (pos.y > menuDisp.rcList.bottom) 
	{
		bVirtualKeyPressed = TRUE;
		virtualKey = KEY_DOWN_ARROW;
		DMenuProcessKeyEvent();
		bVirtualKeyPressed = FALSE;
	}
	else
	{
		UsePenSelectItem(pos);
	}
}

/****************************************************************************
* Function	OnTouchePenUp
* Purpose	
* Params	
* Return	
* Remarks	
\****************************************************************************/
static void OnTouchPenUp(mmi_pen_point_struct pos)
{
	DM_RC rcTmp;
	int i, j;
	int line;

	mmi_wgui_general_pen_down_hdlr(pos);
	if (TRUE == ProcessPenOnScrollbar(pos, MMI_PEN_EVENT_UP)) 
	{
		return;
	}
	if (TRUE == ProcessPenOnSoftkey(pos, MMI_PEN_EVENT_UP)) 
	{
		return;
	}
	
	rcTmp.left = menuDisp.rcList.left;
	rcTmp.top = menuDisp.rcList.top;
	rcTmp.right = menuDisp.rcSubIcon.right;
	rcTmp.bottom = menuDisp.rcList.bottom;
	
	if (!PenPointInRect(&rcTmp, pos)) 
	{
		return;	//not mind to dmenu
	}
	i = (pos.y - menuDisp.rcList.top) / menuDisp.itemHeight;
	j = (pos.y - menuDisp.rcList.top) % menuDisp.itemHeight;
	
	line = menuDisp.firstLine + (((j == 0) && (i > 0)) ? (i - 1) : i);
	//	line = menuDisp.firstLine + (pos.y - menuDisp.rcList.top) / menuDisp.itemHeight;
	
	if (line + 1 > menuDisp.itemCount) 
	{
		return;	//no item where the pen down
	}
	bVirtualKeyPressed = TRUE;
	virtualKey = KEY_ENTER;
	DMenuProcessKeyEvent();
	bVirtualKeyPressed = FALSE;
}

/****************************************************************************
* Function	OnTouchPenRepeat
* Purpose	
* Params	
* Return	
* Remarks	
\****************************************************************************/
static void OnTouchPenRepeat(mmi_pen_point_struct pos)
{
	mmi_wgui_general_pen_repeat_hdlr(pos);
	if (TRUE == ProcessPenOnScrollbar(pos, MMI_PEN_EVENT_REPEAT)) 
	{
		return;
	}
	if (TRUE == ProcessPenOnSoftkey(pos, MMI_PEN_EVENT_REPEAT)) 
	{
		return;
	}

}


/****************************************************************************
* Function	ProcessPenOnScrollbar
* Purpose	process pen event of scrollbar
* Params	
* Return	true: the scrollbar event has been processed
* Remarks	
\****************************************************************************/
static BOOL ProcessPenOnScrollbar(mmi_pen_point_struct pos, mmi_pen_event_type_enum pen_event)
{
	mmi_gui_pen_event_param_struct scrollbar_param;
	mmi_gui_scrollbar_pen_enum scrollbar_event;
	
	pixtel_UI_vertical_scrollbar_translate_pen_event(&menuDisp.vScroll, pen_event, 
		pos.x, pos.y, &scrollbar_event, &scrollbar_param);
	
	if (scrollbar_event == GUI_SCROLLBAR_PEN_JUMP_TO_I) 
	{
		menuDisp.firstLine = scrollbar_param._u.i;
		if (menuDisp.focuseItem < menuDisp.firstLine) 
		{
			menuDisp.focuseItem = menuDisp.firstLine;
		}
		if (menuDisp.firstLine + menuDisp.linesInScreen - 1 <= menuDisp.focuseItem) 
		{
			if (menuDisp.firstLine + menuDisp.linesInScreen >= menuDisp.itemCount) 
			{
				menuDisp.focuseItem = menuDisp.itemCount - 1;
			}
			else
			{
				menuDisp.focuseItem = menuDisp.firstLine + menuDisp.linesInScreen - 1;
			}
		}
		ProcessFocusItem();
		DrawMenuList(&menuDisp.rcList);
		return TRUE;
	}
	return FALSE;
}

/****************************************************************************
* Function	PenPointInRect
* Purpose	is the pen point in the rect
* Params	
* Return	
* Remarks	
\****************************************************************************/
static BOOL PenPointInRect(PDM_RC pRc, mmi_pen_point_struct pos)
{
	mmi_pen_polygon_area_struct rectDMenu;
	mmi_pen_point_struct angles[4];
	
	angles[0].x = (S16)pRc->left;
	angles[0].y = (S16)pRc->top;
	
	angles[1].x = (S16)pRc->right;
	angles[1].y = (S16)pRc->top;
	
	angles[2].x = (S16)pRc->right;
	angles[2].y = (S16)pRc->bottom;
	
	angles[3].x = (S16)pRc->left;
	angles[3].y = (S16)pRc->bottom;
	
	rectDMenu.num = 4;
	rectDMenu.points = angles;

	return mmi_pen_check_inside_polygon(&rectDMenu, pos);
}

/****************************************************************************
* Function	UsePenSelectItem
* Purpose	through the pos, select menu item
* Params	
* Return	
* Remarks	
\****************************************************************************/
static BOOL UsePenSelectItem(mmi_pen_point_struct pos)
{
	DM_RC rcTmp;
	int line;
	int i, j;

	rcTmp.left = menuDisp.rcList.left;
	rcTmp.top = menuDisp.rcList.top;
	rcTmp.right = menuDisp.rcSubIcon.right;
	rcTmp.bottom = menuDisp.rcList.bottom;
	
	if (!PenPointInRect(&rcTmp, pos)) 
	{
		return FALSE;	//not mind to dmenu
	}
	
/*	rcTmp.left= menuDisp.rcList.left;
	rcTmp.top =menuDisp.rcTxt.top + (menuDisp.focuseItem - menuDisp.firstLine) * menuDisp.itemHeight;
	rcTmp.right = menuDisp.rcList.right;
	rcTmp.bottom = rcTmp.top + menuDisp.itemHeight;
	
	if (PenPointInRect(&rcTmp, pos)) 
	{
		return FALSE;	//pen down in focused item, no change
	}
*/	
	i = (pos.y - menuDisp.rcList.top) / menuDisp.itemHeight;
	j = (pos.y - menuDisp.rcList.top) % menuDisp.itemHeight;

	line = menuDisp.firstLine + (((j == 0) && (i > 0)) ? (i - 1) : i);
//	line = menuDisp.firstLine + (pos.y - menuDisp.rcList.top) / menuDisp.itemHeight;
	
	if (line + 1 > menuDisp.itemCount) 
	{
		return FALSE;	//no item where the pen down
	}
	else
	{
		menuDisp.focuseItem = line;
		if (menuDisp.focuseItem < menuDisp.itemCount - 1 && menuDisp.firstLine + menuDisp.linesInScreen - 1 <= menuDisp.focuseItem) 
		{
			++ menuDisp.firstLine;
		}
		else if (menuDisp.firstLine > 0 && line == menuDisp.firstLine) 
		{
			-- menuDisp.firstLine;
		}
	}
	ProcessFocusItem();
	ProcessScrollInfo();
	DrawMenuList(&menuDisp.rcList);
	return TRUE;
}

/****************************************************************************
* Function	ProcessPenOnSoftkey
* Purpose	
* Params	
* Return	
* Remarks	
\****************************************************************************/
extern BOOL translate_softkey_pen_event(WGUI_SOFTKEY_ENUM key, mmi_pen_event_type_enum pen_event, S16 x, S16 y, mmi_gui_button_pen_enum *button_event);
static BOOL ProcessPenOnSoftkey(mmi_pen_point_struct pos, mmi_pen_event_type_enum pen_event)
{
	mmi_gui_button_pen_enum button_event;

	if (translate_softkey_pen_event(MMI_LEFT_SOFTKEY, pen_event, pos.x, pos.y, &button_event)
		&& GUI_BUTTON_PEN_UP_INSIDE == button_event) 
	{
		execute_softkey_function(KEY_EVENT_UP, MMI_LEFT_SOFTKEY);
		return TRUE;
	}
	if (translate_softkey_pen_event(MMI_RIGHT_SOFTKEY, pen_event, pos.x, pos.y, &button_event)
		&& GUI_BUTTON_PEN_UP_INSIDE == button_event)
	{
		execute_softkey_function(KEY_EVENT_UP, MMI_RIGHT_SOFTKEY);
		return TRUE;
	}
	return FALSE;
}
#endif	//__MMI_TOUCH_SCREEN__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -