[ucgui] 对话框5——鼠标位置和移动窗口

简介:


 

 

>_<" 这节主要是获取鼠标的位置和把窗口设置为可以移动。其中设置窗口可以移动用FRAMEWIN_SetMoveable(hFrameWin, 1)就行了。而获得鼠标位置则是利用WM_TOUCH消息的state结构体所传送过来的位置信息(见56、57两行)

复制代码
  1 #define FACTOR   5
  2 #define EYE_X1  18
  3 #define EYE_X2  54
  4 #define EYE_Y   26
  5 #define EYE_RX  16
  6 #define EYE_RY  24
  7 #define MIN_VISIBILITY 50          /* Make sure at least this many pixels stay visible when moved */
  8 
  9 static int _Min(int a, int b) {
 10   return (a < b) ? a : b;
 11 }
 12 //画眼睛的函数
 13 static void _DrawEye(int x0, int y0, int rx, int ry, int x1, int y1) {
 14   int dx, dy, x, y;
 15   float Hyp;
 16   GUI_SetColor(GUI_WHITE);
 17   GUI_FillEllipse(x0, y0, rx, ry);
 18   GUI_SetColor(GUI_BLACK);
 19   GUI_DrawEllipse(x0, y0, rx, ry);
 20   /* Calculate the coordinates */
 21   dx  = x1 - x0 + 1;
 22   dy  = y1 - y0 + 1;
 23   Hyp = sqrt(dx * dx + dy * dy);
 24   x   = (dx * _Min(rx - 5, abs(dx)) * FACTOR / Hyp) + x0 * FACTOR;
 25   y   = (dy * _Min(ry - 5, abs(dy)) * FACTOR / Hyp) + y0 * FACTOR;
 26   /* Draw the pupil */
 27   GUI_AA_SetFactor(FACTOR);
 28   GUI_AA_EnableHiRes();
 29   GUI_SetColor(0xD00000);
 30   GUI_AA_FillCircle(x, y, 5.75 * FACTOR);
 31   GUI_SetColor(GUI_BLACK);
 32   GUI_AA_FillCircle(x, y, 3.75 * FACTOR);
 33   GUI_SetColor(GUI_GRAY);
 34   GUI_AA_FillCircle(x - 1.25 * FACTOR, y - 1.25 * FACTOR, 1.25 * FACTOR);
 35   GUI_AA_DisableHiRes();
 36 }
 37 //窗口消息回调函数
 38 static void _cbTransWindow(WM_MESSAGE* pMsg) {
 39   WM_HWIN hWin = pMsg->hWin;
 40   GUI_PID_STATE State;
 41   GUI_PID_GetState(&State);
 42   switch (pMsg->MsgId) {
 43   case WM_PAINT:
 44     State.x -= WM_GetWindowOrgX(hWin);//分别返回指定窗口的原点在桌面坐标中的X或Y位置
 45     State.y -= WM_GetWindowOrgY(hWin);
 46     _DrawEye(EYE_X1, EYE_Y, EYE_RX, EYE_RY, State.x, State.y);
 47     _DrawEye(EYE_X2, EYE_Y, EYE_RX, EYE_RY, State.x, State.y);
 48     break;
 49   case WM_TOUCH:
 50     if (pMsg->Data.p) {
 51       GUI_PID_STATE* pState = (GUI_PID_STATE*)pMsg->Data.p;
 52       if (pState->Pressed) {
 53         int mx, my, x;
 54         I32 Sum, SumY;
 55         I32 OutConst = EYE_RX * EYE_RX * EYE_RY * EYE_RY + (EYE_RX * EYE_RX * EYE_RY >> 1);
 56         mx = pState->x;
 57         my = (pState->y < EYE_Y) ? (EYE_Y - pState->y) : (pState->y - EYE_Y);
 58         if (my >= 0 && my <= EYE_RY) {
 59           int y;
 60           x = EYE_RX;
 61           for (y = 0; y <= my; y++) {
 62             SumY =((I32)(EYE_RX * EYE_RX)) * ((I32)(y * y));
 63             while (Sum = SumY + ((I32)(EYE_RY * EYE_RY)) * ((I32)(x * x)), (x > 0) && (Sum > OutConst)) {
 64               x--;
 65             }
 66           }
 67         } else {
 68           x = -EYE_RX;
 69         }
 70         if (((mx >= EYE_X1 - x) && (mx <= EYE_X1 + x)) || 
 71             ((mx >= EYE_X2 - x) && (mx <= EYE_X2 + x)) || WM_HasCaptured(hWin))
 72         {
 73           WM_SetCaptureMove(hWin, pState, MIN_VISIBILITY);
 74         } else {
 75           /* Transfer the message to the underlying window, since the transparent area has been clicked. */
 76           WM_HWIN hBelow = WM_Screen2hWinEx(hWin, State.x, State.y);
 77           if (hBelow) {
 78             pState->x = State.x - WM_GetWindowOrgX(hBelow);
 79             pState->y = State.y - WM_GetWindowOrgY(hBelow);
 80             WM_SendMessage(hBelow, pMsg);
 81           }
 82         }
 83       }
 84     }
 85     break;
 86   default:
 87     WM_DefaultProc(pMsg);
 88   }
 89 }
 90 //界面创建函数
 91 static void _DemoTransWindow(void) {
 92   WM_HWIN hTransWin, hFrameWin;
 93   WM_SetCreateFlags(WM_CF_MEMDEV);
 94   WM_EnableMemdev(WM_HBKWIN);
 95   WM_SetDesktopColor(GUI_RED);
 96   hTransWin = WM_CreateWindow(10,  10, 72, 52, WM_CF_SHOW | WM_CF_HASTRANS | WM_CF_STAYONTOP,
 97                               &_cbTransWindow, 0);
 98   hFrameWin = FRAMEWIN_Create("Framewin", 0, WM_CF_SHOW, 100, 70, 120, 100);    //创建一个FRAMEWIN小工具。(弃用)
 99   FRAMEWIN_SetActive(hFrameWin, 1);                                                //设置框架窗口的状态。(弃用)                                            
100   FRAMEWIN_SetMoveable(hFrameWin, 1);                                            //窗口可移动函数
101   GUI_CURSOR_Show();
102   while (1) {
103     WM_InvalidateWindow(hTransWin);                                                //使窗口无效。
104     GUI_Delay(20);
105   }
106 }
107 //主函数
108 void MainTask_eye(void) {
109   GUI_Init();
110   _DemoTransWindow();
111 }
复制代码
相关文章
|
Kubernetes 网络协议 Linux
Softether VPN 打通 Kubernetes 调试网络
通过 Softether VPN 打通 Kubernetes 调试网络,其中包括无拆分隧道限制的版本,可以自定义推送路由
2422 2
|
11月前
|
编解码
Jetson 学习笔记(十四):降低远程操控延时-修改屏幕分辨率
这篇文章是关于如何通过修改屏幕分辨率来降低Jetson Nano在远程操控时的延时。
378 3
Jetson 学习笔记(十四):降低远程操控延时-修改屏幕分辨率
|
11月前
|
前端开发 JavaScript
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
209 4
|
11月前
|
API 数据安全/隐私保护 UED
文档智能(Document Intelligence)与检索增强生成(Retrieval-Augmented Generation, RAG)
文档智能(Document Intelligence)与检索增强生成(Retrieval-Augmented Generation, RAG)
264 1
|
12月前
|
运维 Cloud Native Devops
云原生技术的创新与挑战
本文将深入探讨云原生技术,分析其创新之处以及面临的主要挑战。我们将从云原生的基本概念入手,逐步解析其核心技术如容器化、微服务架构及DevOps实践,同时结合具体案例,展示这些技术如何在实际应用中发挥作用。最后,文章将讨论云原生技术在未来发展中的潜力和可能遇到的难题,为读者提供一个全面而清晰的理解框架。
|
12月前
|
存储 SQL NoSQL
NoSQL数据库
NoSQL数据库
363 4
|
机器学习/深度学习 人工智能 自然语言处理
【AI Business Model】人工智能的定义 | 了解 AI 的历史 | 简单理解什么是 “图灵测试“
【AI Business Model】人工智能的定义 | 了解 AI 的历史 | 简单理解什么是 “图灵测试“
438 1
|
开发框架 前端开发 JavaScript
跨平台应用开发技术的深度探讨
【7月更文挑战第26天】 跨平台应用开发技术已成为当前软件开发领域的重要趋势。通过合理使用跨平台开发框架和工具,开发者可以更加高效地构建适用于多个平台的应用程序,提高开发效率和用户体验。然而,跨平台开发也面临着性能优化、兼容性问题等挑战,需要开发者不断学习和实践,以应对不断变化的市场需求和技术挑战。
|
安全 关系型数据库 API
Nuxt3 实战 (九):使用 Supabase 实现 Github 认证鉴权
这篇文章介绍了如何在Supabase中使用Github授权登录并实现用户身份验证。文章首先说明了Supabase采用postgresql的Row Level Security(RLS)机制来控制不同用户对数据表访问权限的重要性,然后详细介绍了配置Github OAuth Apps的过程,包括创建新的OAuth应用、填写项目信息、设置回调URL等步骤。接着,文章展示了在Nuxt3中实现登录界面的代码示例,最后总结了通过本教程可以学习到的技能,并预告了下一篇文章将介绍如何在Nuxt3中创建RESTful风格API并结合Supabase数据库完成CURD操作。
294 0
Nuxt3 实战 (九):使用 Supabase 实现 Github 认证鉴权
|
数据可视化 数据挖掘 Python
绘制箱线图 与 异常值的输出 - 基于Python matplotlib库
绘制箱线图 与 异常值的输出 - 基于Python matplotlib库
1511 0
绘制箱线图 与 异常值的输出 - 基于Python matplotlib库