⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winball.c

📁 vxworks下windml的一些demo程序
💻 C
字号:
#include <ugl/uglWin.h>              /* This structure is used to store data used by the bouncing ball window */               typedef struct ball_win_data    {    UGL_TASK_ID     taskId;    WIN_ID          winId;    UGL_BITMAP_ID   ballBitmapId;    UGL_POINT       ballPosition;    UGL_VECTOR      ballSpeed;    } BALL_WIN_DATA;/* forward declaration of callbacks */UGL_LOCAL UGL_STATUS cbAppCreate (WIN_APP_ID appId, WIN_MSG * pMsg,                                  void * pData, void * pParam);UGL_LOCAL UGL_STATUS cbWinDraw (WIN_ID winId, WIN_MSG * pMsg,                                BALL_WIN_DATA * pData, void * pParam);UGL_LOCAL UGL_STATUS cbWinManage (WIN_ID winId, WIN_MSG * pMsg,                                  BALL_WIN_DATA * pData, void * pParam);UGL_LOCAL UGL_STATUS cbWinUnmanage (WIN_ID winId, WIN_MSG * pMsg,                                    BALL_WIN_DATA * pData, void * pParam);UGL_LOCAL UGL_STATUS cbWinDestroy (WIN_ID winId, WIN_MSG * pMsg,                                   BALL_WIN_DATA * pData, void * pParam);/*  Callbacks used by the ball application  */WIN_APP_CB_ITEM ballAppCallbacks [] =    {    { MSG_APP_CREATE,   0,    cbAppCreate,              UGL_NULL },    { 0,                0,    UGL_NULL,                 UGL_NULL }    };/*  Callbacks used by the ball window */WIN_CB_ITEM ballWinCallbacks [] =    {    { MSG_DRAW,          0,  (WIN_CB *)cbWinDraw,      UGL_NULL },    { MSG_MANAGE,        0,  (WIN_CB *)cbWinManage,    UGL_NULL },    { MSG_UNMANAGE,      0,  (WIN_CB *)cbWinUnmanage,  UGL_NULL },    { MSG_DESTROY,       0,  (WIN_CB *)cbWinDestroy,   UGL_NULL },    { 0,                 0,  UGL_NULL,                 UGL_NULL }    };/**************************************************************************** winBall - run the bouncing ball example** This routine starts the bouncing ball example by creating its* application context.**/    void winBall (void)    {    /* create the bouncing ball application context */    winAppCreate ("winBall", 0, 0, 0, ballAppCallbacks);    }/**************************************************************************** ballMoveTask - make the bouncing ball bounce** This routine runs in its own task and continually moves the bouncing ball.**/void ballMoveTask (BALL_WIN_DATA * pData)    {    WIN_ID winId = pData->winId;    pData->taskId = uglOSGetTaskIdSelf ();    /* window ends task by setting pData->winId to NULL */    while (pData->winId != UGL_NULL_ID)        {        UGL_RECT winRect;        UGL_RECT ballRect;        /* get the window rectangle */        winDrawRectGet (winId, &winRect);        /* save old ball position */        ballRect.left = pData->ballPosition.x;        ballRect.right = pData->ballPosition.x + 31;        ballRect.top = pData->ballPosition.y;        ballRect.bottom = pData->ballPosition.y + 31;        /* move the ball */        pData->ballPosition.x += pData->ballSpeed.x;        pData->ballPosition.y += pData->ballSpeed.y;        /* test for bounce (direction change) */        if (pData->ballPosition.x < winRect.left)            {            pData->ballPosition.x = winRect.left;            pData->ballSpeed.x *= -1;            }        else if (pData->ballPosition.x > winRect.right - 31)            {            pData->ballPosition.x = winRect.right - 31;            pData->ballSpeed.x *= -1;            }        if (pData->ballPosition.y < winRect.top)            {            pData->ballPosition.y = winRect.top;            pData->ballSpeed.y *= -1;            }        else if (pData->ballPosition.y > winRect.bottom - 31)            {            pData->ballPosition.y = winRect.bottom - 31;            pData->ballSpeed.y *= -1;            }        /* ----- invalidate the window to cause ball to redraw ----- */        /* lock window so it won't redraw until invalidation is complete */        winLock (winId);        /* invalidate the old ball position */        winRectInvalidate (winId, &ballRect);        /* invalidate the new ball position */        ballRect.left = pData->ballPosition.x;        ballRect.right = pData->ballPosition.x + 31;        ballRect.top = pData->ballPosition.y;        ballRect.bottom = pData->ballPosition.y + 31;        winRectInvalidate (winId, &ballRect);        /* unlock the window */        winUnlock (winId);        /* wait a clock tick */        uglOSTaskDelay (1);        }    /* signal that task is finished and window can be destroyed */    pData->taskId = UGL_NULL_ID;    }/***************************************************************************** cbAppCreate - initialize the application** This callback routine initializes the bouncing ball application by creating* the bouncing ball window and attaching it to the default display.**/UGL_LOCAL UGL_STATUS cbAppCreate    (    WIN_APP_ID      appId,      /* application ID */                                    WIN_MSG *       pMsg,       /* message */                                        void *          pData,      /* message queue associated with application */                   void *          pParam      /* parameter passed to winAppCbAdd() */      )    {    WIN_ID winId;    /* create the bouncing ball window */    winId = winCreate (appId, UGL_NULL, WIN_ATTRIB_FRAMED | WIN_ATTRIB_VISIBLE,                        50, 50, 150, 200, UGL_NULL, sizeof (BALL_WIN_DATA),                        ballWinCallbacks);/* !!! should use attribute !!! */    winDrawModeSet (winId, WIN_DRAW_MODE_OFF_SCREEN, UGL_NULL);    winAttach (winId, UGL_NULL_ID, UGL_NULL_ID);    return (UGL_STATUS_OK);    }/***************************************************************************** cbWinDraw - draw the ball window** This callback routine draws the ball window in response to MSG_DRAW * messages.  (MSG_DRAW messages are sent when the window is exposed or otherwise* invalidated.)**/UGL_LOCAL UGL_STATUS cbWinDraw    (    WIN_ID          winId,          /* window ID */                                    WIN_MSG *     pMsg,         /* message */                                        BALL_WIN_DATA * pData,          /* data passed to winCreate() */                   void *          pParam          /* parameter to winAppCbAdd() */      )    {    /* draw the background */    uglLineWidthSet (pMsg->data.draw.gcId, 0);    uglBackgroundColorSet (pMsg->data.draw.gcId, WIN_GREEN);    uglRectangle (pMsg->data.draw.gcId,                   pMsg->data.draw.rect.left,                   pMsg->data.draw.rect.top,                   pMsg->data.draw.rect.right,                   pMsg->data.draw.rect.bottom);    /* draw the ball */    uglBitmapBlt (pMsg->data.draw.gcId, pData->ballBitmapId, 0, 0, 31, 31,                   UGL_DEFAULT_ID, pData->ballPosition.x,                  pData->ballPosition.y);    return (UGL_STATUS_FINISHED);    }/***************************************************************************** cbWinManage - create resources used by bouncing ball window** This callback routine creates the resources (ball bitmap) used by the * bouncing ball window.  By waiting for the MSG_MANAGE message, the window * knows its associated display.  (MSG_MANAGE is sent when a window is * attached to a display.)**/UGL_LOCAL UGL_STATUS cbWinManage    (    WIN_ID              winId,      /* window ID */                                    WIN_MSG *         pMsg,     /* message */                                        BALL_WIN_DATA *     pData,      /* data associated with window */                   void *              pParam      /* parameter assicuated with callback */      )    {    UGL_DEVICE_ID   displayId;    UGL_GC_ID       gcId;    UGL_DIB         ballDib;    /* get display associated with window */    displayId = winDisplayGet (winId);    /* create the ball bitmap */    ballDib.width = 32;    ballDib.height = 32;    pData->ballBitmapId = uglBitmapCreate (displayId, &ballDib,                                            UGL_DIB_INIT_NONE, 0, UGL_NULL);    /* draw a ball in the ballBitmap */    gcId = uglGcCreate (displayId);    uglDefaultBitmapSet (gcId, pData->ballBitmapId);    uglLineWidthSet (gcId, 0);    uglBackgroundColorSet (gcId, WIN_GREEN);    uglRectangle (gcId, 0, 0, 31, 31);    uglLineWidthSet (gcId, 1);    uglForegroundColorSet (gcId, WIN_BLACK);    uglBackgroundColorSet (gcId, WIN_YELLOW);    uglEllipse (gcId, 0, 0, 31, 31, 0, 0, 0, 0);    uglGcDestroy (gcId);    /* initialize ball window data */    pData->winId = winId;    pData->ballPosition.x = 0;    pData->ballPosition.y = 0;    pData->ballSpeed.x = 3;    pData->ballSpeed.y = 3;    /* start task to move bouncing ball */    uglOSTaskCreate ("tBallMove", (UGL_FPTR)ballMoveTask, 250, 0, 0x1000,                     (int)pData, 0, 0, 0, 0);    return (UGL_STATUS_OK);    }/***************************************************************************** cbWinUnmanage - free resources used by bouncing ball window** This callback routine frees the resources (ball bitmap) used by the * bouncing ball window.**/UGL_LOCAL UGL_STATUS cbWinUnmanage    (    WIN_ID              winId,      /* window ID */                                    WIN_MSG *           pMsg,       /* message */                                        BALL_WIN_DATA *     pData,      /* data associated with window */                   void *              pParam      /* parameter assicuated with callback */      )    {    /* signal ball move task to exit */    pData->winId = UGL_NULL_ID;    /* clean up */    uglBitmapDestroy (winDisplayGet (winId), pData->ballBitmapId);    return (UGL_STATUS_OK);    }/***************************************************************************** cbWinUnmanage - free resources used by bouncing ball window** This callback routine frees the resources (ball bitmap) used by the * bouncing ball window.**/UGL_LOCAL UGL_STATUS cbWinDestroy    (    WIN_ID              winId,      /* window ID */                                    WIN_MSG *           pMsg,       /* message */                                        BALL_WIN_DATA *     pData,      /* data associated with window */                   void *              pParam      /* parameter assicuated with callback */      )    {    /* wait for ball move task to exit */    while (pData->taskId != UGL_NULL_ID)        uglOSTaskDelay (100);    return (UGL_STATUS_OK);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -