UGL之first window

2021-11-04 10:29:06 浏览数 (3)

欢迎关注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年

一起学习 共同进步

1 人点赞