[STM32F7] STEMWIN多图层,对话框在第二层按钮不灵

[复制链接]
2441|7
 楼主| wozaihuayu 发表于 2016-4-18 11:20 | 显示全部楼层 |阅读模式
最近在使用STM32F746开发板做一个多图层显示的实验(共两层),底层显示图片,顶层显示一个对话框,对话框中有两个按钮。
调试时发现
把对话框放在底层,按钮可以正常按下并触发回调函数
但是对话框放在顶层时按钮就死活不管用了
有没有遇到的朋友帮忙看下。

void MainTask(void)
{
      GUI_PID_STATE State;
    U8 lay;
    int x,y;
    GUI_CURSOR_Show();
    GUI_SelectLayer(0);  //选择第1层

    GUI_JPEG_Draw(&_jpeg_test, sizeof(_jpeg_test), 0, 0);  //显示图片

    PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
    BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
   
    GUI_SelectLayer(1);  //选择第2层
    WM_SelectWindow(WM_GetDesktopWindowEx(1));
    GUI_CURSOR_Show();
    GUI_SetBkColor(0xffffffff);

    GUI_Clear();
    hWin = WM_GetActiveWindow();

    hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, hWin, 400, 240);//创建对话框

    while(1)
    {
        GUI_Delay(200);   
    }
}
mark0668 发表于 2016-4-18 13:23 | 显示全部楼层
触膜输入也要选择在第2层
 楼主| wozaihuayu 发表于 2016-4-18 14:18 | 显示全部楼层
mark0668 发表于 2016-4-18 13:23
触膜输入也要选择在第2层

谢谢回复,但是这个怎么选择呢,翻了翻emwin手册也没有找到有相应的函数啊?
ccw1986 发表于 2016-4-18 16:57 | 显示全部楼层
这个程序也够麻烦的啊
你的也是出现死机的情况看吗
 楼主| wozaihuayu 发表于 2016-4-18 17:20 | 显示全部楼层
本帖最后由 wozaihuayu 于 2016-4-18 17:23 编辑
ccw1986 发表于 2016-4-18 16:57
这个程序也够麻烦的啊
你的也是出现死机的情况看吗

没有死过机啊,调试可以正常进中断,就是现在对话框放第2层时,按里面的BUTTON就没反应,放第一层可以。这位兄台有没有遇到过呀,或者给点建议,本人已经黔驴技穷了啊!
mark0668 发表于 2016-4-18 22:04 | 显示全部楼层
GUI_TOUCH_StoreStateEx

这函数,不知你的触膜是不是用这种方法输入的,如果是就改这输入层.

评分

参与人数 1威望 +1 收起 理由
wozaihuayu + 1 很给力!

查看全部评分

 楼主| wozaihuayu 发表于 2016-4-19 14:50 | 显示全部楼层
mark0668 发表于 2016-4-18 22:04
GUI_TOUCH_StoreStateEx

这函数,不知你的触膜是不是用这种方法输入的,如果是就改这输入层. ...

太感谢了,根据你的回答把问题解决了!困扰一个多星期了,实在感谢!解决方法我会写在下面供其他人参考!
 楼主| wozaihuayu 发表于 2016-4-19 15:00 | 显示全部楼层
本帖最后由 wozaihuayu 于 2016-4-19 15:02 编辑

现在把解决方法贴出来,供遇到同样问题的人参考!
层面切换除了我上面贴出的MainTask(void)函数体中需要执行的语句外,我还在找到了触摸屏定期调用的函数
void BSP_Pointer_Update(void)
{
  GUI_PID_STATE TS_State;
  static TS_StateTypeDef prev_state;
  TS_StateTypeDef  ts;
  uint16_t xDiff, yDiff;  
  
  BSP_TS_GetState(&ts);
  
  TS_State.Pressed = ts.TouchDetected;

  xDiff = (prev_state.x > ts.x) ? (prev_state.x - ts.x) : (ts.x - prev_state.x);
  yDiff = (prev_state.y > ts.y) ? (prev_state.y - ts.y) : (ts.y - prev_state.y);
  
  if((prev_state.TouchDetected != ts.TouchDetected )||
     (xDiff > 3 )||
       (yDiff > 3))
  {
    prev_state.TouchDetected = ts.TouchDetected;
   
    if((ts.x != 0) &&  (ts.y != 0))
    {
      prev_state.x = ts.x;
      prev_state.y = ts.y;
    }
      
    if(CALIBRATION_IsDone())
    {
      TS_State.Layer = 1;
      TS_State.x = CALIBRATION_GetX (prev_state.x);
      TS_State.y = CALIBRATION_GetY (prev_state.y);
    }
    else
    {
      TS_State.Layer = 0;
      TS_State.x = prev_state.x;
      TS_State.y = prev_state.y;
    }
   
    GUI_TOUCH_StoreStateEx(&TS_State);
  }
}
此函数根据定时器设定值定时调用!
这个函数中最后一行调用了,GUI_TOUCH_StoreStateEx(&TS_State);这句上面的一个if else语句就是要改的地方,起初这里if和else中都是TS_State.Layer = 0;
我将if中的改为TS_State.Layer = 1;这样的意思是,当我执行完触摸屏校准时,触摸层设置为layer2,如果没有执行触摸校准这是layer1!这样执行开机触摸校准时,触摸层是在第一层,校准过后,触摸层切换到第二层!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

267

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部