OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8570|回复: 7

关于UCGUI 回调函数例程的问题…………求指点

[复制链接]

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2013-11-19
在线时间
22 小时
发表于 2014-6-22 17:19:32 | 显示全部楼层 |阅读模式
5金钱

/*******************************************************************
*
*       static code
*
********************************************************************
*/
/*******************************************************************
*
*       _cbBkWindow
*/
static void _cbBkWindow(WM_MESSAGE* pMsg) {
  switch (pMsg->MsgId) {
  case WM_PAINT:
    GUI_ClearRect(0, 50, 319, 239);
  default:
    WM_DefaultProc(pMsg);
  }
}

/*******************************************************************
*
*       _cbWindow
*/
static void _cbWindow(WM_MESSAGE* pMsg) {
  GUI_RECT Rect;
  switch (pMsg->MsgId) {
  case WM_PAINT:
    WM_GetInsideRect(&Rect);
    GUI_SetBkColor(GUI_RED);
    GUI_SetColor(GUI_YELLOW);
    GUI_ClearRectEx(&Rect);
    GUI_DrawRectEx(&Rect);
    GUI_SetColor(GUI_BLACK);
    GUI_SetFont(&GUI_Font8x16);
    GUI_DispStringHCenterAt("Foreground window", 75, 40);
    break;
  default:
    WM_DefaultProc(pMsg);
  }
}

/*******************************************************************
*
*       _MoveWindow
*/
static void _MoveWindow(const char* pText) {
  WM_HWIN hWnd;
  int i;
  /* Create foreground window */
  hWnd = WM_CreateWindow(10, 50, 150, 100, WM_CF_SHOW, _cbWindow, 0);
  GUI_Delay(500);
  /* Move foreground window */
  for (i = 0; i < 40; i++) {
    WM_MoveWindow(hWnd, 2, 2);
    GUI_Delay(10);
  }
  /* Show text before deleting window if we have one */
  if (pText) {
    GUI_DispStringAt(pText, 5, 50);
    GUI_Delay(2500);
  }
  /* Delete foreground window */
  WM_DeleteWindow(hWnd);
  WM_Invalidate(WM_HBKWIN);
  GUI_Exec();
}

/*******************************************************************
*
*       _DemoRedraw
*/
static void _DemoRedraw(void) {
  WM_CALLBACK* _cbOldBk;
  GUI_SetBkColor(GUI_BLACK);
  GUI_Clear();
  GUI_SetColor(GUI_WHITE);
  GUI_SetFont(&GUI_Font24_ASCII);
  GUI_DispStringHCenterAt("WM_Redraw - Sample", 160, 5);
  GUI_SetFont(&GUI_Font8x16);
  while(1) {
    /* Move a window over background */
    _MoveWindow("Background has not been redrawn");
    /* Clear background */
    GUI_ClearRect(0, 50, 319, 239);
    GUI_Delay(1000);
    /* Set callback for background window */
    _cbOldBk = WM_SetCallback(WM_HBKWIN, _cbBkWindow);
    /* Move a window over background */
    _MoveWindow("Background has been redrawn");
    /* Delete callback for Background window */
    WM_SetCallback(WM_HBKWIN, _cbOldBk);
  }
}


int main(void)
 {
    

SystemInit();
delay_init(72);     //???±??????
NVIC_Configuration();
uart_init(9600);
  LED_Init();
KEY_Init();
GUI_Init();
  GUI_SetBkColor(GUI_BLACK);
  GUI_Clear();
   
LED1=0;
_DemoRedraw();

//LED1=0;



while(1)
{
 
delay_ms(800);
LED0 = !LED0;
}
   

 }



以上是 码源里提供的例程,相信大家都试验过。。。。。我的问题是……当把例程拷贝到自己的工程里,编译通过以后,。。。在自己的液晶屏上只显示如图所示的东西。。。感觉不太对。。。而且,根本没有进入主函数的WHILE循环(因为LED0不闪)。。。LED1是用来做测试的。。当在_DemoRedraw()这个函数上面时,LED1亮。当在_DemoRedraw();下面时候,   LED1不亮。。。。所以,我觉得函数在_DemoRedraw()里面没有跳出………………  
   请问,(1)究竟是什么原因呢???  

(2)如果看到的大侠,心情不错,能不能帮忙解释一下,这个例程究竟是怎么执行,并利用回调的(小弟,现在对回调的概念很模糊)……祝大侠今晚有艳遇……这是每个工科男的心思……哎




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2014-6-23 00:30:20 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-6-23 08:29:27 | 显示全部楼层
_DemoRedraw 这个函数里有while 怎么跳出
不用谢了……
回复

使用道具 举报

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2013-11-19
在线时间
22 小时
 楼主| 发表于 2014-6-23 08:50:20 | 显示全部楼层
回复【3楼】eling13:
---------------------------------
恩 。。。是哦。。。之前居然没发现。。。。那怎么才能让他跳出来,去执行主函数里面的循环呢??? 还有就是,我感觉,  
_MoveWindow("Background has not been redrawn");   这一句和其他几句 ,都没有执行。。。是什么原因呢?
回复

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-6-23 09:19:53 | 显示全部楼层
跳出的话,可以用break;
额,跑的效果是什么 看着好像没错。没重绘桌面的话,是好多个窗口重叠出来。重绘的话,全程只有一个窗口移动了。
不用谢了……
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-6-23 16:08:25 | 显示全部楼层
没有用过这种方式,抱歉我看不懂,常规是创建后循环调用GUI_Exec()
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

32

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2013-12-30
在线时间
0 小时
发表于 2014-7-7 20:35:32 | 显示全部楼层
回复【4楼】xiaopidan:
---------------------------------
可能是卡在GUI_Delay()函数了,你追踪GUI_Delay()看看
回复

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2014-7-8 09:46:37 | 显示全部楼层
这个例程主要是为了展示WM_SetCallback();函数的用法,该函数是用来设置回调函数的,从而便是展示ucGUI回调机制的用法

没运行过这个例程,看了看这个程序
(1)官方给的DEMO通常都是一个while循环,所以_DemoRedraw这个函数不会退出,也不会执行程序中LED灯闪烁的功能
(2)根据代码,每次while循环一次可以看到两次有一个窗口在移动,用户可以观察这窗口移动过程中,一次移动会出现Foreground window的字样(如楼主所传的图片中所示),而另一次不会。。。原因就在于WM_HBKWIN窗口(桌面窗口)的回调函数发生了变化
努力,前进。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 10:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表