硬汉嵌入式论坛

 找回密码
 立即注册
查看: 10295|回复: 7
收起左侧

[μCGUI] 窗口显示混乱问题

[复制链接]

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 2013-9-8 15:17:25 | 显示全部楼层 |阅读模式
向某窗口发送消息窗口更新显示时,显示出现在了桌面窗口的位置,这是为什么
INT16U count=0;
static void StateInfoCallBack(WM_MESSAGE*pMsg)
{
switch(pMsg->MsgId)
{
case WM_PAINT:
  GUI_SetBkColor(GUI_RED);
  GUI_Clear();
  GUI_SetFont(&GUI_Font13HB_1);
  GUI_GotoXY(10,8);
  GUI_DispDec(count,2);
  break;
case WM_USER_SECOND:
  GUI_SetFont(&GUI_Font13HB_1);
  GUI_GotoXY(10,8);
  count++;
  if(count>99) count = 0;
  GUI_DispDec(count,2);
  break;
default:WM_DefaultProc(pMsg);
}
}
void StateInfoWMInit(void) //状态信息窗口初始化
{
hStateInfoWin = WM_CreateWindow(500,0,300,50,WM_CF_SHOW,StateInfoCallBack,0);
GUI_Delay(10);
}

void  StartTask(void *pdata)
{
INT16U i=0;
WM_MESSAGE Msg;;
pdata=pdata;
GUI_Init();
GUI_Clear();
OSTimeDly(200);   //延时200ms
StateInfoWMInit();
Msg.MsgId = WM_USER_SECOND;
while(1)
{
  OSTimeDly(10);  //每20ms扫描一次
  //GUI_Delay(10);
  i++;
  if(i>=100)
  {
   i = 0;
   WM_SendMessage(hStateInfoWin,&Msg);
  }
}     
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2013-9-8 15:29:53 | 显示全部楼层
这个函数不好用,WM_SendMessage(hStateInfoWin,&Msg); 有时候很容易出错或者发送不出去消息,
你改成这样试试看
1. WM_SendMessage(hStateInfoWin,&Msg);用WM_InvalidateWindow(hStateInfoWin);代替
    意思就是让窗口无效从而启动重回也就是WM_PAINT
2. 把case WM_USER_SECOND里面的函数放到WM_PAINT里面来完成。
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2013-9-8 15:34:09 | 显示全部楼层
若是窗口内容很多,而只需要修改一小部分,重绘岂不很浪费时间啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2013-9-8 15:51:26 | 显示全部楼层
ycy9999:
若是窗口内容很多,而只需要修改一小部分,重绘岂不很浪费时间啊

可以调用这个函数WM_InvalidateRect()   使部分窗口无效。


其实还有另一种办法来定时的更新,就是调用定时器函数,以前尝试UCGUI定时器函数的时候不能用
需要增加和修改一些东西才可以用,现在用的emWin5.16很好用,比如你要显示时间,定时的更新,
就可以这样:

/* 创建一个对话框 */
    hWin1 = GUI_CreateDialogBox(_aDialogCreateMain,
                                                          GUI_COUNTOF(_aDialogCreateMain),
                                                          &_cbCallbackMain,
                                                          0,
                                                          0,
                                                          0);
    /* 创建定时器,其功能是经过指定周期后,向指定窗口发送消息。
     * 该定时器与指定窗口相关联。
     */
    WM_CreateTimer(hWin1,  /* 接受信息的窗口的句柄 */
                                  0,            /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                                  1000,      /* 周期,此周期过后指定窗口应收到消息*/
                                   0);          /* 留待将来使用,应为0 */


在对话框的回调函数里面这样:

case WM_TIMER:
                //注意这里,直接调用控件函数更新就可以的。
                PROGBAR_SetValue(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0), OSStatTaskCPUUsage);
                Caculate_RTC(pMsg);
                WM_RestartTimer(pMsg->Data.v, 1000);
                break;
/*
*********************************************************************************************************
*    函 数 名: Caculate_RTC
*    功能说明: 显示RTC时间
*    形    参:            
*    返 回 值: 无
*********************************************************************************************************
*/
static void Caculate_RTC(WM_MESSAGE * pMsg)
{
      char buf[30];
      WM_HWIN hWin = pMsg->hWin;


      RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
      RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);


      sprintf(buf,
              "%0.2d:%0.2d:%0.2d %0.3s",
              RTC_TimeStructure.RTC_Hours,
              RTC_TimeStructure.RTC_Minutes,
              RTC_TimeStructure.RTC_Seconds,
              ucWeekDay[RTC_DateStructure.RTC_WeekDay-1]);
     TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT1), buf);

      sprintf(buf,
              "20%0.2d/%0.2d/%0.2d",
              RTC_DateStructure.RTC_Year,
              RTC_DateStructure.RTC_Month,
              RTC_DateStructure.RTC_Date);
      TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT0), buf);                        
}


显示效果就是右下角那样的
1.jpg
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2013-9-9 08:51:39 | 显示全部楼层
跟踪了一下代码,发现绘图的时候没有在需要的窗口绘图,而是在发送信息的代码窗口绘图了,有函数可以改变绘图窗口吗
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2013-9-9 12:26:05 | 显示全部楼层

问题得到了解决

修改了一下消息发送函数

void WM__SendMessage(WM_HWIN hWin, WM_MESSAGE* pMsg) {
  static int _EntranceCnt;
  GUI_CONTEXT ContextOld;
  WM_Obj* pWin;
  if (_EntranceCnt < GUI_MAX_MESSAGE_NESTING) {
    pWin = WM_HANDLE2PTR(hWin);
    pMsg->hWin = hWin;
    if (pWin->cb != NULL) {
      _EntranceCnt++;
   if(pMsg->MsgId >=WM_USER)
   {
       ContextOld =GUI_Context;
    GUI_Context.hAWin = hWin;
    GUI_Context.xOff = pWin->Rect.x0;
    GUI_Context.yOff = pWin->Rect.y0;
    (*pWin->cb)(pMsg);
    GUI_Context = ContextOld;
   }
   else
  (*pWin->cb)(pMsg);
      _EntranceCnt--;
    } else {
      WM_DefaultProc(pMsg);
    }
  }
  #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_PARA
  else {
    GUI_DEBUG_ERROROUT("Max. message nesting exceeded, Message skipped.");
  }
  #endif
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2013-9-9 12:34:53 | 显示全部楼层

回 ycy9999 的帖子

ycy9999:修改了一下消息发送函数

void WM__SendMessage(WM_HWIN hWin, WM_MESSAGE* pMsg) {
  static int _EntranceCnt;
....... (2013-09-09 12:26) 
恩,问题解决了就好。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 21:00 , Processed in 0.284049 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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