OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9940|回复: 11

WM_MakeModal(hWin);这句话到底什么意思呢?

[复制链接]

32

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2013-10-25
在线时间
3 小时
发表于 2014-6-25 17:00:57 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]/* ********************************************************************************************************* * uC/GUI V3.98 * Universal graphic software for embedded applications * * (c) Copyright 2002, Micrium Inc., Weston, FL * (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH * * 礐/GUI 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 redistributed * in any way. We appreciate your understanding and fairness. * ---------------------------------------------------------------------- File : DIALOG_NestedModal.c Purpose : Creates a nested modal dialog after pressing a button ---------------------------END-OF-HEADER------------------------------ */ #include <stdlib.h> #include <string.h> #include "GUI.h" #include "DIALOG.h" #include "LISTVIEW.h" #include "MESSAGEBOX.h" /********************************************************************* * * static data * ********************************************************************** */ static char _acVehicle[40]; static const char _acItems[][2][20] = { {"AUDI", "A6" }, {"AUDI", "A8" }, {"AUDI", "Quattro" }, {"AUDI", "TT" }, {"BMW", "325xi" }, {"BMW", "330i" }, {"BMW", "745i" }, {"BMW", "Mini Cooper" }, {"CHEVROLET", "Cavalier LS Sport"}, {"CHEVROLET", "Corvette Z06" }, {"CHEVROLET", "Malibu LS" }, {"FERRARI", "575M" }, {"FORD", "Escort" }, {"FORD", "Focus" }, {"HYUNDAI", "Sonata" }, {"HYUNDAI", "XG350" }, {"JAGUAR", "VDP" }, {"JAGUAR", "S-Type" }, {"MAZDA", "MX-5" }, {"MERCEDES", "S" }, {"MERCEDES", "CL" }, {"PORSCHE", "Boxster" }, {"", "" } }; /********************************************************************* * * Dialog resource * ********************************************************************** */ static const GUI_WIDGET_CREATE_INFO _aDialogOrder[] = { { FRAMEWIN_CreateIndirect, "Order vehicle", 0, 20, 50, 280, 160, 0 }, { TEXT_CreateIndirect, "Selection", 0, 37, 13, 80, 20, 0 }, { TEXT_CreateIndirect, "Drive", 0, 10, 35, 80, 20, 0 }, { TEXT_CreateIndirect, "Front", 0, 30, 51, 80, 20, 0 }, { TEXT_CreateIndirect, "Rear", 0, 30, 66, 80, 20, 0 }, { TEXT_CreateIndirect, "Both", 0, 30, 81, 80, 20, 0 }, { TEXT_CreateIndirect, "Color", 0, 108, 47, 80, 20, 0 }, { TEXT_CreateIndirect, "Options", 0, 95, 77, 80, 20, 0 }, { EDIT_CreateIndirect, NULL, GUI_ID_EDIT0, 85, 10, 180, 20, 0, 40}, { RADIO_CreateIndirect, NULL, GUI_ID_RADIO0, 10, 50, 0, 0, 0, 0xF03 }, { DROPDOWN_CreateIndirect, NULL, GUI_ID_DROPDOWN0, 135, 45, 130, 45, 0 }, { DROPDOWN_CreateIndirect, NULL, GUI_ID_DROPDOWN1, 135, 75, 130, 45, 0 }, { BUTTON_CreateIndirect, "Select vehicle", GUI_ID_BUTTON0, 6, 113, 100, 20, 0 }, { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 160, 113, 50, 20, 0 }, { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 217, 113, 50, 20, 0 } }; static const GUI_WIDGET_CREATE_INFO _aDialogSelect[] = { { FRAMEWIN_CreateIndirect, "Select vehicle", 0, 55, 30, 210, 200, 0 }, { TEXT_CreateIndirect, "Available vehicles:", 0, 9, 6, 120, 20, 0 }, { LISTVIEW_CreateIndirect, NULL, GUI_ID_LISTVIEW0, 7, 20, 190, 120, 0 }, { BUTTON_CreateIndirect, "OK", GUI_ID_OK, 90, 153, 50, 20, 0 }, { BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 147, 153, 50, 20, 0 } }; /********************************************************************* * * static code * ********************************************************************** */ /********************************************************************* * * _AddListviewItem */ static void _AddListviewItem(LISTVIEW_Handle hObj, const char* pMake, const char* pModel) { unsigned NumItems; NumItems = LISTVIEW_GetNumRows(hObj); LISTVIEW_AddRow(hObj, NULL); LISTVIEW_SetItemText(hObj, 0, NumItems, pMake); LISTVIEW_SetItemText(hObj, 1, NumItems, pModel); } /********************************************************************* * * _InitDialogSelect */ static void _InitDialogSelect(WM_HWIN hWin) { WM_HWIN hItem; int i = 0; /* Init framewindow */ FRAMEWIN_SetFont(hWin, &GUI_Font10_ASCII); FRAMEWIN_SetTitleHeight(hWin, 14); FRAMEWIN_SetMoveable(hWin, 1); /* Init listbox items */ hItem = WM_GetDialogItem(hWin, GUI_ID_LISTVIEW0); WM_SetScrollbarV(hItem, 1); LISTVIEW_SetGridVis(hItem, 1); LISTVIEW_SetLBorder(hItem, 3); LISTVIEW_SetRBorder(hItem, 3); LISTVIEW_AddColumn(hItem, 80, "Make", GUI_TA_LEFT); LISTVIEW_AddColumn(hItem, 100, "Options", GUI_TA_LEFT); while (_acItems[0][0]) { _AddListviewItem(hItem, _acItems[0], _acItems[1]); i++; } } /********************************************************************* * * _InitDialogOrder */ static void _InitDialogOrder(WM_HWIN hWin) { WM_HWIN hItem; /* Init framewindow */ FRAMEWIN_SetFont(hWin, &GUI_Font10_ASCII); FRAMEWIN_SetTitleHeight(hWin, 14); FRAMEWIN_SetMoveable(hWin, 1); /* Init edit widget */ hItem = WM_GetDialogItem(hWin, GUI_ID_EDIT0); WM_DisableWindow(hItem); /* Init dropdown box color */ hItem = WM_GetDialogItem(hWin, GUI_ID_DROPDOWN0); DROPDOWN_AddString(hItem, "Blue"); DROPDOWN_AddString(hItem, "Green"); DROPDOWN_AddString(hItem, "Red"); DROPDOWN_SetBkColor(hItem, 1, GUI_WHITE); DROPDOWN_SetTextColor(hItem, 1, GUI_BLACK); /* Init dropdown box model */ hItem = WM_GetDialogItem(hWin, GUI_ID_DROPDOWN1); DROPDOWN_AddString(hItem, "Navigation system"); DROPDOWN_AddString(hItem, "CD Player"); DROPDOWN_AddString(hItem, "Other ..."); DROPDOWN_SetBkColor(hItem, 1, GUI_WHITE); DROPDOWN_SetTextColor(hItem, 1, GUI_BLACK); } /********************************************************************* * * _GetVehicle */ static int _GetVehicle(WM_HWIN hWin) { WM_HWIN hItem; int CurSel, NumItems; hItem = WM_GetDialogItem(hWin, GUI_ID_LISTVIEW0); NumItems = LISTVIEW_GetNumRows(hItem); CurSel = LISTVIEW_GetSel(hItem); if ((CurSel >= 0) && (CurSel < NumItems)) { strcpy(_acVehicle, _acItems[CurSel][0]); strcat(_acVehicle, " "); strcat(_acVehicle, _acItems[CurSel][1]); hItem = WM_GetDialogItem(hWin, GUI_ID_EDIT0); EDIT_SetText(hItem, _acVehicle); return 1; } return 0; } /********************************************************************* * * _MessageBox */ static void _MessageBox(const char* pText, const char* pCaption) { WM_HWIN hWin; hWin = MESSAGEBOX_Create(pText, pCaption, 0); WM_MakeModal(hWin); GUI_ExecCreatedDialog(hWin); } /********************************************************************* * * _cbBkWindow */ static void _cbBkWindow(WM_MESSAGE* pMsg) { switch (pMsg->MsgId) { case WM_PAINT: GUI_SetBkColor(0x008000); GUI_SetColor(GUI_WHITE); GUI_SetFont(&GUI_Font24_ASCII); GUI_Clear(); GUI_DispStringHCenterAt("DIALOG_NestedModal - Sample", 160, 10); default: WM_DefaultProc(pMsg); } } /********************************************************************* * * _cbDialogSelect */ static void _cbDialogSelect(WM_MESSAGE* pMsg) { WM_HWIN hWin = pMsg->hWin; switch (pMsg->MsgId) { case WM_INIT_DIALOG: _InitDialogSelect(hWin); WM_SetFocus(WM_GetDialogItem(hWin, GUI_ID_OK)); break; case WM_NOTIFY_PARENT: if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) { int Id = WM_GetId(pMsg->hWinSrc); switch (Id) { case GUI_ID_OK: if (_GetVehicle(hWin) == 0) { _MessageBox("You have to select a vehicle!", "ERROR"); WM_MakeModal(hWin); WM_SetFocus(hWin); break; } case GUI_ID_CANCEL: GUI_EndDialog(pMsg->hWin, 0); break; } } break; default: WM_DefaultProc(pMsg); } } /********************************************************************* * * _cbDialogOrder */ static void _cbDialogOrder(WM_MESSAGE* pMsg) { WM_HWIN hDlg, hWin = pMsg->hWin; switch (pMsg->MsgId) { case WM_INIT_DIALOG: _InitDialogOrder(hWin); WM_SetFocus(WM_GetDialogItem(hWin, GUI_ID_OK)); break; case WM_NOTIFY_PARENT: if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) { int Id = WM_GetId(pMsg->hWinSrc); switch (Id) { case GUI_ID_BUTTON0: hDlg = GUI_CreateDialogBox(_aDialogSelect, GUI_COUNTOF(_aDialogSelect), &_cbDialogSelect, WM_HBKWIN, 0, 0); WM_MakeModal(hDlg); GUI_ExecCreatedDialog(hDlg); WM_MakeModal(hWin); WM_SetFocus(hWin); hDlg = WM_GetDialogItem(hWin, GUI_ID_EDIT0); EDIT_SetText(hDlg, _acVehicle); break; case GUI_ID_OK: case GUI_ID_CANCEL: GUI_EndDialog(hWin, 0); break; } } break; default: WM_DefaultProc(pMsg); } } /********************************************************************* * * MainTask * ********************************************************************** */ void MainTask(void); void MainTask(void) { WM_HWIN hWin; GUI_Init(); GUI_CURSOR_Show(); WM_SetCreateFlags(WM_CF_MEMDEV); WM_EnableMemdev(WM_HBKWIN); WM_SetCallback(WM_HBKWIN, &_cbBkWindow); while (1) { hWin = GUI_CreateDialogBox(_aDialogOrder, GUI_COUNTOF(_aDialogOrder), &_cbDialogOrder, WM_HBKWIN, 0, 0); WM_MakeModal(hWin); GUI_ExecCreatedDialog(hWin); GUI_Delay(1500); } } [/mw_shl_code]

这是一个官方的例程,里边用到了好几次 WM_MakeModal(hWin); 

这究竟是什么意思? 越来越糊涂了

最佳答案

查看完整内容[请看2#楼]

WM_GetDialogItem 返回对话框项目(小工具)的窗口句柄。 对话框的句柄
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2015-1-17
在线时间
0 小时
发表于 2014-6-25 17:00:58 | 显示全部楼层
WM_GetDialogItem 返回对话框项目(小工具)的窗口句柄。 对话框的句柄
回复

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-6-25 17:57:58 | 显示全部楼层
楼主可以注释掉 看有什么效果。 个人认为因为它用了阻塞式,所以加了个WM_MakeModal(hWin);
来进行包装 刷新WM_Exec()。。不知道是不是哈。等高手来拍砖。
不用谢了……
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-6-26 08:33:03 | 显示全部楼层
这个函数是刷新窗口的吧,看函数名好像是,跳转过去看下注释或者数据手册上面的介绍
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

32

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2013-10-25
在线时间
3 小时
 楼主| 发表于 2014-6-26 10:15:20 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
不是哦
WM_MakeModal()
Description
This function makes the window work in ?modal? mode. This means pointer device
input will only be send to the ?modal? window or a child window of it if the input position
is within the rectangle of the modal window.
手册上的解释
回复

使用道具 举报

32

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2013-10-25
在线时间
3 小时
 楼主| 发表于 2014-6-26 10:19:32 | 显示全部楼层
回复【2楼】eling13:
---------------------------------
266行不加的话,之前的窗口还是能操作的。
其它268 301行不加的话 好像没什么区别。
回复

使用道具 举报

32

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2013-10-25
在线时间
3 小时
 楼主| 发表于 2014-6-26 10:30:33 | 显示全部楼层
[mw_shl_code=c,true]
[mw_shl_code=c,true] case GUI_ID_BUTTON0: hDlg = GUI_CreateDialogBox(_aDialogSelect, GUI_COUNTOF(_aDialogSelect), &_cbDialogSelect, WM_HBKWIN, 0, 0); WM_MakeModal(hDlg); GUI_ExecCreatedDialog(hDlg); WM_MakeModal(hWin); WM_SetFocus(hWin); hDlg = WM_GetDialogItem(hWin, GUI_ID_EDIT0); EDIT_SetText(hDlg, _acVehicle); break;[/mw_shl_code] 尤其是这个,新建立了一个窗口,然后变成模态窗口和阻塞窗口,然后把原来的窗口再变成模态窗口(原来创建就用了WM_MakeModal 和GUI_ExecCreatedDialog)。
原来只能有一个模态窗口,新建立的窗口变成设置成模态之后,原来的窗口就不是了,新建的窗口关闭后重新把原来的窗口变成模态窗口。
[/mw_shl_code]

回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-6-26 10:31:09 | 显示全部楼层
回复【5楼】XavierZhang:
---------------------------------
这样啊,有空试试看
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-6-26 11:04:48 | 显示全部楼层
回复【6楼】XavierZhang:
---------------------------------
我试了一下 大致的意思是 新建一个对话框后 底下的窗口就不能点击到了,只有这个新建的对话框能接收消息。
看这一例程名字好像就叫嵌套模式,就是说可以在每个对话框上继续建立对话框,然后层层可以嵌套着创建下去。。
不用谢了……
回复

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-6-26 11:16:40 | 显示全部楼层
它的作用是 只把操作限制在了if the input position is within the rectangle of the modal window. 
点击其他窗口是没有作用的。
不用谢了……
回复

使用道具 举报

32

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2013-10-25
在线时间
3 小时
 楼主| 发表于 2014-6-26 13:01:26 | 显示全部楼层
回复【9楼】eling13:
---------------------------------
嗯,一个模态窗口关闭之后要重新设置一个模态窗口
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2015-1-17
在线时间
0 小时
发表于 2015-2-1 10:18:10 | 显示全部楼层
即分配给这个wedget的内存首地址。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表