• [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 }
  • 相关阅读:
    EMQ 映云科技为抗疫项目提供全托管 MQTT 云服务免费使用
    使用阿里云云连接器 cciot 连接到 EMQX Cloud
    EMQX Cloud 更新:更易用的规则引擎,三步轻松实现数据处理转存
    连续包年简化采购流程,订单体系实现清晰财务管理|EMQX Cloud 更新
    20192417张家华 202120222 《网络与系统攻防技术》实验二实验报告
    20192417 202120222 《网络与系统攻防技术》实验三实验报告
    20192417张家华 202120222 《网络与系统攻防技术》实验一实验报告
    Latex 伪代码手动缩进
    【转】多线程与指令重排概念辨析
    【转】浅析分布式系统 | 腾讯WeTest
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3933106.html
Copyright © 2020-2023  润新知