[ucgui] 对话框4——模式消息窗口
>_<" 这里实现点击灰色窗口的按钮出现一个模式消息窗口,点击OK之后才能再聚焦到灰窗口;点击灰窗口除了按钮的地方,弹出一个非模式窗口。
1 static const GUI_WIDGET_CREATE_INFO _aDialogOrder[] = {//大的一个窗口(刚开始显示的,有一个按钮) 2 { FRAMEWIN_CreateIndirect, "Order vehicle", 0, 20, 50, 480, 360, 0 }, 3 { BUTTON_CreateIndirect, "Select vehicle", GUI_ID_BUTTON0, 6, 113, 100, 20, 0 }, 4 }; 5 6 static void _cbDialogOrder(WM_MESSAGE* pMsg) {//消息窗口回调函数 7 WM_HWIN hDlg, hWin = pMsg->hWin; 8 GUI_PID_STATE* State; 9 10 switch (pMsg->MsgId) { 11 case WM_INIT_DIALOG: 12 break; 13 case WM_NOTIFY_PARENT: 14 if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {//此通知消息将在被点击的小工具已被释放时发送 15 int Id = WM_GetId(pMsg->hWinSrc); 16 switch (Id) { 17 case GUI_ID_BUTTON0: 18 //调用函数生成MessageBox,可以通过拖动标题栏或窗口框来移动消息框 19 hDlg = MESSAGEBOX_Create(" Computer Win!!! ", "Failed", GUI_MESSAGEBOX_CF_MOVEABLE); 20 //控制窗口聚焦直至窗口结束的相关设置[如果去掉就无法实现模式窗口的效果 21 WM_MakeModal(hDlg); /*此函数使窗口在“模态”模式下作业。这意味着指针设备输入将仅发送到“模态”窗口, 22 或者如果输入位置在模态窗口的矩形内则仅发送到其子窗口。*/ 23 WM_SetFocus(hDlg); //将输入焦点设置到指定窗口 24 WM_InvalidateWindow(hDlg);//使窗口无效 25 break; 26 } 27 } 28 break; 29 case WM_TOUCH: 30 State = (GUI_PID_STATE*) pMsg->Data.p; 31 if(State && !State->Pressed) 32 { 33 { 34 hDlg = MESSAGEBOX_Create(" You Win!!! ", "Win", GUI_MESSAGEBOX_CF_MOVEABLE); 35 //这里把控制模式窗口的注释掉,点击其他区域建立一个非模式窗口 36 //WM_MakeModal(hDlg); 37 //WM_SetFocus(hDlg); 38 //WM_InvalidateWindow(hDlg); 39 break; 40 } 41 } 42 default: 43 WM_DefaultProc(pMsg); 44 } 45 } 46 47 static void _cbBkWindow(WM_MESSAGE* pMsg) {//背景窗口回调函数 48 switch (pMsg->MsgId) { 49 case WM_PAINT: 50 GUI_SetBkColor(0x008000); 51 GUI_SetColor(GUI_WHITE); 52 GUI_SetFont(&GUI_Font24_ASCII); 53 GUI_Clear(); 54 GUI_DispStringHCenterAt("DIALOG_NestedModal - Sample", 160, 10); 55 default: 56 WM_DefaultProc(pMsg); 57 } 58 } 59 60 void Fun(void) { 61 WM_HWIN hWin; //句柄 62 GUI_Init(); //初始化 63 GUI_CURSOR_Show(); //鼠标指针显示 64 /* 65 窗口管理器的默认特性是向每个需要重绘的窗口发送一条WM_PAINT。这会导致闪变效应。为抑制这些 66 每个窗口的闪变效应,可为重绘操作自动使用存储设备。方法为,在创建窗口时设置标记WM_CF_MEMDEV、 67 使用函数WM_SetCreateFlags()设置默认创建标记,或使用函数WM_EnableMemdev()。WM然后 68 会将WM_PAINT消息输出重定向到存储设备中,再复制到显示器中。如果整个窗口的内存不够,会自动 69 使用分段。存储设备只是临时使用,在绘制操作完成后会移除。 70 */ 71 WM_SetCreateFlags(WM_CF_MEMDEV); //设置在创建新窗口时用作默认的标记 72 WM_EnableMemdev(WM_HBKWIN); //启用使用存储设备来重绘窗口 73 WM_SetCallback(WM_HBKWIN, &_cbBkWindow); //设置窗口的回调例程,然后调用WM_PAINT消息初始化背景 74 //创建非阻塞式对话框 75 hWin = GUI_CreateDialogBox(_aDialogOrder, GUI_COUNTOF(_aDialogOrder), &_cbDialogOrder, WM_HBKWIN, 0, 0); 76 while (1){ 77 if (!GUI_Exec()){ 78 GUI_X_WAIT_EVENT(); /* Wait for event (keyboard, mouse or whatever) */ 79 } 80 } 81 }