emWin消息结构体中关于目标窗口、源窗口问题 - /*********************************************************************
- * SEGGER Microcontroller GmbH & Co. KG *
- * Solutions for real time microcontroller applications *
- **********************************************************************
- * *
- * (c) 1996 - 2014 SEGGER Microcontroller GmbH & Co. KG *
- * *
- * Internet: www.segger.com Support: support@segger.com *
- * *
- **********************************************************************
- ** emWin V5.24 - Graphical user interface for embedded applications **
- emWin is protected by international copyright laws. Knowledge of the
- source code may not be used to write a similar product. This file may
- only be used in accordance with a license and should not be re-
- distributed in any way. We appreciate your understanding and fairness.
- ----------------------------------------------------------------------
- File : WIDGET_Edit.c
- Purpose : Example demonstrating the use of a EDIT widget
- Requirements: WindowManager - (x)
- MemoryDevices - ( )
- AntiAliasing - ( )
- VNC-Server - ( )
- PNG-Library - ( )
- TrueTypeFonts - ( )
- ----------------------------------------------------------------------
- */
- #include "GUI.h"
- #include "EDIT.h"
- /*********************************************************************
- *
- * Defines
- *
- **********************************************************************
- */
- #define WM_APP_SHOW_TEXT (WM_USER + 0)
- #define TEXT_MAXLEN 40
- /*********************************************************************
- *
- * Static code
- *
- **********************************************************************
- */
- /*********************************************************************
- *
- * _cbBk
- */
- static void _cbBk(WM_MESSAGE * pMsg) {
- static WM_HWIN hEdit=0;
- static U8 ShowText=0;
- char aBuffer[TEXT_MAXLEN];
- //hEdit = 0;
- //ShowText = 0;
- switch (pMsg->MsgId) {
- case WM_PAINT:
- GUI_SetBkColor(GUI_RED);
- GUI_Clear();
- GUI_SetFont(&GUI_Font24_ASCII);
- GUI_DispStringHCenterAt("WIDGET_Edit - Sample", 160, 5);
- GUI_SetFont(&GUI_Font8x16);
- if (ShowText) {
- GUI_DispStringHCenterAt("The string you have modified is:", 160, 90);
- EDIT_GetText(hEdit, aBuffer, TEXT_MAXLEN);//EDIT_GetText检索指定编辑字段的用户输入
- GUI_DispStringHCenterAt(aBuffer, 160, 110);//GUI_DispStringHCenterAt在指定位置水平居中显示字符串
- } else {
- GUI_DispStringHCenterAt("Use keyboard to modify string...", 160, 90);
- }
- break;
- /*
- 桌面窗口中自定义的消息,如果收到这个消息后,隐藏编辑框,
- 设置ShowText=1,然后将桌面窗口设置为无效,从而会执行桌面窗口的WM_PAINT消息,
- 最后给桌面窗口建立一个定时器,时间是3000ms
- */
- case WM_APP_SHOW_TEXT:
- if (hEdit == 0) {
- hEdit = pMsg->hWinSrc;
- }
- WM_HideWindow(hEdit);
- ShowText = 1;
- WM_InvalidateWindow(WM_HBKWIN);
- WM_CreateTimer(WM_HBKWIN, 0, 3000, 0);//创建定时器,其功能是经过指定周期后,向指定窗口发送消息。该定时器与指定窗口相关联。向句柄为WM_HBKWIN的窗口发送定时消息
- break;
- case WM_TIMER:
- ShowText = 0;
- WM_InvalidateWindow(WM_HBKWIN);
- WM_ShowWindow(hEdit);
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
- /*********************************************************************
- *
- * _cbEdit
- * 编辑框回调函数
- */
- static void _cbEdit(WM_MESSAGE * pMsg) {
- const WM_KEY_INFO * pInfo;
- WM_MESSAGE Msg;
- switch (pMsg->MsgId) {
- case WM_KEY:
- pInfo = (WM_KEY_INFO *)pMsg->Data.p;
- if (pInfo->Key == GUI_KEY_ENTER) {
- if (pInfo->PressedCnt == 0) {//PressedCnt按键被放开
- Msg.MsgId = WM_APP_SHOW_TEXT;
- Msg.hWinSrc = pMsg->hWin;//?
- WM_SendMessage(WM_HBKWIN, &Msg);//
- return;
- }
- }
- }
- EDIT_Callback(pMsg);//emWin库中自带的编辑框回调函数EDIT_Callback(pMsg)
- }
- /*********************************************************************
- *
- * Public code
- *
- **********************************************************************
- */
- /*********************************************************************
- *
- * MainTask
- */
- void MainTask(void) {
- EDIT_Handle hEdit;
- GUI_Init();
- WM_SetCallback(WM_HBKWIN, _cbBk);//设置桌面窗口的回调函数
- hEdit = EDIT_CreateEx(50, 110, 220, 25, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_EDIT0, TEXT_MAXLEN);//在指定位置创建指定尺寸的EDIT 小工具,父窗口句柄为WM_HBKWIN,编辑框ID为GUI_ID_EDIT0
- WM_SetCallback(hEdit, _cbEdit);//设置编辑框的回调函数
- EDIT_SetText(hEdit, "Press <ENTER> when done...");
- EDIT_SetFont(hEdit, &GUI_Font8x16);
- EDIT_SetTextColor(hEdit, 0, GUI_RED);
- EDIT_EnableBlink(hEdit, 300, 1);//EDIT_EnaBleBlink() 启用/ 禁用闪烁光标,启用光标闪烁,闪烁周期为300
- while (1) {
- GUI_Delay(10);
- }
- }
- /*************************** End of file ****************************/
复制代码根据数据手册,WM_MESSAGE结构体如下:
那么在代码中134行设置桌面窗口的回调函数时将_cbBk设置为句柄为WM_HBKWIN的桌面窗口回调函数,再追踪到_chBk定义处,79行“hEdit = pMsg->hWinSrc”这行代码是将消息pMsg的源窗口句柄赋值为hEdit,那么我的问题就来了,这里的源窗口句柄hWinSrc到底是指的哪个,也就是问这个回调函数_chBk所接受到的消息由谁发财的? 同理136行设置编辑框的回调函数_cbEdit,追踪到_cbEdit定义处,111行“Msg.hWinSrc = pMsg->hWin”,pMsg的目标窗口pMsg->hWin又是指的哪个?是在主函数创建的编辑框句柄hEdit(135行“hEdit = EDIT_CreateEx(50, 110, 220, 25, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_EDIT0, TEXT_MAXLEN)”)吗? 急求各位解答,在线等!!!!
|