欢迎关注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年
一起学习 共同进步