原创 uC/GUI3.32应用笔记连载之七

2006-11-13 00:31 3973 9 10 分类: MCU/ 嵌入式

uC/GUI NIOSII移植之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个像素,这样看上去就是平滑移动的!


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


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

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1053025 2006-11-20 13:43

谢谢博主的文章!
相关推荐阅读
用户58767 2007-01-21 11:43
WinCE的驱动程序
Windows CE有些日子了,个人觉得学习者个东西不是很难,关键他的编程是很多电子工程师没有办法搞定的,这是限制Windows CE被大量应用的一个瓶颈,并且他操作地层硬件的方法对于电子工程师来所太...
用户58767 2006-12-10 10:13
公司让我搞wince
公司让我搞win ce.......................学习学习疯狂的学习!...
用户58767 2006-11-27 16:20
终于安装好了VS2003
今天终于把该死的vs2003装上了又可以开始更新ucgui相关的帖子了。希望关注的网友继续支持。...
用户58767 2006-11-26 23:39
UCGUI的模拟器UCGUISim详解
本文转自www.ucgui.com感谢原作者。 一、问题的由来-----模拟器完成了什么在官方发布的UCGUI的源码包当中,附有很多的示例,源码与示例都打包成一个VC工程,在这个工程中我们可以编译和运...
用户58767 2006-11-26 23:10
时间换空间、空间换时间
一个永远争论不休的问题特别的是在嵌入式系统里面,更是永远的话题。到底用什么换什么,不好说,就事论事把。...
用户58767 2006-11-18 20:58
一分钱耽误了1天时间
这几天调试遇到了见鬼的问题jtag调试程序正常,一脱机运行就完蛋。我的程序是将两个UART的内容互相倒来倒去UART0收到的转发到UART1,UART1收到的转发到UART0。用Jtag调试很正常,脱...
EE直播间
更多
我要评论
1
9
关闭 站长推荐上一条 /3 下一条