打印
[STM32F7]

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

[复制链接]
2139|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 | 只看该作者
这个程序也够麻烦的啊
你的也是出现死机的情况看吗

使用特权

评论回复
5
wozaihuayu|  楼主 | 2016-4-18 17:20 | 只看该作者
本帖最后由 wozaihuayu 于 2016-4-18 17:23 编辑
ccw1986 发表于 2016-4-18 16:57
这个程序也够麻烦的啊
你的也是出现死机的情况看吗

没有死过机啊,调试可以正常进中断,就是现在对话框放第2层时,按里面的BUTTON就没反应,放第一层可以。这位兄台有没有遇到过呀,或者给点建议,本人已经黔驴技穷了啊!

使用特权

评论回复
6
mark0668| | 2016-4-18 22:04 | 只看该作者
GUI_TOUCH_StoreStateEx

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wozaihuayu + 1 很给力!
7
wozaihuayu|  楼主 | 2016-4-19 14:50 | 只看该作者
mark0668 发表于 2016-4-18 22:04
GUI_TOUCH_StoreStateEx

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

太感谢了,根据你的回答把问题解决了!困扰一个多星期了,实在感谢!解决方法我会写在下面供其他人参考!

使用特权

评论回复
8
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!这样执行开机触摸校准时,触摸层是在第一层,校准过后,触摸层切换到第二层!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

261

帖子

4

粉丝