OpenEdv-开源电子网

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

uCGUI对话框消息错误

[复制链接]

14

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-7-22
在线时间
121 小时
发表于 2017-11-21 16:09:34 | 显示全部楼层 |阅读模式
5金钱
ucgui3.98移植完成之后,编写了一个实例如下,但是发现按按键没有反应,调试的时候发现
                Id = WM_GetId(pMsg->hWinSrc);
                NCode = pMsg->Data.v;
                switch(NCode)
NCode 这个地方一直是WM_NOTIFICATION_CLICKED而不是WM_NOTIFICATION_RELEASED。所以导致按键均无效。不知论坛有没有朋友遇到过这样的情况。或者一起来探讨一下原因?触摸问题或者uCGUI移植问题?


#include "GUI.h"
#include "DIALOG.h"
#include "WM.h"
#include "BUTTON.h"
#include "CHECKBOX.h"
#include "DROPDOWN.h"
#include "EDIT.h"
#include "FRAMEWIN.h"
#include "LISTBOX.h"
#include "MULTIEDIT.h"
#include "RADIO.h"
#include "SLIDER.h"
#include "TEXT.h"
#include "PROGBAR.h"
#include "SCROLLBAR.h"
#include "LISTVIEW.h"
#include "MULTIPAGE.h"
#include "GRAPH.h"
#include "MainPanel.h"

#if 0
WM_HWIN PanelhWin;
extern void TouchCalibrate(void);

static const GUI_WIDGET_CREATE_INFO _PANEL_TABLE[] =
{
        { FRAMEWIN_CreateIndirect,  "Test System",           0,                       0,  0,  800,480,FRAMEWIN_CF_ACTIVE,0},  //FRAMEWIN_CF_MOVEABLE FRAMEWIN_CF_ACTIVE,
        { BUTTON_CreateIndirect,    "NowTest",              GUI_ID_BUTTON0,         200-65,200,100,100, 0,0},//实时测试  50,200,100,100, 0,0
        { BUTTON_CreateIndirect,    "DataLog",              GUI_ID_BUTTON1,          350-65,200,100,100, 0,0},//出场调试
        { BUTTON_CreateIndirect,    "SystSet",              GUI_ID_BUTTON2,          500-65,200,100,100, 0,0},//登陆
        { BUTTON_CreateIndirect,    "SelMode",              GUI_ID_BUTTON3,          650-65,200,100,100, 0,0},//型号选择
        { TEXT_CreateIndirect,      "",                     GUI_ID_TEXT0,            520,440,260,30, 0,0},  //A387_VERSION
};

static u8 InitDialogPanel(WM_MESSAGE * pMsg)
{
        u8 i;
        WM_HWIN hWin = pMsg->hWin;
//-------------------------------------------------------------------------------------
//对话框控件初始化
        //FRAMEWIN_SetTitleVis(hWin,0);   //标题隐藏
        FRAMEWIN_SetFont(hWin,&GUI_Font16B_ASCII);
        FRAMEWIN_SetClientColor(hWin,GUI_BLACK);//设置背景色 GUI_BLACK
        FRAMEWIN_SetBorderSize(hWin,0);//设置边框尺寸
        FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);//设置标题对其方式

//---------------------------------------------------------------------------------------------------------------------------
//复选框控件初始化
        for(i=0; i<4; i++)
        {
                BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0+i),&GUI_Font16B_ASCII);
                BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON0+i),BUTTON_CI_UNPRESSED,GUI_LIGHTYELLOW);
                BUTTON_SetFocussable(WM_GetDialogItem(hWin,GUI_ID_BUTTON0+i), 0);
        }

        TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT0), GUI_WHITE);
        TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT0), &GUI_Font16B_ASCII);
        TEXT_SetTextAlign(WM_GetDialogItem(hWin,GUI_ID_TEXT0),GUI_TA_TOP|GUI_TA_CENTER);
        return 1;
}

static void _cbCallbackPanel(WM_MESSAGE * pMsg)
{
        int NCode, Id;
        WM_HWIN hWin = pMsg->hWin;

        switch (pMsg->MsgId)
        {
        case WM_PAINT:
                break;
        case WM_INIT_DIALOG:
                InitDialogPanel(pMsg);
                break;
        case WM_KEY:
                switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
                {
                case GUI_KEY_ESCAPE:
                        GUI_EndDialog(hWin, 1);
                        break;
                case GUI_KEY_ENTER:
                        GUI_EndDialog(hWin, 0);
                        break;
                }
                break;
        case WM_NOTIFY_PARENT:
                Id = WM_GetId(pMsg->hWinSrc);
                NCode = pMsg->Data.v;
                switch(NCode)
                {
                case WM_NOTIFICATION_RELEASED:
                        if(Id == GUI_ID_BUTTON0)
                        {
                                GUI_MessageBox("This is Check1", "My Check",GUI_MESSAGEBOX_CF_MOVEABLE);
                                GUI_EndDialog(hWin, 0);
                        }
                        else if(Id == GUI_ID_BUTTON1)
                        {
                                GUI_MessageBox("This is Check2", "My Check",GUI_MESSAGEBOX_CF_MOVEABLE);
                                GUI_EndDialog(hWin, 0);
                        }
                        else if(Id == GUI_ID_BUTTON2)
                        {
                                GUI_MessageBox("This is Check3", "My Check",GUI_MESSAGEBOX_CF_MOVEABLE);
                                GUI_EndDialog(hWin, 0);
                        }
                        else
                        {
                                if(Id == GUI_ID_BUTTON3)
                                {
                                        GUI_EndDialog(hWin, 0);
                                }
                        }
                case WM_NOTIFICATION_SEL_CHANGED:
                        break;
                }
                break;
        default:
                WM_DefaultProc(pMsg);
        }
}
/**************************************************************************************
名    称:MainDialogBox()
功    能:建立对话框
输入参数:无
返回参数:0
备    注:
***************************************************************************************/
void PanelDialogBox(void)
{
        PanelhWin = GUI_CreateDialogBox(_PANEL_TABLE, GUI_COUNTOF(_PANEL_TABLE), &_cbCallbackPanel, 0, 0, 0);//创建一个非阻塞式对话框
}
#endif

/*********************************************************************
*
*       Dialog resource     keyboard
*
* This table conatins the info required to create the dialog.
* It has been created by ucGUIbuilder.
*/

#define GUI_ID_BUTTON10     0x810
#define GUI_ID_BUTTON11     0x811



static const GUI_WIDGET_CREATE_INFO _aDialogCreate_kb[] =
{
        { FRAMEWIN_CreateIndirect,  "Set",                0,                     0,  0,  240,320,0,0},
        { BUTTON_CreateIndirect,    "0",                 GUI_ID_BUTTON0,          96, 240,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "1",                 GUI_ID_BUTTON1,          32, 102,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "2",                 GUI_ID_BUTTON2,          96, 102,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "3",                 GUI_ID_BUTTON3,          157,102,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "4",                 GUI_ID_BUTTON4,          32, 148,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "5",                 GUI_ID_BUTTON5,          96, 148,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "6",                 GUI_ID_BUTTON6,          157,148,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "7",                 GUI_ID_BUTTON7,          32, 194,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "8",                 GUI_ID_BUTTON8,          96, 194,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "9",                 GUI_ID_BUTTON9,          157,194,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "OK",              GUI_ID_OK,                   32, 240,40, 40, 0,0},
        { BUTTON_CreateIndirect,    "Cancel",              GUI_ID_CANCEL,           157,240,40, 40, 0,0},
        { EDIT_CreateIndirect,       "",               GUI_ID_EDIT0,            17, 31, 193,32, 0,0},
        { BUTTON_CreateIndirect,    "'",                 GUI_ID_BUTTON10,         96, 70, 40, 26, 0,0},
        { BUTTON_CreateIndirect,    "Delete",              GUI_ID_BUTTON11,         157,71, 40, 25, 0,0}
};

/*****************************************************************
**      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
**      Function: to initialize the Dialog items
**
**      call this function in _cbCallback --> WM_PAINT
*****************************************************************/

void PaintDialog_kb(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin = pMsg->hWin;

}
/*****************************************************************
**      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
**      Function: to initialize the Dialog items
**
**      call this function in _cbCallback --> WM_INIT_DIALOG
*****************************************************************/

void InitDialog_kb(WM_MESSAGE * pMsg)
{
        WM_HWIN hWin = pMsg->hWin;
        //
        //FRAMWIN
        //
        FRAMEWIN_SetTitleHeight(hWin,16);
        FRAMEWIN_SetFont(hWin,&GUI_Font16B_ASCII);
        //
        //GUI_ID_BUTTON0
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_Font24B_ASCII);
        //
        //GUI_ID_BUTTON1
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON1),&GUI_Font24B_ASCII);
        //
        //GUI_ID_BUTTON2
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON2),&GUI_Font24B_ASCII);
        //
        //GUI_ID_BUTTON3
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON3),&GUI_Font24B_ASCII);
        //
        //GUI_ID_BUTTON4
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON4),&GUI_Font24B_ASCII);
        //
        //GUI_ID_BUTTON5
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON5),&GUI_Font24B_ASCII);
        //
        //GUI_ID_BUTTON6
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON6),&GUI_Font24B_ASCII);
        //
        //GUI_ID_BUTTON7
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON7),&GUI_Font24B_ASCII);
        //
        //GUI_ID_BUTTON8
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON8),&GUI_Font24B_ASCII);
        //
        //GUI_ID_BUTTON9
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON9),&GUI_Font24B_ASCII);
        //
        //GUI_ID_EDIT0
        //
        EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT0),&GUI_Font24_ASCII);
//        EDIT_SetValue(WM_GetDialogItem(hWin,GUI_ID_EDIT0),0);
        EDIT_SetMaxLen(WM_GetDialogItem(hWin,GUI_ID_EDIT0),9);
//        EDIT_SetDecMode(WM_GetDialogItem(hWin,GUI_ID_EDIT0),0,0,999.9999,4,0);
        //
        //GUI_ID_BUTTON12
        //
        BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON10),&GUI_Font24B_ASCII);


}

/*********************************************************************
*
*       Dialog callback routine
*/
static void _cbCallback_kb(WM_MESSAGE * pMsg)
{
        int NCode, Id;
        WM_HWIN hWin = pMsg->hWin;
        switch (pMsg->MsgId)
        {
        case WM_PAINT:
                PaintDialog_kb(pMsg);
                break;
        case WM_INIT_DIALOG:
                InitDialog_kb(pMsg);
                break;
        case WM_KEY:
                switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
                {
                case GUI_KEY_ESCAPE:
                        GUI_EndDialog(hWin, 1);
                        break;
                case GUI_KEY_ENTER:
                        GUI_EndDialog(hWin, 0);
                        break;
                }
                break;
        case WM_NOTIFY_PARENT:
                Id = WM_GetId(pMsg->hWinSrc);
                NCode = pMsg->Data.v;
                switch(NCode)
                {
                case  WM_NOTIFICATION_RELEASED:
                        switch (Id)
                        {
                        case GUI_ID_OK:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'\0');
                                GUI_MessageBox("Press Right Number","Warning!!",0);
                                break;
                        case GUI_ID_CANCEL:
                                GUI_EndDialog(hWin, 0);
                                break;
                        case GUI_ID_BUTTON0:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'0');
                                break;
                        case GUI_ID_BUTTON1:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'1');
                                break;
                        case GUI_ID_BUTTON2:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'2');
                                break;
                        case GUI_ID_BUTTON3:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'3');
                                break;
                        case GUI_ID_BUTTON4:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'4');
                                break;
                        case GUI_ID_BUTTON5:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'5');

                                break;
                        case GUI_ID_BUTTON6:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'6');

                                break;
                        case GUI_ID_BUTTON7:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'7');

                                break;
                        case GUI_ID_BUTTON8:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'8');

                                break;
                        case GUI_ID_BUTTON9:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'9');
                                break;
                        case GUI_ID_BUTTON10:
                                EDIT_AddKey(WM_GetDialogItem(hWin,GUI_ID_EDIT0),'.');
                                break;
                        case GUI_ID_BUTTON11:
                                EDIT_SetText(WM_GetDialogItem(hWin,GUI_ID_EDIT0),0);//清空输入框,挨个删除用下面两行
//                                                                 WM_SetFocus(WM_GetDialogItem(hWin,GUI_ID_EDIT0));
//                                                                 GUI_SendKeyMsg(GUI_KEY_BACKSPACE,1);
                                break;
                        }
                        break;
                }
                break;
        default:
                WM_DefaultProc(pMsg);
        }
}


//键盘对话框创建
//GUI_CreateDialogBox(_aDialogCreate_kb, GUI_COUNTOF(_aDialogCreate_kb), &_cbCallback_kb, 0, 0, 0);

void PanelDialogBox(void)
{
        GUI_CreateDialogBox(_aDialogCreate_kb, GUI_COUNTOF(_aDialogCreate_kb), &_cbCallback_kb, 0, 0, 0);
}




最佳答案

查看完整内容[请看2#楼]

我来结贴吧。经过安富莱的汉哥点拨,发现是触摸程序没有向ucgui传递触摸释放而造成的问题。发现原因后首先考虑触摸驱动的问题,然而我用的是战舰Ft5206的原版驱动,应该是没有问题的,后面定位到了 void GUI_TOUCH_StoreState(int x, int y) { static GUI_PID_STATE _State; /* static so we retain coordinates when touch is released */ if ((x >= 0) && (y >= 0)) { _State.Pressed = 1; _State.x = x; ...
work is work!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-7-22
在线时间
121 小时
 楼主| 发表于 2017-11-21 16:09:35 | 显示全部楼层

我来结贴吧。经过安富莱的汉哥点拨,发现是触摸程序没有向ucgui传递触摸释放而造成的问题。发现原因后首先考虑触摸驱动的问题,然而我用的是战舰Ft5206的原版驱动,应该是没有问题的,后面定位到了
void GUI_TOUCH_StoreState(int x, int y) {
  static GUI_PID_STATE _State;  /* static so we retain coordinates when touch is released */
  if ((x >= 0) && (y >= 0)) {
    _State.Pressed = 1;
    _State.x = x;
    _State.y = y;
  } else {
    _State.Pressed = 0;
  }
  GUI_TOUCH_StoreStateEx(&_State);
}

Pressed 的状态就是按键按下和释放的状态了,看到这里就恍然大悟了,原来我自己修改GUI_TOUCH_X_MeasureX和GUI_TOUCH_X_MeasureY函数时,然后的坐标值一直都是大于等于0的unsigned int型,造成了无法进入 _State.Pressed = 0;的分支。
最后解决办法是GUI_TOUCH_X_MeasureX和GUI_TOUCH_X_MeasureY函数在没有检测到按下时,返回-1。特此结贴,给自己留个念想吧!
work is work!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2017-11-22 01:14:15 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-2 04:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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