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

📄 iinputwindow.c

📁 以栈结构实现的多级菜单
💻 C
字号:
#include "IInputWindow.h"
#include "AEEAppGen.h"
#include "WindowStack.h"
#include "MenuList_res.h"
/////////////////////////Static Function//////////////////////
#define INPUT_TEXT_X_START	2
#define INPUT_TEXT_Y_START	0
#define INPUT_TEXT_MAX_SIZE 150
//窗口的控件
typedef enum
{
    INPUT_SOFTKEYCTL=0,
    INPUT_TEXT1CTL,
    INPUT_TEXT2CTL
}TInputCtlType;
//软键控件的ItemId定义
typedef enum
{
  INPUT_SOFTKEY_ITEM = 1,
  INPUT_SOFTKEY_ITEM_INPUT_MODE,
  INPUT_SOFTKEY_ITEM_DONE,
  INPUT_SOFTKEY_ITEM_CANCEL
}TInputMesWinItems;
//按键事件的处理
static boolean IINPUTWINDOW_HandleKeyEvent(IInputWin* pWin,uint16 wParam);
//软键菜单的处理
static boolean IINPUTWINDOW_HandleCommandEvent(IInputWin* pWin,uint16 wParam);
//设置窗口中控件的激活状态
static boolean IINPUTWINDOW_SetActiveCtl(IInputWin* pWin,TInputCtlType nTextCtl);
/////////////////////////Public Function//////////////////////
boolean NewTextInputDialog(
		//svoid *pPtr,
		InputTextInfo* pTextInfo1,
		InputTextInfo* pTextInfo2, 
        TInputDialogResp tpResponseFunction)
{
	IInputWin* pWin;
	AEERect  Text1Rect;
	AEERect  Text2Rect;
	AEERect  softkeyRect;
	AEEDeviceInfo  di;
	uint32         textProps;
	AEEApplet* pApp=(AEEApplet*)GETAPPINSTANCE();
	
	if(!pTextInfo1||!tpResponseFunction)
		return FALSE;
	//分配窗口空间
	pWin=MALLOCREC(IInputWin);
	if(!pWin) return FALSE;
	if(IT_NUMBER==pTextInfo1->m_inputType)
		pWin->m_wMode=AEE_TM_NUMBERS;
	else
		pWin->m_wMode=AEE_TM_LETTERS;
	pWin->tpResponseFunction=tpResponseFunction;
	//创建软键控件
	if(SUCCESS!=ISHELL_CreateInstance(pApp->m_pIShell,AEECLSID_SOFTKEYCTL,
		(void **)&(pWin->m_pSoftKeyCtl)))
	{
		IINPUTWINDOW_Release(pApp->m_pIShell,&pWin);
		return FALSE;
	}
	if(AEE_TM_LETTERS==pWin->m_wMode)
		IMENUCTL_AddItem(pWin->m_pSoftKeyCtl, MENULIST_RES_FILE, IDS_INPUTLETTER,INPUT_SOFTKEY_ITEM_INPUT_MODE, NULL, 0);
	else
		IMENUCTL_AddItem(pWin->m_pSoftKeyCtl, MENULIST_RES_FILE, IDS_INPUTNUMBER,INPUT_SOFTKEY_ITEM_INPUT_MODE, NULL, 0);
	IMENUCTL_AddItem(pWin->m_pSoftKeyCtl, MENULIST_RES_FILE, IDS_CANCEL,	 INPUT_SOFTKEY_ITEM_CANCEL,     NULL, 0);
	IMENUCTL_AddItem(pWin->m_pSoftKeyCtl,MENULIST_RES_FILE, IDS_OK,		 INPUT_SOFTKEY_ITEM_DONE,       NULL, 0);

	IMENUCTL_GetRect(pWin->m_pSoftKeyCtl, &softkeyRect);	
	ISHELL_GetDeviceInfo(pApp->m_pIShell, &di);
	//创建文本输入控件
	if(SUCCESS!=ISHELL_CreateInstance(pApp->m_pIShell,AEECLSID_TEXTCTL,(void **)&(pWin->m_pText1)))
	{
		IINPUTWINDOW_Release(pApp->m_pIShell,&pWin);
		return FALSE;
	}
	if(pTextInfo2&&SUCCESS!=ISHELL_CreateInstance(pApp->m_pIShell,AEECLSID_TEXTCTL,(void **)&(pWin->m_pText2)))
	{
		IINPUTWINDOW_Release(pApp->m_pIShell,&pWin);
		return FALSE;
	}
	//Rect
	Text1Rect.x = INPUT_TEXT_X_START;
	Text1Rect.y = INPUT_TEXT_Y_START;
	Text1Rect.dx = di.cxScreen-2*INPUT_TEXT_X_START;
	Text1Rect.dy = (int16)(softkeyRect.y -INPUT_TEXT_Y_START-1);
	
	if(pTextInfo2)
	{
		Text1Rect.dy/=2;
		
		Text2Rect.dx=Text1Rect.dx;
		Text2Rect.dy=Text1Rect.dy;
		Text2Rect.x=Text1Rect.x;
		Text2Rect.y=Text1Rect.y+Text1Rect.dy;
		ITEXTCTL_SetRect(pWin->m_pText2, &Text2Rect);	
	}
	ITEXTCTL_SetRect(pWin->m_pText1, &Text1Rect);	
	//Properties
	textProps = ITEXTCTL_GetProperties(pWin->m_pText1);
	textProps |= TP_FRAME;
	textProps |= TP_MULTILINE;
	if (IT_PASSWORD==pTextInfo1->m_inputType)
		textProps |= TP_PASSWORD;
	else if (IT_NUMBER==pTextInfo1->m_inputType)
		textProps |= AEE_TM_NUMBERS;
	ITEXTCTL_SetProperties(pWin->m_pText1,textProps);
	
	if(pTextInfo2)
	{
		textProps = ITEXTCTL_GetProperties(pWin->m_pText2);
		textProps |= TP_FRAME;
		textProps |= TP_MULTILINE;
		if (IT_PASSWORD==pTextInfo2->m_inputType)
			textProps |= TP_PASSWORD;
		else if (IT_NUMBER==pTextInfo2->m_inputType)
			textProps |= AEE_TM_NUMBERS;
		ITEXTCTL_SetProperties(pWin->m_pText2,textProps);
	}
	//Max Size
	ITEXTCTL_SetMaxSize(pWin->m_pText1,INPUT_TEXT_MAX_SIZE);
	if(pTextInfo2)
		ITEXTCTL_SetMaxSize(pWin->m_pText2,INPUT_TEXT_MAX_SIZE);
	//Set Text
	if(pTextInfo2)
	{
		ITEXTCTL_SetText(pWin->m_pText2, pTextInfo2->m_pText?pTextInfo2->m_pText:(AECHAR*)"\0\0", -1);
		ITEXTCTL_SetTitle(pWin->m_pText2,MENULIST_RES_FILE,IDS_INPUTTITLE,pTextInfo2->m_pTitle);
	}
	ITEXTCTL_SetText(pWin->m_pText1, pTextInfo1->m_pText?pTextInfo1->m_pText:(AECHAR*)"\0\0", -1);
	ITEXTCTL_SetTitle(pWin->m_pText1,MENULIST_RES_FILE,IDS_INPUTTITLE,pTextInfo1->m_pTitle);
	//Set Active
	IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
	//注册窗口
	return IWINSTACK_OpenWindow(WAPWINID_INPUT,pWin);
}
void*   IINPUTWINDOW_Create(IShell* pShell,void* pParam)
{
	pShell=pShell;
	return pParam;
}
boolean IINPUTWINDOW_Release(IShell* pShell,void** pWin)
{
	IInputWin* pInputWin=*pWin;
	if(pInputWin)
	{
		if(pInputWin->m_pSoftKeyCtl)
			IMENUCTL_Release(pInputWin->m_pSoftKeyCtl);
		if(pInputWin->m_pText1)
			ITEXTCTL_Release(pInputWin->m_pText1);
		if(pInputWin->m_pText2)
			ITEXTCTL_Release(pInputWin->m_pText2);
		FREEIF(*pWin);
	}
	return TRUE;
}
boolean IINPUTWINDOW_Redraw(IShell* pShell,void* pWin)
{
	IInputWin* pInputWin=pWin;
	AEEApplet* pApp=(AEEApplet*)GETAPPINSTANCE();
	if(pInputWin&&pApp)
	{
		IDISPLAY_ClearScreen(pApp->m_pIDisplay);
		if(pInputWin->m_pSoftKeyCtl)
			IMENUCTL_Redraw(pInputWin->m_pSoftKeyCtl);
		if(pInputWin->m_pText1)
			ITEXTCTL_Redraw(pInputWin->m_pText1);
		if(pInputWin->m_pText2)
			ITEXTCTL_Redraw(pInputWin->m_pText2);
		IDISPLAY_Update(pApp->m_pIDisplay);
	}
	return TRUE;
}
boolean IINPUTWINDOW_EventHandle(void* pWin,AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
	IInputWin* pInputWin=pWin;
	boolean bDispatched = FALSE;
	if(NULL==pInputWin) return FALSE;

	switch(eCode)
	{
	case EVT_KEY:
		bDispatched=IINPUTWINDOW_HandleKeyEvent(pWin,wParam);
		break;
/*	case EVT_KEY_HELD://按键长按事件
		if(pInputWin->m_pText1&&ITEXTCTL_IsActive(pInputWin->m_pText1))
			bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText1,eCode,wParam,dwParam);
		else if(pInputWin->m_pText2&&ITEXTCTL_IsActive(pInputWin->m_pText2))
			bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText2,eCode,wParam,dwParam);
		break;*/
	case EVT_COMMAND:
		bDispatched=IINPUTWINDOW_HandleCommandEvent(pWin,wParam);
		break;
	case EVT_CHAR:
		if(pInputWin->m_pText1&&ITEXTCTL_IsActive(pInputWin->m_pText1))
			bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText1,eCode,wParam,dwParam);
		else if(pInputWin->m_pText2&&ITEXTCTL_IsActive(pInputWin->m_pText2))
			bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText2,eCode,wParam,dwParam);
		break;
	}
	return bDispatched;
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
static boolean IINPUTWINDOW_HandleKeyEvent(IInputWin* pWin,uint16 wParam)
{
	IInputWin* pInputWin=pWin;
	boolean bDispatched = FALSE;
	if(NULL==pInputWin) return FALSE;
	//首先让当前激活的控件处理按键事件
	if(pInputWin->m_pText1&&ITEXTCTL_IsActive(pInputWin->m_pText1))
		bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText1,EVT_KEY,wParam,0);
	else if(pInputWin->m_pText2&&ITEXTCTL_IsActive(pInputWin->m_pText2))
		bDispatched=ITEXTCTL_HandleEvent(pInputWin->m_pText2,EVT_KEY,wParam,0);
	else if(pInputWin->m_pSoftKeyCtl&&IMENUCTL_IsActive(pInputWin->m_pSoftKeyCtl))
		bDispatched=IMENUCTL_HandleEvent(pInputWin->m_pSoftKeyCtl,EVT_KEY,wParam,0);
	if(bDispatched) return TRUE;
	//如果控件对事件不做处理再执行下面操作
	switch(wParam) 
	{
	case AVK_UP:
		if(IMENUCTL_IsActive(pWin->m_pSoftKeyCtl))
			IINPUTWINDOW_SetActiveCtl(pWin,INPUT_TEXT2CTL);
		else if(ITEXTCTL_IsActive(pWin->m_pText1))
			IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
		else
			IINPUTWINDOW_SetActiveCtl(pWin,INPUT_TEXT1CTL);
		bDispatched = TRUE;
		break;
	case AVK_DOWN:
		if(ITEXTCTL_IsActive(pWin->m_pText1)) 
		{
			if (pWin->m_pText2)
				IINPUTWINDOW_SetActiveCtl(pWin,INPUT_TEXT2CTL);
			else
				IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
		}
		else if(IMENUCTL_IsActive(pWin->m_pSoftKeyCtl))
			IINPUTWINDOW_SetActiveCtl(pWin,INPUT_TEXT1CTL);
		else
			IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
		bDispatched = TRUE;
		break;
	case AVK_CLR://关闭窗口
		IWINSTACK_CloseWindow(TRUE);
		bDispatched = TRUE;
		break;
	case AVK_SELECT:
		//当软键不在激活状态时按Select会将软键设为激活
		IINPUTWINDOW_SetActiveCtl(pWin,INPUT_SOFTKEYCTL);
		bDispatched = TRUE;
		break;
	}
	return bDispatched;
}
static boolean IINPUTWINDOW_HandleCommandEvent(IInputWin* pWin,uint16 wParam)
{
	AEEApplet* pApp=(AEEApplet*)GETAPPINSTANCE();
	IInputWin* pInputWin=pWin;
	boolean bDispatched = FALSE;
	if(NULL==pInputWin) return FALSE;
	//
	switch(wParam)
	{
	case INPUT_SOFTKEY_ITEM_INPUT_MODE:
		break;
	case INPUT_SOFTKEY_ITEM_DONE:
		if(pWin->tpResponseFunction)
		{
			AECHAR* pText1=NULL;
			AECHAR* pText2=NULL;
			pText1=ITEXTCTL_GetTextPtr(pWin->m_pText1);
			if(pWin->m_pText2)
				pText2=ITEXTCTL_GetTextPtr(pWin->m_pText2);
			pWin->tpResponseFunction(pText1,pText2, TRUE);
		}
		IWINSTACK_CloseWindow(TRUE);
		break;
	default:
		IWINSTACK_CloseWindow(TRUE);
	}
	return TRUE;
}

static boolean IINPUTWINDOW_SetActiveCtl(IInputWin* pWin,TInputCtlType nTextCtl)
{
	//当nTextCtl=INPUT_SOFTKEYCTL,不显示任何文本控件
	//当text2不存在时,无论nTextCtl的值为多少,都显示text1
	//当text2存在时,nTextCtl=INPUT_TEXT1CTL,显示text1,否则显示text2
	switch(nTextCtl)
	{
	case INPUT_SOFTKEYCTL:
		ITEXTCTL_SetActive(pWin->m_pText1, FALSE);
		if ((pWin->m_pText2) && (ITEXTCTL_IsActive(pWin->m_pText2)))
			ITEXTCTL_SetActive(pWin->m_pText2, FALSE);
		IMENUCTL_SetActive(pWin->m_pSoftKeyCtl, TRUE);
		IMENUCTL_SetSel(pWin->m_pSoftKeyCtl, INPUT_SOFTKEY_ITEM_INPUT_MODE);
		break;
	case INPUT_TEXT2CTL:
		if(pWin->m_pText2)
		{
			ITEXTCTL_SetInputMode(pWin->m_pText2, pWin->m_wMode);
			IMENUCTL_SetActive(pWin->m_pSoftKeyCtl, FALSE);
			ITEXTCTL_SetActive(pWin->m_pText1, FALSE);
			ITEXTCTL_SetCursorPos(pWin->m_pText2, TC_CURSOREND);
			ITEXTCTL_SetActive(pWin->m_pText2, TRUE);
			break;
		}
	default:
		ITEXTCTL_SetInputMode(pWin->m_pText1, pWin->m_wMode);
		IMENUCTL_SetActive(pWin->m_pSoftKeyCtl, FALSE);
		if (pWin->m_pText2)
		ITEXTCTL_SetActive(pWin->m_pText2, FALSE);
		ITEXTCTL_SetCursorPos(pWin->m_pText1, TC_CURSOREND);
		ITEXTCTL_SetActive(pWin->m_pText1, TRUE);
	}
	return TRUE;
}

⌨️ 快捷键说明

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