特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第34章 窗口管理器实例(一)
为了帮助大家更好的理解窗口管理器的回调和消息机制,本期教程专门做了三个相关的例子,帮助大家更好的理解。 34. 1 用户自定义消息类型实例 34. 2 桌面窗口回调函数实例 34. 3 官方WM_Redraw.c实例 34. 4 总结 34.1 用户自定义消息类型实例 这里用上期教程所介绍的自定义消息类型做一个实例。代码跟上期教程的三个实例类似。实现源码如下(可以直接将代码复制到模拟器或者开发板上面运行)。 - #include <stddef.h>
- #include "GUI.h"
- #include "DIALOG.h"
-
- #include "WM.h"
- #include "BUTTON.h"
- #include "CHECKBOX.h"
- #include "DROPDOWN.h"
- #include "EDIT.h"
- #include "FRAMEWIN.h"
- #include "LISTBOX.h"
- #include "MULTIEDIT.h"
- #include "RADIO.h"
- #include "SLIDER.h"
- #include "TEXT.h"
- #include "PROGBAR.h"
- #include "SCROLLBAR.h"
- #include "LISTVIEW.h"
-
-
- #define WM_UPDATE WM_USER + 1(1)
- /*********************************************************************
- *
- * static data
- *
- **********************************************************************
- */
- GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW};
- static char ucBackColor;
-
-
-
- /*********************************************************************
- *
- * Dialog resource
- *
- * This table conatins the info required to create the dialog.
- * It has been created by ucGUIbuilder.
- */
-
- static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
- { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 800,480,FRAMEWIN_CF_MOVEABLE,0},
- { BUTTON_CreateIndirect, "BUTTON0", GUI_ID_BUTTON0, 82, 122,162,37, 0,0},
- { BUTTON_CreateIndirect, "BUTTON1", GUI_ID_BUTTON1, 357,123,152,35, 0,0}
- };
-
- /*****************************************************************
- ** FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
- ** Function: to initialize the Dialog items
- **
- ** call this function in _cbCallback --> WM_PAINT
- *****************************************************************/
-
- void PaintDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
- GUI_SetBkColor(_acColor[ucBackColor]);
- GUI_Clear();
- }
-
- /*****************************************************************
- ** FunctionName:void InitDialog(WM_MESSAGE * pMsg)
- ** Function: to initialize the Dialog items
- **
- ** call this function in _cbCallback --> WM_INIT_DIALOG
- *****************************************************************/
-
- void InitDialog(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = pMsg->hWin;
- //
- //FRAMEWIN
- //
- FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
- FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
- FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
- FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
- FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
- FRAMEWIN_SetTitleHeight(hWin,30);
-
- /* 默认颜色取*/
- ucBackColor = 0;
- }
-
- /*********************************************************************
- *
- * Dialog callback routine
- */
- static void _cbCallback(WM_MESSAGE * pMsg)
- {
- int NCode, Id;
- WM_HWIN hWin = pMsg->hWin;
- switch (pMsg->MsgId)
- {
-
- case WM_UPDATE: (2)
- ucBackColor++;
- if (ucBackColor == 3)
- {
- ucBackColor = 0;
- }
- WM_InvalidateWindow(hWin);
- break;
- case WM_MOUSEOVER:
- break;
- case WM_PAINT:
- PaintDialog(pMsg);
- break;
- case WM_INIT_DIALOG:
- InitDialog(pMsg);
- break;
- case WM_KEY:
- switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
- {
- case GUI_KEY_ESCAPE:
- GUI_EndDialog(hWin, 1);
- break;
- case GUI_KEY_ENTER:
- GUI_EndDialog(hWin, 0);
- break;
- }
- break;
- case WM_NOTIFY_PARENT:
- Id = WM_GetId(pMsg->hWinSrc);
- NCode = pMsg->Data.v;
- switch (Id)
- {
- case GUI_ID_OK:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
- case GUI_ID_CANCEL:
- if(NCode==WM_NOTIFICATION_RELEASED)
- GUI_EndDialog(hWin, 0);
- break;
- case GUI_ID_BUTTON0:
- switch(NCode)
- {
- case WM_NOTIFICATION_CLICKED:
- ucBackColor++;
- if (ucBackColor == 3)
- {
- ucBackColor = 0;
- }
- WM_InvalidateWindow(hWin);
- break;
- case WM_NOTIFICATION_RELEASED:
-
- break;
- case WM_NOTIFICATION_MOVED_OUT:
-
- break;
- }
- break;
- case GUI_ID_BUTTON1:
- switch(NCode)
- {
- case WM_NOTIFICATION_CLICKED:
- ucBackColor--;
- if (ucBackColor < 0)
- {
- ucBackColor = 2;
- }
- WM_InvalidateWindow(hWin);
- break;
- case WM_NOTIFICATION_RELEASED:
-
- break;
- case WM_NOTIFICATION_MOVED_OUT:
-
- break;
- }
- break;
-
- }
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
-
- /*********************************************************************
- *
- * MainTask
- *
- **********************************************************************
- */
- void MainTask(void)
- {
- WM_HWIN hDlg;
-
- GUI_Init();
- WM_SetDesktopColor(GUI_BLUE); /* Automacally update desktop window */
- WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */
- PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
- FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
- PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
- BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
- CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
- DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
- SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
- SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
- HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
- RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
- /* 创建一个对话框 */
- hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
- while (1)
- {
- WM_SendMessageNoPara(WM_GetClientWindow(hDlg), WM_UPDATE); (3)
- GUI_Delay(500);
- }
-
- }
复制代码1. 定义一个用户消息WM_UPDATE。一定要以WM_USER作为起始值,防止跟系统其他的数值冲突。 2. 在回调函数中加入咱们定义的消息WM_UPDATE,实现对话框中背景的更新功能。 3. 通过函数WM_SendMessageNoPara()每隔500ms给对话框发送消息。这里要特别的注意一点,这个函数是给窗口发送消息的,而咱们前面创建的是对话框,所以这里必须得通过函数WM_GetClientWindow得到窗口的句柄。 这个程序的显示效果如下:
|