zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    第三章:模板扩展
    第二章:表单和模板
    第一章:引言
    ZABBIX 调用PYTHON脚本监控 磁盘剩余空间(创建模版,创建监控项,创建触发器)
    访问虚拟机中的架设的Web服务器
    服务器上的 Git
    windows命令
    POPTEST联合创始人李爱然的“IT培训创业的随想"
    老李分享:大数据性能调优案例
    老李思考:看夏洛特烦恼有感
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3933410.html
Copyright © 2011-2022 走看看