欢迎关注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里的这些元素。
接下来,就按照这个配置,写一个简单的例子
#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);
}
跑起来的效果如图
看看这仨函数都是干啥的
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。它的前几个入参用默认值就可以,最后一个是回调,暂时先不管
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支持的值大致有这些
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
UGL_STATUS winAttach
(
WIN_ID childId, /* child window */
WIN_ID parentId, /* parent window */
WIN_ID nextId /* window above in z-order */
);
下面进入第二个例子:试试winAppCreate()的回调
#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年
一起学习 共同进步