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);
### EMWIN 中父窗口与子窗口的关系及其实现方法 在 EMWIN窗口管理中,父窗口和子窗口之间的关系可以通过创建窗口时指定的参数以及消息处理机制来体现。以下是关于 EMWIN窗口与子窗口的具体实现方式及其代码示例。 #### 1. 创建窗口与子窗口 当通过 `WM_CreateWindowAsChild` 或其他类似的 API 函数创建窗口时,可以明确指定某个窗口作为另一个窗口的子窗口。这通常通过设置第四个参数 `hParent` 来完成。如果 `hParent` 被设为 NULL,则新创建窗口将成为顶级窗口;否则它将是指定父窗口的一个子窗口[^3]。 ```c // 定义一个简单的回调函数用于处理窗口事件 static void MyCallback(WM_MESSAGE * pMsg) { switch (pMsg->MsgId) { case WM_PAINT: // 绘制逻辑 SKIN_multipage_paint4C(pMsg->hWin); break; default: WM_DefaultProc(pMsg); // 默认处理未捕获的消息 } } int main(void) { // 创建窗口 WM_HWIN hParent = WM_CreateWindowAsChild( 0, 0, LCD_GetXSize(), LCD_GetYSize(), WM_HBKWIN, WM_CF_SHOW | WM_CF_MEMDEV, MyCallback, 0); // 创建窗口并将其附加到父窗口下 WM_HWIN hChild = WM_CreateWindowAsChild( 50, 50, 200, 100, hParent, // 设置父窗口句柄 WM_CF_SHOW | WM_CF_MEMDEV, MyCallback, 0); while (1) { /* 主循环 */ } } ``` 上述代码展示了如何创建一个父窗口和一个子窗口,并将它们关联起来。其中,`MyCallback` 是自定义的窗口过程函数,负责响应各种消息。 --- #### 2. 消息传递机制 EMWIN 的消息机制遵循 Windows 编程模型中的基本原理——即每个窗口都会绑定一个窗口函数,用来接收和处理发送至该窗口的消息。然而,在 EMWIN 中需要注意的是: - **消息独立性**:子窗口接收到的消息不会自动转发给其父窗口,除非开发者显式地实现了这种行为[^1]。 - **线程安全性**:由于 EMWIN 并不依赖于操作系统级别的多线程支持,因此建议避免在同一程序的不同线程间调用 EMWIN 提供的功能接口,以免引发潜在的硬件错误或其他异常情况[^2]。 例如,对于某些特定类型的绘图操作(如重绘),可以在子窗口内部完成全部工作而无需通知上级组件参与决策流程。 --- #### 3. 示例分析 下面是一个更具体的例子,演示了父子窗口间的交互模式: ```c #include "GUI.h" #include "WM.h" void ParentWndProc(WM_MESSAGE * pMsg) { switch (pMsg->MsgId) { case WM_INIT_DIALOG: // 初始化逻辑... break; case WM_NOTIFY_PARENT: { unsigned Id = pMsg->Data.v; unsigned NCode = pMsg->Data.wParam; if ((NCode == WM_NOTIFICATION_CLICKED)) { GUI_DEBUG_INFO("Button clicked!"); } } break; default: WM_DefaultProc(pMsg); } } void ChildWndProc(WM_MESSAGE * pMsg) { switch (pMsg->MsgId) { case WM_TOUCH: // 响应触摸事件并向父级报告 WM_NotifyParent(pMsg->hWin, WM_NOTIFICATION_CLICKED); break; case WM_PAINT: GUI_SetBkColor(GUI_RED); GUI_Clear(); break; default: WM_DefaultProc(pMsg); } } int main() { WM_HWIN hParent = WM_CreateDialogBox( NULL, // 小部件资源表为空 0, // 不含任何控件数量 ParentWndProc, // 自定义父窗口过程 WM_HBKWIN, // 后台缓冲区窗口 0, 0, LCD_GetXSize(), LCD_GetYSize()); WM_HWIN hChild = WM_CreateWindowAsChild( 100, 100, // X,Y坐标偏移量 80, 60, // 高宽尺寸 hParent, // 显式声明所属父节点 WM_CF_SHOW | WM_CF_MEMDEV, ChildWndProc, // 子窗体专属处理器 0 // 用户数据字段留空 ); GUI_Exec(); // 进入图形界面运行状态 } ``` 在此案例里,我们不仅构建了一套完整的父子结构体系,还加入了触碰反馈功能展示实际应用场景下的动态效果变化规律特点[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aron566

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值