EMWIN密码验证窗口创建

EMWIN密码验证窗口创建

/**
 *  @file PasswdCheck.c
 *
 *  @date 2020-7-6
 *
 *  @author aron566
 *
 *  @copyright None
 *
 *  @brief 通用密码验证页面
 *
 *  @details None
 *
 *  @version V1.0
 */
#ifdef __cplusplus ///<use C compiler
extern "C" {
    
    
#endif
/** Includes -----------------------------------------------------------------*/
/* Private includes ----------------------------------------------------------*/
#include "PasswdCheck.h"
#include "DIALOG.h"
/** Private typedef ----------------------------------------------------------*/

/** Private macros -----------------------------------------------------------*/
#define ID_FRAMEWIN_0                           (GUI_ID_USER + 0x00)
#define ID_TEXT_0                               (ID_FRAMEWIN_0 + 0x01)
#define ID_TEXT_1                               (ID_FRAMEWIN_0 + 0x02)
#define ID_EDIT_0                               (ID_FRAMEWIN_0 + 0x03)

#define PASSWD_MAX_CHAR_NUM											4
/** Private constants --------------------------------------------------------*/
/** Public variables ---------------------------------------------------------*/
/** Private variables --------------------------------------------------------*/
static char Password_Input[PASSWD_MAX_CHAR_NUM+1] = "0000";
static char *Password_Raw = NULL;
static uint8_t PasswdCheckTaskResult = 0;						/**< 窗口运行结果*/
static WM_HWIN MAINWin = 0;
/** Private function prototypes ----------------------------------------------*/
static void PasswdCheckWindowHide(void);						/**< 窗口隐藏*/

static WM_HWIN CreateitemsPasswdCheckWindow(void);	        /**< 窗口建立*/
static void PasswdCheckPage_Init(char *str);				/**< 窗口页面信息初始化*/
static void cbDialog(WM_MESSAGE *pMsg);						/**< 页面控件建立*/
static void CreateTittle(WM_MESSAGE *pMsg);					/**< 建立窗口标题*/
static void CreateEditBox(WM_MESSAGE *pMsg);				/**< 建立窗口编辑框*/
static void CreateTipsText(WM_MESSAGE *pMsg);				/**< 建立窗口提示文本*/
static void PasswdFocusUpdate(int postion);					/**< 更新编辑框聚焦*/
static void PasswdCheckPage_Back(void);						/**< 左移处理*/
static void PasswdCheckPage_Forward(void);					/**< 右移处理*/
static void PasswdCheckPage_Up(void);						/**< 上键处理*/
static void PasswdCheckPage_Down(void);						/**< 下键处理*/
/** Private user code --------------------------------------------------------*/

/** Private application code -------------------------------------------------*/
/*******************************************************************************
*
*       Static code
*
********************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    
    
  {
    
     FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, PASSWD_DIGLOG_BOX_START_X, PASSWD_DIGLOG_BOX_START_Y, PASSWD_DIGLOG_BOX_END_X, PASSWD_DIGLOG_BOX_END_Y, 0, 0x0, 0 },
  {
    
     TEXT_CreateIndirect, "Text",        ID_TEXT_0, PASSWD_DIGLOG_BOX_TEXT_START_X, PASSWD_DIGLOG_BOX_TEXT_START_Y, PASSWD_DIGLOG_BOX_TEXT_END_X, PASSWD_DIGLOG_BOX_TEXT_END_Y, 0, 0x0, 0 },
  {
    
     EDIT_CreateIndirect, "Edit",        ID_EDIT_0, PASSWD_DIGLOG_BOX_EDIT_START_X, PASSWD_DIGLOG_BOX_EDIT_START_Y, PASSWD_DIGLOG_BOX_EDIT_END_X, PASSWD_DIGLOG_BOX_EDIT_END_Y, 0, 0x0, 0 },
};

/**
  ******************************************************************
  * @brief   建立主窗口
  * @param   [in]None
  * @retval  窗口句柄
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static WM_HWIN CreateitemsPasswdCheckWindow(void)
{
    
    
	return GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), cbDialog, WM_HBKWIN, 0, 0);
}

/**
  ******************************************************************
  * @brief   初始化密码验证页面
  * @param   [in]WM_MESSAGE 窗口管理消息指针
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static void cbDialog(WM_MESSAGE * pMsg)
{
    
    
    WM_EnableMemdev(pMsg->hWin);

    switch (pMsg->MsgId) 
    {
    
    
        case WM_INIT_DIALOG:
			/*创建标题*/
            CreateTittle(pMsg);
			/*创建编辑框*/
            CreateEditBox(pMsg);
			/*创建提示文本*/
			CreateTipsText(pMsg);
            break;
        case WM_NOTIFY_PARENT:
            break;
        case GW_WM_KEY:
        case WM_KEY:
            break;
        case WM_TIMER:
            break;
        default:
            WM_DefaultProc(pMsg);
            break;
    }
}

/**
  ******************************************************************
  * @brief   页面信息初始化
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static void PasswdCheckPage_Init(char *str)
{
    
    
	strcpy(Password_Input ,"0000");
	Password_Raw = str;
	PasswdCheckTaskResult = 0;
}

/**
  ******************************************************************
  * @brief   初始化密码验证页面标题
  * @param   [in]WM_MESSAGE 窗口管理消息指针
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static void CreateTittle(WM_MESSAGE * pMsg)
{
    
    
    WM_HWIN hItem;
    WM_EnableMemdev(pMsg->hWin);

	hItem = pMsg->hWin;
	
	/*设定标题*/
    FRAMEWIN_SetText(hItem, "Tips");
}

/**
  ******************************************************************
  * @brief   初始化密码验证页面编辑框
  * @param   [in]WM_MESSAGE 窗口管理消息指针
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static void CreateEditBox(WM_MESSAGE * pMsg)
{
    
    
    WM_HWIN hItem;
    WM_EnableMemdev(pMsg->hWin);

	/*判断当前页面可创建按钮数目*/
    hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
	
	/*设置编辑框初始显示*/
  	EDIT_SetTextAlign(hItem, GUI_TA_VCENTER|GUI_TA_LEFT);
    EDIT_SetFont(hItem, &GUI_FontSongTi16);
    EDIT_EnableInversion(hItem,0);
    EDIT_SetText(hItem, Password_Input);

	/*开启聚焦与闪烁功能*/
    EDIT_SetFocussable(hItem,1);
    EDIT_EnableBlink(hItem,500,1);
	
	/*初始化聚焦字符*/
    EDIT_SetCursorAtChar(hItem, 0);
    WM_SetFocus(hItem);
}

/**
  ******************************************************************
  * @brief   初始化密码验证页面提示文本
  * @param   [in]WM_MESSAGE 窗口管理消息指针
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static void CreateTipsText(WM_MESSAGE *pMsg)
{
    
    
	WM_HWIN hItem;
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
		
	/*设置提示文本*/
    TEXT_SetFont(hItem, &GUI_FontSongTi16);
    TEXT_SetText(hItem, tr(GL_please_input_password));
}

/**
  ******************************************************************
  * @brief   更新页面编辑框聚焦
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static void PasswdFocusUpdate(int postion)
{
    
    
	/*判断主窗口已建立*/
	if(MAINWin != 0)
	{
    
    
		WM_HWIN hItem = WM_GetDialogItem(MAINWin, ID_EDIT_0);
		WM_EnableMemdev(hItem);
		EDIT_SetCursorAtChar(hItem, postion);
	}
}

/**
  ******************************************************************
  * @brief   左移处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static void PasswdCheckPage_Back(void)
{
    
    
    int Postion = 0;

    WM_HWIN hItem;
    hItem = WM_GetDialogItem(MAINWin, ID_EDIT_0);
    WM_EnableMemdev(hItem);
	
	/*获取当前编辑框聚焦的位置*/
    Postion = EDIT_GetCursorCharPos(hItem);
	
	/*翻转移动*/
	Postion = Postion-1 < 0?PASSWD_MAX_CHAR_NUM-1:Postion-1;

	/*更新聚焦*/
	PasswdFocusUpdate(Postion);
}

/**
  ******************************************************************
  * @brief   右移处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void PasswdCheckPage_Forward(void)
{
    
    
    int Postion = 0;

    WM_HWIN hItem;
    hItem = WM_GetDialogItem(MAINWin, ID_EDIT_0);
    WM_EnableMemdev(hItem);
	
	/*获取当前编辑框聚焦的位置*/
    Postion = EDIT_GetCursorCharPos(hItem);
	
	/*翻转移动*/
	Postion = Postion+1 > PASSWD_MAX_CHAR_NUM-1?0:Postion+1;

	/*更新聚焦*/
	PasswdFocusUpdate(Postion);		
}

/**
  ******************************************************************
  * @brief	 上键处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static void PasswdCheckPage_Up(void)
{
    
    
    int Postion = 0;

    WM_HWIN hItem;
    hItem = WM_GetDialogItem(MAINWin, ID_EDIT_0);
    WM_EnableMemdev(hItem);
	
	/*获取当前编辑框聚焦的位置*/
    Postion = EDIT_GetCursorCharPos(hItem);
	
	/*Postion范围0-3,限制访问越界问题*/
	Postion = Postion > PASSWD_MAX_CHAR_NUM?0:Postion;

	Password_Input[Postion]++;

	/*限制输入范围[0-9]*/
	Password_Input[Postion] = Password_Input[Postion] > '9'?'0':Password_Input[Postion];

	/*重新设置编辑框文本*/
	EDIT_SetText(hItem ,Password_Input);

	/*更新聚焦*/
	PasswdFocusUpdate(Postion);		
}

/**
  ******************************************************************
  * @brief	 下键处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void PasswdCheckPage_Down(void)
{
    
    
    int Postion = 0;

    WM_HWIN hItem;
    hItem = WM_GetDialogItem(MAINWin, ID_EDIT_0);
    WM_EnableMemdev(hItem);
	
	/*获取当前编辑框聚焦的位置*/
    Postion = EDIT_GetCursorCharPos(hItem);
	
	/*Postion范围0-3,限制访问越界问题*/
	Postion = Postion > PASSWD_MAX_CHAR_NUM?0:Postion;

	Password_Input[Postion]--;

	/*限制输入范围[0-9]*/
	Password_Input[Postion] = Password_Input[Postion] < '0'?'9':Password_Input[Postion];

	/*重新设置编辑框文本*/
	EDIT_SetText(hItem ,Password_Input);

	/*更新聚焦*/
	PasswdFocusUpdate(Postion);
}

/**
  ******************************************************************
  * @brief	 OK键处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void PasswdCheckPage_Ok(void)
{
    
    
	/*验证密码是否正确*/
	if(0 == strcmp(Password_Input ,Password_Raw))
	{
    
    
		PasswdCheckTaskResult = 1;
		PasswdCheckWindowHide();
	}
	else
	{
    
    
		PasswdCheckTaskResult = 0;
	}
}

/**
  ******************************************************************
  * @brief	 返回键处理
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-5-20
  ******************************************************************
  */
static void PasswdCheckPage_Return(void)
{
    
    
	PasswdCheckWindowHide();
}

/**
  ******************************************************************
  * @brief   密码验证窗口隐藏
  * @param   [in]None
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
static void PasswdCheckWindowHide(void)
{
    
    
    if(MAINWin)
    {
    
    
        WM_DeleteWindow(MAINWin);
        MAINWin = 0;
		Password_Raw = NULL;
    }
}
/** Public application code --------------------------------------------------*/
/*******************************************************************************
*
*       Public code
*
********************************************************************************
*/
/**
  ******************************************************************
  * @brief   获取运行结果状态
  * @param   [in]None
  * @retval  1  成功
  * @retval  0  失败
  * @author  aron566
  * @version V1.0
  * @date    2020-5-21
  ******************************************************************
  */
uint32_t PasswdCheckWindowGetTaskResult(void)
{
    
    
	if(PasswdCheckTaskResult)
	{
    
    
		return 1;
	}
	else
	{
    
    
		return 0;
	}
}

/**
  ******************************************************************
  * @brief   密码验证窗口按键处理
  * @param   [in]Key
  * @retval  当前窗口状态:1显示 0关闭
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
uint8_t PasswdCheckWindowSendKey(int key)
{
    
    
	/*判断窗口是否处于激活状态则下发按键*/
	if(PasswdCheckWindowGetState())
	{
    
    
		switch(key)
		{
    
    
			case GUI_KEY_UP:
			case KEY_BUTTON_UP:
			case KEY_UP:
				PasswdCheckPage_Up();
				break;
			case GUI_KEY_DOWN:
			case KEY_BUTTON_DOWN:
			case KEY_DOWN:
				PasswdCheckPage_Down();
				break;
			case GUI_KEY_LEFT:
			case KEY_BUTTON_LEFT:
			case KEY_LEFT:
				PasswdCheckPage_Back();
				break;
			case GUI_KEY_RIGHT:
			case KEY_BUTTON_RIGHT:
			case KEY_RIGHT:
				PasswdCheckPage_Forward();
				break;
			case GUI_KEY_ENTER:
			case KEY_OK:
				PasswdCheckPage_Ok();
				break;
			case GUI_KEY_ESCAPE:
			case KEY_ESC:
				PasswdCheckPage_Return();
				break;
			default:
				break;
		}
	}
	/*返回当前窗口状态*/
	return PasswdCheckWindowGetState();
}

/**
  ******************************************************************
  * @brief   密码验证窗口,状态获取
  * @param   [in]None
  * @retval  1  窗口显示中
  * @retval  0  窗口已失效
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
uint8_t PasswdCheckWindowGetState(void)
{
    
    
	/*获取窗口状态*/
	if(MAINWin)
	{
    
    
		return 1;
	}
	else
	{
    
    
		return 0;
	}
}

/**
  ******************************************************************
  * @brief   密码验证窗口显示
  * @param   [in]需进行验证的字符串
  * @retval  None
  * @author  aron566
  * @version V1.0
  * @date    2020-7-6
  ******************************************************************
  */
void PasswdCheckWindowShow(char *checkKey)
{
    
    
	if(MAINWin == 0)
	{
    
    
		/*重置窗口资源*/
		PasswdCheckPage_Init(checkKey);
		MAINWin = CreateitemsPasswdCheckWindow();
	}
}

#ifdef __cplusplus ///<end extern c
}
#endif

调用接口

PasswdCheck.h

void PasswdCheckWindowShow(char *checkKey);
uint8_t PasswdCheckWindowGetState(void);
uint8_t PasswdCheckWindowSendKey(int key);
uint32_t PasswdCheckWindowGetTaskResult(void);

猜你喜欢

转载自blog.csdn.net/weixin_42892101/article/details/107460089