uC/GUI NIOS II移植及应用笔记
2013-03-31
william7447
标签:

uC/GUI NIOS II移植之Window Manager(窗口管理器)

昨天太晚了没有时间更新了。今天继续。

今天来看看Window manager,窗口管理器。

先来看一个小例子。

#define MSG_CHANGE_TEXT WM_USER+0

#ifndef NULL

#define NULL 0

#endif

typedef struct {

int x;

int y;

int xHere, yHere;

const GUI_BITMAP* pBitmap;

} tDrawContext;

extern GUI_FLASH const GUI_FONT GUI_FontHZ_FangSong_GB2312_14;

extern GUI_FLASH const GUI_FONT GUI_FontHZ_Times_New_Roman_14;

extern GUI_FLASH const GUI_FONT GUI_Font8x10_ASCII;

extern GUI_FLASH const GUI_FONT GUI_Font32_ASCII;

extern GUI_FLASH const GUI_FONT GUI_Font32B_ASCII;

extern const GUI_BITMAP bm3;

extern const GUI_LOGPALETTE Pal3;

extern const unsigned char ac3[];

extern const GUI_BITMAP bm3_compressed_with_palette;

extern const GUI_BITMAP bmmap;/*以上全部是外部变量声明,有位图,有字体*/

static WM_CALLBACK* _cbBkWindowOld;/*声明背景窗口的回调函数(Call back function),后面会具体说明这个Call back是干什么的*/

static char _acInfoText[40];/*要在背景窗口中显示的文字*/

static WM_HWIN _hWindow2;/*窗口2*/

static void_cbWindow2(WM_MESSAGE* pMsg) {/*窗口2的call back*/

int x, y;

switch (pMsg->MsgId) {/*pMsg这个参数用来告诉这个回调函数发生了什么事件的!这里列出了系统已经定义好的所有的事件*/

case WM_CREATE:

/*to do add code here*/

break;

case WM_DELETE:

/*to do add code here*/

break;

case WM_HIDE:

/*to do add code here*/

break;

case WM_MOVE:

/*to do add code here*/

break;

case WM_NOTIFY_PARENT:

/*to do add code here*/

break;

case WM_PAINT:/*这个Paint事件,准确地翻译我不知道,但他的功能主要就是自动重绘窗口,这十分重要,有了自动重绘你只要在这个CB里面告诉GUI你想绘什么东西就行了,GUI会自动在适当的时机重绘*/

GUI_SetBkColor(GUI_RED);

GUI_Clear();

GUI_SetColor(GUI_WHITE);

GUI_SetFont(&GUI_Font24_ASCII);

x =WM_GetWindowSizeX(pMsg->hWin);

y =WM_GetWindowSizeY(pMsg->hWin);

GUI_DispStringHCenterAt("Test Window No.2", x / 2, 1); /*在这里面你可以调用上面贴子中所有出现过的内容,但不是在整个屏幕上绘图了,而是在这个窗口中绘图*/

break;

case WM_SHOW:

/*to do add code here*/

break;

case WM_SIZE:

/*to do add code here*/

break;

case WM_TOUCH:

/*to do add code here*/

break;

default:

WM_DefaultProc(pMsg);/*在回调函数中还有很多其他系统定义的事件,例如WM_SIZE你可以在发生了该事件后改变窗口的内容。有了这个回调函数就可以实现很多的功能*/

}

}

static void _ChangeInfoText(char* pStr) {/*将要在背景窗口中显示的文字放到一个全局变量里面去,再由Bk窗口的回调函数自动刷新*/

WM_MESSAGE Message;

Message.MsgId= MSG_CHANGE_TEXT;

Message.Data.p = pStr;

WM_SendMessage(WM_HBKWIN, &Message);/*发送一个消息告诉Bk的cb发生了文字改变的事件*/

WM_InvalidateWindow(WM_HBKWIN);

}

static void _cbBkWindow(WM_MESSAGE* pMsg) {/*Bk窗口的CB函数,在这里可以更清楚地看到cb是怎么工作的*/

switch (pMsg->MsgId) {

case MSG_CHANGE_TEXT:/*发生了MSG change设个事件,将待显示的文本拷贝的变量中去*/

strcpy(_acInfoText, pMsg->Data.p);/*这里有点小小的编程技巧,在这里没有使用break,而是直接执行下面的case里面的内容这样就直接刷新的Bk窗口*/

case WM_PAINT:

GUI_SetBkColor(GUI_CYAN);

GUI_Clear();

GUI_SetColor(GUI_RED);

GUI_SetFont(&GUI_Font24_ASCII);

GUI_DispStringHCenterAt("WindowManager - Sample", 160, 5);

GUI_SetFont(&GUI_FontHZ_FangSong_GB2312_14);

GUI_DispStringAt(_acInfoText, 5, 40);/*在这里就可以看到桌面是怎么来的了,这里的图片和lcd的大小不一样,如果一样就是桌面了*/

GUI_DrawBitmap(&bm3, 50, 60);

break;/*这里就看到了Bk窗口里面发生的一切*/

default:

WM_DefaultProc(pMsg);

}

}

/*

*******************************************************************

*

*main()

*

*******************************************************************

*/

void MainTask(void) {

unsigned int i;

WM_HWIN hClient;

GUI_Init();

_cbBkWindowOld = WM_SetCallback(WM_HBKWIN, _cbBkWindow);

GUI_Delay(1000);

_ChangeInfoText("uC/GUI演示程序!");

_hWindow2 = WM_CreateWindow(330, 130, 300, 300, WM_CF_SHOW | WM_CF_FGND, _cbWindow2, 0);

GUI_Delay(2000);

}

这段代码就比较复杂了,可以看出来想把GUI用好不是一件容易的事情!

那如果不使用call back机制呢。一样可以实现相同的功能。但是屏幕的刷新可就是你的责任了。

用户就需要调用相关的函数来实现屏幕内容的刷新。

可能有很多人还不理解这个cb机制。我也说不太清。

在前几天的所有例子中都是用户控制刷屏的。就直在调用GUI_Delay()的时候内容才会改变!

单步运行就知道了。

下面看看队窗口的操作

WM_ResizeWindow(_hWindow2, -100, -100);

WM_MoveTo(_hWindow2, 50, 100);

执行这两句,窗口就变了样了。

当然了你还可以一次让它移动1个像素,这样看上去就是平滑移动的!

窗口管理还有很多的内容,以后慢慢再贴出来。

这些东西决的原创,欢迎大家提意见,随意转载,但请注明出处和作者。

共 5 页   上一页12345
可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号