前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UGL之first window

UGL之first window

作者头像
Taishan3721
发布2021-11-04 10:29:06
3100
发布2021-11-04 10:29:06
举报
文章被收录于专栏:这里只有VxWorks

欢迎关注VxWorks567

如转发,请标明出处!

VxWorks的WindML3+除了支持最基本的2D图形绘制,还封装了三种控件:Window、Menu、Button。要想使用它们,需要在配置WindML时,包含Window Manager。本文以VxWorks69的WindML53为例

启动WindML提供的demo,例如(components/windml-5.3/samples/winDemo/windml/winHello.c)

对照着这个demo,看一下Window Manager里的这些元素。

  • Window Mgr - 默认使用"Standard Window Manager"。这样在build时,WindML就会包含一个Window Manager Engine - wwmEngine。因此,从技术角度来看,developer完全可以自定义一个Window Manager Engine
  • Active Color - 前台Window的边框颜色
  • Active Text Color - 前台Window的标题栏文本颜色
  • Inactive Color - 后台Window的边框颜色
  • Inactive Text Color - 后台Window的标题栏文本颜色
  • Enable Splash Screen - 使用"wwmRootImageDib"做为屏幕的Root Image,即白底红字的"WIND RIVER"位图;如果不包含这个option,则使用Root Color填充屏幕。因此,完全可以自定义一个位图来填充屏幕
  • Min Height - Window的最小高度
  • Min Width - Window的最小宽度
  • Enable Task Bar - 使能屏幕上方的任务栏和开始菜单"Menu"
  • Enable Window Captions - 使能Window的标题栏
  • Enable Window Frames - 绘制Window的边框
  • Border Width - Window边框的宽度

接下来,就按照这个配置,写一个简单的例子

代码语言:javascript
复制
#include <ugl/winMgr/wwm/wwm.h>

void testWin()
{
    /* create the application context */
    WIN_APP_ID appId = winAppCreate(UGL_NULL, 0, 0, 0, UGL_NULL);

    /* create the window */
    WIN_ID winId = winCreate(appId, UGL_NULL_ID, 
                             WIN_ATTRIB_FRAMED | WIN_ATTRIB_VISIBLE, 
                             10, 10, 200, 150, UGL_NULL, 0, UGL_NULL);

    /* attach the window to the default display */
    winAttach(winId, UGL_NULL_ID, UGL_NULL_ID);
    }

跑起来的效果如图

看看这仨函数都是干啥的

代码语言:javascript
复制
WIN_APP_ID winAppCreate 
    (
    char            *pName,          /* 标题栏名称, 默认值"winApp" */
    int              priority,       /* 服务任务的优先级, 默认值WIN_APP_DEF_PRIORITY(100) */
    int              stackSize,      /* 服务任务的栈尺寸, 默认值WIN_APP_DEF_STACK_SIZE(10000) */
    int              qSize,          /* 服务任务的消息队列长度, 默认值WIN_APP_DEF_QUEUE_SIZE(32) */
    WIN_APP_CB_ITEM *pCallbackArray  /* 回调队列 */
);

winAppCreate()用于创建一个application context,有点像2D绘图里的那个GC。它的前几个入参用默认值就可以,最后一个是回调,暂时先不管

代码语言:javascript
复制
WIN_ID winCreate
    (
    WIN_APP_ID   appId,          /* application context */
    WIN_CLASS_ID classId,        /* window class */
    UGL_UINT32   attributes,     /* 属性 */
    UGL_POS      x,              /* left coordinate of window */
    UGL_POS      y,              /* top coordinate of window */
    UGL_SIZE     width,          /* width of window */
    UGL_SIZE     height,         /* height of window */
    void        *pAppData,       /* application附带数据 */
    int          appDataSize,    /* 附带数据的长度 */
    WIN_CB_ITEM *pCallbackArray  /* 回调队列 */
);

然后在这个application context里,使用winCreate()创建一个classId类型的window。classId为空时,使用默认的"WIN_ROOT_CLASS"。而这个attributes支持的值大致有这些

代码语言:javascript
复制
WIN_ATTRIB_CLIP_CHILDREN    /* 不遮挡children, 默认设置此值 */
WIN_ATTRIB_VISIBLE          /* 可见 */
WIN_ATTRIB_FRAMED           /* 绘制边框。通过边框,可以执行移动、调整尺寸、全屏等操作 */
WIN_ATTRIB_DISABLED         /* disabled状态的window通常是灰色, 不接收输入 */
WIN_ATTRIB_NO_ACTIVATE      /* 永不会active, 例如任务栏 */
WIN_ATTRIB_NO_CLOSE         /* 没有close按钮 */
WIN_ATTRIB_NO_MAXIMIZE      /* 没有maximize按钮 */
WIN_ATTRIB_NO_MINIMIZE      /* 没有minimize按钮 */
WIN_ATTRIB_NO_MOVE          /* 不能移动 */
WIN_ATTRIB_NO_RESIZE        /* 不能改变尺寸 */
WIN_ATTRIB_TOPMOST          /* always on top */
WIN_ATTRIB_TRANSPARENT      /* window has transparency, or is not visually rectangular */
WIN_ATTRIB_OFF_SCREEN       /* 在后台绘制 */
WIN_ATTRIB_DOUBLE_BUFFER    /* 使用双缓 */
WIN_ATTRIB_DBL_CLICK        /* 支持鼠标双击, 双击间隔默认值500ms,可使用winPointerClickIntervalSet()调整 */
WIN_ATTRIB_TRI_CLICK        /* 支持鼠标三连击 */

一般都会使用(WIN_ATTRIB_FRAMED | WIN_ATTRIB_VISIBLE)

最后需要使用winAttach()将这个window挂接到display

代码语言:javascript
复制
UGL_STATUS winAttach
    (
    WIN_ID childId,      /* child window */
    WIN_ID parentId,     /* parent window */
    WIN_ID nextId        /* window above in z-order */
);

下面进入第二个例子:试试winAppCreate()的回调

代码语言:javascript
复制
#include <ugl/winMgr/wwm/wwm.h>

UGL_LOCAL UGL_STATUS cbAppCreate
    (
    WIN_APP_ID appId,      /* application context */                                
    WIN_MSG   *pMsg,       /* message */                                    
    void      *pAppData,   /* UGL_NULL */               
    void      *pParam      /* parameter from WIN_APP_CB_ITEM */  
    )
{
    /* create the window */
    WIN_ID winId = winCreate(appId, UGL_NULL,
                             WIN_ATTRIB_FRAMED | WIN_ATTRIB_VISIBLE, 
                             10, 10, 150, 200, UGL_NULL, 0, UGL_NULL);
    /* attach the window */
    winAttach(winId, UGL_NULL_ID, UGL_NULL_ID);
    return(UGL_STATUS_OK);
    }

WIN_APP_CB_ITEM appCallbacks[] =
    {
    {MSG_APP_CREATE, 0, cbAppCreate, UGL_NULL},
    {0,              0, UGL_NULL,    UGL_NULL}
    };

void testWin()
{
    /* create the application context */
    winAppCreate(UGL_NULL, 0, 0, 0, appCallbacks);
    }

winAppCreate()可以挂接多种回调,常用的就是MSG_APP_CREATE,application context创建之后会自动调用它。因此,就可以把创建window的操作,放入这个回调了。

下回试试winCreate()的回调

我是泰山 专注VX 17年

一起学习 共同进步

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档