ucgui的BUTTON控件问题

对ucgui使用回调函数来处理BUTTON控件不太熟,我是用key=GUI_GetKey();然后switch结构处理的,但是有个问题就是这样虽然能用,显示按下效果也很快... 对ucgui使用回调函数来处理BUTTON控件不太熟,我是用key = GUI_GetKey();然后switch结构处理的,但是有个问题就是这样虽然能用,显示按下效果也很快,但是按下后有时能响应有时不能响应,百度了看到有人说这是这样处理的通病,但用回调函数处理又不太懂,网上范例都不是我想要的。
这里希望大神用资源表创建对话框,然后用回调函数处理按键的方式帮写个小范例。显示效果如下:
首先新建第一个全屏的FRAMEWIN,在客户区创建一个BUTTON,按下它时创建第二个全屏的窗口,这个窗口标题栏要有“关闭”键,按下它就显示第一个窗口,第一个窗口再按BUTTON又显示第二个~(两个窗口都用资源表来创建)
对会用的大神来说应该不难吧,辛苦一下啦!谢啦!
展开
 我来答
匿名用户
2014-03-11
展开全部
#include <stddef.h>
#include "GUI.h"
#include "DIALOG.h"
#include "WM.h"
#include "BUTTON.h"
#include "FRAMEWIN.h"

/*主界面的资源链表*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
    { FRAMEWIN_CreateIndirect,  "Caption",           0,                       0,  0,  320,240,FRAMEWIN_CF_MOVEABLE,0},
    { BUTTON_CreateIndirect,    "BUTTON0",           GUI_ID_BUTTON0,          84, 55, 134,56, 0,0}
};
/*按钮按下之后的资源链表*/
static const GUI_WIDGET_CREATE_INFO _aButtonCreate[] = {
    { FRAMEWIN_CreateIndirect,  "Caption",           0,                       0,  0,  320,240,FRAMEWIN_CF_MOVEABLE,0},
};
/*主界面的绘制函数*/
void PaintDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
}
/*主界面的初始化函数,初始化标题栏的最大化,最小化,关闭按钮*/
void InitDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    //
    //FRAMEWIN
    //
    FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
    FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
    FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
}
/*按钮弹出界面的回调函数*/
static void _cbButtonCallback(WM_MESSAGE * pMsg) 
{
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId) 
    {
case WM_INIT_DIALOG:
            InitDialog(pMsg);
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}
/*主界面的回调函数*/
static void _cbCallback(WM_MESSAGE * pMsg) 
{
    int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId) 
    {
        case WM_PAINT://绘制界面
            PaintDialog(pMsg);
            break;
        case WM_INIT_DIALOG://初始化界面
            InitDialog(pMsg);
            break;
#if 0
//这个是接收键盘上的按键的相应
        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;
#endif
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc); 
            NCode = pMsg->Data.v;        
            switch (Id) 
            {
                case GUI_ID_BUTTON0:
                    if(NCode==WM_NOTIFICATION_RELEASED)
{
                       GUI_ExecDialogBox(_aButtonCreate, GUI_COUNTOF(_aButtonCreate), &_cbButtonCallback, 0, 0, 0);
                    }
break;           
            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}
/*********************************************************************
*
*       MainTask
*
**********************************************************************
*/
void MainTask(void) 

    GUI_Init();
    WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
    WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
while(1)
{
        GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
}
}

 

关于界面的创建可以用ucguibuilder来创建,它会自动生成代码;然后自己根据所需修改即可。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式