硬汉嵌入式论坛

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

[有问必答] emwin 周期性无效化部分窗口出现问题

[复制链接]

3

主题

14

回帖

23

积分

新手上路

积分
23
发表于 2017-9-20 10:43:12 | 显示全部楼层 |阅读模式
   在一个框架里面需要以周期50ms的频率来刷新一部分显示,然后如果使用触摸的关闭按钮就会刷新卡顿,然后触摸失效,请问该怎么解决? 发现使用按键发送关闭框架控件是不会出现问题的。然后如果在使用关闭按钮前关闭使用无效化刷新界面的那部分代码也不会出现卡顿和触摸失效。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2017-9-21 01:41:20 | 显示全部楼层
现在的无效化是局部的还是全局的,可以改成仅无效化局部区域。

另外就是改成100ms测试下,是否会好些。极有可能是处理不过来。
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2017-9-21 10:27:06 | 显示全部楼层

回 eric2013 的帖子

eric2013:现在的无效化是局部的还是全局的,可以改成仅无效化局部区域。

另外就是改成100ms测试下,是否会好些。极有可能是处理不过来。 (2017-09-21 01:41) 
现在是局部的无效化,已经测试过100MS了,200MS都测试过了,都会出现卡顿和失效。实体按键发送关闭的消息,就不会出现这样的问题。实体按键是在emwin空闲的时候(无队列消息)才会运行,而触摸按键会马上执行。而这个时候队列消息里面可能会有WM_PAINT消息(我在WM_PAINT消息里面刷新,而WM_PAINT是最后执行的消息)。然后就产生冲突了。
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2017-9-21 10:27:32 | 显示全部楼层

回 eric2013 的帖子

eric2013:现在的无效化是局部的还是全局的,可以改成仅无效化局部区域。

另外就是改成100ms测试下,是否会好些。极有可能是处理不过来。 (2017-09-21 01:41) 
那么晚还在上班。666
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2017-9-21 10:46:03 | 显示全部楼层

回 eric2013 的帖子

eric2013:现在的无效化是局部的还是全局的,可以改成仅无效化局部区域。

另外就是改成100ms测试下,是否会好些。极有可能是处理不过来。 (2017-09-21 01:41) 

忘了说,刷新的时候用实体按键,会影响按键的灵敏度~~
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2017-9-22 01:36:05 | 显示全部楼层

回 mengtu 的帖子

mengtu:现在是局部的无效化,已经测试过100MS了,200MS都测试过了,都会出现卡顿和失效。实体按键发送关闭的消息,就不会出现这样的问题。实体按键是在emwin空闲的时候(无队列消息)才会运行,而触摸按键会马上执行。而这个时候队列消息里面可能会有WM_PAINT消息(我在WM_PAINT消息里面 .. (2017-09-21 10:27) 
我看下你的局部刷新里面刷新了什么,极有可能是操作不过来。
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2017-9-22 10:19:44 | 显示全部楼层

回 eric2013 的帖子

eric2013:我看下你的局部刷新里面刷新了什么,极有可能是操作不过来。 (2017-09-22 01:36) 
#include "MainTask.h"

#pragma  diag_suppress 870                //编译警告屏蔽

#define ID_CHECKBOX_0          (GUI_ID_USER + 0x30)
#define ID_CHECKBOX_1          (GUI_ID_USER + 0x31)
#define ID_BUTTON_4          (GUI_ID_USER + 0x32)
#define ID_EDIT_1              (GUI_ID_USER + 0x33)
#define ID_BUTTON_5          (GUI_ID_USER + 0x34)
#define ID_FRAMEWIN_2          (GUI_ID_USER + 0x35)
#define ID_TEXT_3              (GUI_ID_USER + 0x36)
#define ID_EDIT_2              (GUI_ID_USER + 0x37)
#define ID_EDIT_3              (GUI_ID_USER + 0x38)
#define ID_TEXT_4              (GUI_ID_USER + 0x39)
#define ID_TEXT_5              (GUI_ID_USER + 0x3A)
#define ID_TEXT_6              (GUI_ID_USER + 0x3B)

WM_HWIN  hWinMonitor;

static WM_CALLBACK*     _pcbOldFrameSC;



MonitorMeauInfo gsMonitorMeauInfo;



extern char KeypadDisplayData[10];                                                                        //小键盘显示数据
extern char NumberData[11];                                                                //数字数据

/*
*********************************************************************************************************
*                                     对话框GUI_WIDGET_CREATE_INFO类型数组
*********************************************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreateSC[] = {
    { FRAMEWIN_CreateIndirect,  "Caption",           ID_FRAMEWIN_2,           0,  20,  240, 280, 0, 0},
   
    { CHECKBOX_CreateIndirect,   "Checkbox",             ID_CHECKBOX_0,         162, 10,  70,  20, 0, 0x0, 0 },
    { CHECKBOX_CreateIndirect,     "Checkbox",         ID_CHECKBOX_1,               162, 35,  70,  20, 0, 0x0, 0 },
    { BUTTON_CreateIndirect,    "读取角度",     ID_BUTTON_4,          160, 73,  70,  20,  0, 0},
   
    { EDIT_CreateIndirect,          NULL,             ID_EDIT_1,               160, 98,  70,  20,  0, 0},
    { BUTTON_CreateIndirect,    "写入角度",     ID_BUTTON_5,          160, 123,  70,  20,  0, 0},
   
    { TEXT_CreateIndirect,          "计数:",         ID_TEXT_4,               160, 151,  30,  20,  0, 0x64, 0 },
    { EDIT_CreateIndirect,          NULL,             ID_EDIT_2,               190, 148,  40,  20,  0, 0},
   
    { TEXT_CreateIndirect,          "本车车速:",          ID_TEXT_5,           160, 176,  70,  20,  0, 0x64, 0 },
    { EDIT_CreateIndirect,          "200",             ID_EDIT_3,               160, 198,  40,  20,  0, 0},
    { TEXT_CreateIndirect,          "KM/H",          ID_TEXT_6,                 203, 201,  30,  20,  0, 0x64, 0 },
   
    { TEXT_CreateIndirect,          NULL,             ID_TEXT_3,               160, 223,  70,  97,  0, 0x64, 0 },
   
};

/*******************************************************************
*
*       _cbFrame  //框架窗口的回调函数,注意和框架窗口客户端窗口的回调函数区分开。
*/
static void _cbFrameSC(WM_MESSAGE * pMsg)
{               
    int Id;
   
    switch (pMsg->MsgId)
    {
        case WM_NOTIFY_PARENT:
        if (pMsg->Data.v == WM_NOTIFICATION_RELEASED)
        {
            Id = WM_GetId(pMsg->hWinSrc);      
            if (Id == GUI_ID_CLOSE)
            {
               
                MEAU_Sel = MainMeau_SEL;
//                WM_DeleteWindow(hWinMonitor);
                MainMeau();

//                MEAU_Sel = MonitorMeau_SEL;
//                WM_DeleteWindow(hWinMain);
//                MonitorMeau();
            }
        }
        break;
    }
    if (_pcbOldFrameSC)
    {
    (*_pcbOldFrameSC)(pMsg);
    }
}


/*
*********************************************************************************************************
*    函 数 名: InitDialog1
*    功能说明: 回调函数中的控件初始化消息
*    形    参:pMsg 指针参数            
*    返 回 值: 无
*********************************************************************************************************
*/
static void InitDialogSC(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;
    WM_HWIN hWin = pMsg->hWin;
    //
    //FRAMEWIN
    //
   
    FRAMEWIN_SetFont(hWin,&XBF_Font16);
    FRAMEWIN_SetText(hWin,"目标监控");   //设置标题文本
    FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);        //设置文字对齐方式
    FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);        //关闭按键

    FRAMEWIN_SetTitleHeight(hWin,18);
    FRAMEWIN_Maximize(hWin);
    FRAMEWIN_SetActive(hWin,1);
    FRAMEWIN_SetTextColor(hWin,GUI_BLACK);
   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_4);
    BUTTON_SetFont(hItem,&XBF_Font12);

   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_5);
    BUTTON_SetFont(hItem,&XBF_Font12);

   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_1);
    EDIT_EnableBlink(hItem,500,1);
    EDIT_SetTextAlign(hItem,GUI_TA_HCENTER);
    EDIT_SetFont(hItem,&XBF_Font16);
    WM_DisableWindow(hItem);
   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_3);
    TEXT_SetFont(hItem, &XBF_Font12);
    TEXT_SetBkColor(hItem,GUI_WHITE);
    TEXT_SetDefaultTextColor(GUI_BLACK);
    TEXT_SetWrapMode(hItem,GUI_WRAPMODE_CHAR);
    WM_DisableWindow(hItem);
   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_0);
    CHECKBOX_SetFont(hItem,&XBF_Font12);
    CHECKBOX_SetTextColor(hItem,GUI_BLACK);
    CHECKBOX_SetText(hItem, "左雷达 ");
    CHECKBOX_SetFocusColor(hItem,GUI_DARKBLUE);
    CHECKBOX_SetState(hItem,1);

   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_1);
    CHECKBOX_SetFont(hItem,&XBF_Font12);
    CHECKBOX_SetTextColor(hItem,GUI_BLACK);
    CHECKBOX_SetText(hItem, "右雷达 ");
    CHECKBOX_SetFocusColor(hItem,GUI_DARKBLUE);
    CHECKBOX_SetState(hItem,1);


    hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_2);
    EDIT_EnableBlink(hItem,500,0);
    EDIT_SetTextAlign(hItem,GUI_TA_HCENTER);
    EDIT_SetFont(hItem,&XBF_Font16);
    EDIT_SetDecMode(hItem,0,0,900,0,0);
   
    WM_DisableWindow(hItem);
   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_3);
    EDIT_EnableBlink(hItem,500,0);
    EDIT_SetTextAlign(hItem,GUI_TA_HCENTER);
    EDIT_SetFont(hItem,&XBF_Font16);
    EDIT_SetDecMode(hItem,0,0,250,0,0);
    WM_DisableWindow(hItem);
   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_4);
    TEXT_SetFont(hItem, &XBF_Font12);
    TEXT_SetWrapMode(hItem,GUI_WRAPMODE_CHAR);
    WM_DisableWindow(hItem);
   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_5);
    TEXT_SetFont(hItem, &XBF_Font12);
    TEXT_SetWrapMode(hItem,GUI_WRAPMODE_CHAR);
    WM_DisableWindow(hItem);
   
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_6);
    TEXT_SetFont(hItem, &XBF_Font12);
    TEXT_SetWrapMode(hItem,GUI_WRAPMODE_CHAR);
    WM_DisableWindow(hItem);
   
}

/*
*********************************************************************************************************
*    函 数 名: _cbCallback1
*    功能说明: 回调函数
*    形    参:pMsg 指针参数            
*    返 回 值: 无
*********************************************************************************************************
*/
static void _cbCallbackSC(WM_MESSAGE * pMsg)
{
    int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
    WM_MESSAGE pMsgInfo;
   
    switch (pMsg->MsgId)
    {
        case WM_PAINT:
            
            if(gsMonitorMeauInfo.nTargetDisplayFlag == 0)
            {
            
                TargetDisplayWindowInit();
//                gsMonitorMeauInfo.nTargetDisplayFlag = 1;
            }
            else
            {
                TargetDisplayWindowInit();
                TargetLoad();
            }
            
            
            break;
        
        case WM_INIT_DIALOG:
            
            InitDialogSC(pMsg);
        
            break;
        case MSG_SetFigureDisplay:   
            
            hWin = WM_GetDialogItem(pMsg->hWin, ID_EDIT_1);
            EDIT_SetText(hWin, KeypadDisplayData);
        
            break;
        case MSG_SetENTER:
            
            
            switch(gsMonitorMeauInfo.WINTOOL_Sel)
            {
                case 0:
                    
                    hWin = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_0);
               
                    break;
                case 1:
                    
                    hWin = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_1);
               
                    break;
                case 2:
                    
                    hWin = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_4);
               
                    break;
                case 3:
                    
                    hWin = WM_GetDialogItem(pMsg->hWin, ID_EDIT_1);
               
                    break;
                case 4:
                    
                    
                hWin = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_5);
               
                    break;
                default:
                    break;
            
            }
            pMsgInfo.MsgId = WM_NOTIFY_PARENT;                    //消息ID
            pMsgInfo.hWinSrc = hWin;                        //源窗口
            pMsgInfo.Data.v = WM_NOTIFICATION_CLICKED;            //数据值
            WM_SendMessage(WM_GetClientWindow(hWinMonitor), &pMsgInfo);                //向窗口发送消息,这里是父窗口
        
            break;
        /*  设置ICON的聚焦 */
        case MSG_SetICONFocus:
   
            switch(gsMonitorMeauInfo.WINTOOL_Sel)
            {
                case 0:
                    
                    hWin = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_0);
               
                    break;
                case 1:
                    
                    hWin = WM_GetDialogItem(pMsg->hWin, ID_CHECKBOX_1);
               
                    break;
                case 2:
                    
                    hWin = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_4);
               
                    break;
                case 3:
                    
                    hWin = WM_GetDialogItem(pMsg->hWin, ID_EDIT_1);
               
                    break;
                case 4:
                    
                    
                hWin = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_5);
               
                    break;
                default:
                    break;
            
            }
        
            WM_SetFocus(hWin);
            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 (Id)
            {
                case GUI_ID_OK:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        GUI_EndDialog(hWin, 0);
                    break;
                case GUI_ID_CANCEL:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        GUI_EndDialog(hWin, 0);
                    break;
               
                    
                case ID_BUTTON_4:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:                                            
                           

                            gsMonitorMeauInfo.DriverType  = MonitorMeauTypeChoose();
                            if((gsMonitorMeauInfo.DriverType == DEVICE_REAR_RADAR_LEFT) || (gsMonitorMeauInfo.DriverType == DEVICE_REAR_RADAR_RIGHT))
                            {
                        
                                ReadAngle(gsMonitorMeauInfo.DriverType,pMsg,ID_TEXT_3);//执行读取角度功能函数
                                
                            }
                            else
                            {
                                hWin = WM_GetDialogItem(hWin, ID_TEXT_3);
                                TEXT_SetText(hWin,"\\n  请重设: \\n\\n 目标类型");
                                GUI_Exec();
                            }
                           
                           break;
                    }
                    break;
                case ID_BUTTON_5:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:                                             


                            gsMonitorMeauInfo.DriverType  = MonitorMeauTypeChoose();
                            if((gsMonitorMeauInfo.DriverType == DEVICE_REAR_RADAR_LEFT) || (gsMonitorMeauInfo.DriverType == DEVICE_REAR_RADAR_RIGHT))
                            {
                                
                                WriteAngle(gsMonitorMeauInfo.DriverType,pMsg,ID_TEXT_3);//执行写入角度功能函数
                            }
                            else
                            {
                                hWin = WM_GetDialogItem(hWin, ID_TEXT_3);
                                TEXT_SetText(hWin,"\\n  请重设: \\n\\n 目标类型");
                                GUI_Exec();
                                
                                
                            }
                            break;
                    }
                    break;
                    
                default:
                    break;
                    
            }
            break;
            
        default:
            WM_DefaultProc(pMsg);
   
    }
}

void MonitorMeau(void)
{
    gsMonitorMeauInfo.WINTOOL_Sel = 0;
    gsMonitorMeauInfo.Key_Sel = 0;
    gsMonitorMeauInfo.Minus = 0xAA;
    gsMonitorMeauInfo.DecimalPoint = 0xAA;
    gsMonitorMeauInfo.nTargetDisplayFlag = 0;
    gsMonitorMeauInfo.DataCnt = 0;
    hWinMonitor = GUI_CreateDialogBox(_aDialogCreateSC, GUI_COUNTOF(_aDialogCreateSC), &_cbCallbackSC, 0, 0, 0);
    _pcbOldFrameSC = WM_SetCallback(hWinMonitor, _cbFrameSC);//通过函数 WM_SetCallback 设置框架窗口的回调函数
   
}   

void MonitorMeauKeyResponse(u8 nValue)   
{
   
    WM_MESSAGE pMsgInfo;
    WM_HWIN hWin;
   
    switch(nValue)
    {

        case Num_Up_D:                                                                    //第一层选择切换、第二层的选择切换
        case Num_Left_D:
            
            
                gsMonitorMeauInfo.WINTOOL_Sel = MonitorMeauTool();
                if(gsMonitorMeauInfo.WINTOOL_Sel > 0)
                {
                    gsMonitorMeauInfo.WINTOOL_Sel--;
               
                }
                else
                {
                    gsMonitorMeauInfo.WINTOOL_Sel = 4;
                }
                WM_SendMessageNoPara(WM_GetClientWindow(hWinMonitor), MSG_SetICONFocus);
            

            break;
        case Num_Down_D:                                                                //第一层选择切换、第二层的选择切换
        case Num_Right_D:
               
            
                gsMonitorMeauInfo.WINTOOL_Sel = MonitorMeauTool();
                if(gsMonitorMeauInfo.WINTOOL_Sel < 4)
                {
                    gsMonitorMeauInfo.WINTOOL_Sel++;
               
                }
                else
                {
                    gsMonitorMeauInfo.WINTOOL_Sel = 0;
                }
                WM_SendMessageNoPara(WM_GetClientWindow(hWinMonitor), MSG_SetICONFocus);      //向窗口发送无参数的消息,窗口句柄,要发送的消息的ID
            
            break;
        case Num_Affirm:                             //第一层的确定选择

               
            if(gsMonitorMeauInfo.WINTOOL_Sel == 0)
            {
               
                GUI_SendKeyMsg(GUI_KEY_SPACE, 1);
            
            }
            else if(gsMonitorMeauInfo.WINTOOL_Sel == 1)
            {
                GUI_SendKeyMsg(GUI_KEY_SPACE, 1);
            
            }
            else
            {
                WM_SendMessageNoPara(WM_GetClientWindow(hWinMonitor), MSG_SetENTER);                 //向窗口发送无参数的消息,窗口句柄,要发送的消息的ID
            }
        
            
        
            
            break;
        case Num_Exit:                                //当前菜单的退出。
            
            
                hWin = WM_GetDialogItem(hWinMonitor, GUI_ID_CLOSE);
                pMsgInfo.MsgId = WM_NOTIFY_PARENT;                    
                pMsgInfo.hWinSrc = hWin;                        
                pMsgInfo.Data.v = WM_NOTIFICATION_RELEASED;            
                WM_SendMessage(hWinMonitor, &pMsgInfo);   
        
            break;
        case Num_0:
        case Num_1:
        case Num_2:        
        case Num_3:
        case Num_4:
        case Num_5:
        case Num_6:     
        case Num_7:
        case Num_8:         
        case Num_9:     
            if(gsMonitorMeauInfo.WINTOOL_Sel == 3)
            {
                if(gsMonitorMeauInfo.Key_Sel == 8 )
                {
                    break;
                }
                KeypadDisplayData[gsMonitorMeauInfo.Key_Sel] = NumberData[nValue];
                WM_SendMessageNoPara(WM_GetClientWindow(hWinMonitor), MSG_SetFigureDisplay);
                gsMonitorMeauInfo.Key_Sel++;
            }
        
            break;
        
        case Num_2x2:             //小数点
            if(gsMonitorMeauInfo.WINTOOL_Sel == 3)
            {
                if((gsMonitorMeauInfo.Key_Sel == 8) || (gsMonitorMeauInfo.DecimalPoint != 0xAA) || (gsMonitorMeauInfo.Key_Sel == 0))
                {
                    break;
                }
                if((gsMonitorMeauInfo.Minus != 0xAA) && gsMonitorMeauInfo.Key_Sel == 1)
                {
                    break;
               
                }
                KeypadDisplayData[gsMonitorMeauInfo.Key_Sel] = '.';
               
                gsMonitorMeauInfo.DecimalPoint = gsMonitorMeauInfo.Key_Sel;
               
                WM_SendMessageNoPara(WM_GetClientWindow(hWinMonitor), MSG_SetFigureDisplay);
                gsMonitorMeauInfo.Key_Sel++;
               
            }
            break;
        case Num_Asterisk:         //负号
            if(gsMonitorMeauInfo.WINTOOL_Sel == 3)
            {
                if((gsMonitorMeauInfo.Key_Sel == 8) || (gsMonitorMeauInfo.Minus != 0xAA)|| (gsMonitorMeauInfo.Key_Sel != 0))
                {
                    break;
                }
                KeypadDisplayData[gsMonitorMeauInfo.Key_Sel] = '-';
               
                gsMonitorMeauInfo.Minus = gsMonitorMeauInfo.Key_Sel;
               
                WM_SendMessageNoPara(WM_GetClientWindow(hWinMonitor), MSG_SetFigureDisplay);
                gsMonitorMeauInfo.Key_Sel++;
               
            }
            break;
        case Num_Delete:        //删除键
            
            if(gsMonitorMeauInfo.WINTOOL_Sel == 3)            //当前选择为角度输入文本框时,这些按键才有作用
            {
                if(gsMonitorMeauInfo.Key_Sel < 1)
                {
                    break;
                }
                gsMonitorMeauInfo.Key_Sel--;
               
                KeypadDisplayData[gsMonitorMeauInfo.Key_Sel] = NULL;
                if(gsMonitorMeauInfo.Minus == gsMonitorMeauInfo.Key_Sel)
                {
                    gsMonitorMeauInfo.Minus = 0xAA;
               
                }
                if(gsMonitorMeauInfo.DecimalPoint == gsMonitorMeauInfo.Key_Sel)
                {
                    gsMonitorMeauInfo.DecimalPoint = 0xAA;
               
                }
               
                WM_SendMessageNoPara(WM_GetClientWindow(hWinMonitor), MSG_SetFigureDisplay);
               
            }
            
            break;
        case Num_Function:        //功能键
                if(gsMonitorMeauInfo.nTargetDisplayFlag == 0)
                {
                    gsMonitorMeauInfo.nTargetDisplayFlag = 1;
               
                }
                else
                {
                    gsMonitorMeauInfo.nTargetDisplayFlag = 0;
               
                }
               
            
                break;
        default:               
            
            break;
    }
}   

/*********************************************
函数名:    int AngleMeauTool(void)
功能:        获取当前聚焦控件的ID
输入:        无

输出:        无
返回值:    当前聚焦控件的ID - 0x810
*********************************************/
int MonitorMeauTool(void)
{
    int Id;
    WM_HWIN hWin;
   
    hWin = WM_GetFocussedWindow();
    Id = WM_GetId(hWin);
   
    Id = Id -0x830;
   
    return Id;
   
}

u8 MonitorMeauTypeChoose(void)
{
   
    int nFlag1,nFlag2;
   
    nFlag1 = CHECKBOX_GetState(WM_GetDialogItem(WM_GetClientWindow(hWinMonitor), ID_CHECKBOX_0));
    nFlag2 = CHECKBOX_GetState(WM_GetDialogItem(WM_GetClientWindow(hWinMonitor), ID_CHECKBOX_1));
   
    GUI_Exec();   
   
    if((nFlag1 == 1) && (nFlag2==0))
    {

        return DEVICE_REAR_RADAR_LEFT;
   
    }
    else if((nFlag1 == 0) && (nFlag2 ==1))
    {
        return DEVICE_REAR_RADAR_RIGHT;
   
    }
    else if((nFlag1 == 1) && (nFlag2 ==1))
    {
        return 0x55;
   
    }
   
    return 0xAA;

}

void TargetDisplayStart(void)
{
   
    u8 nFlag1,nFlag2;
    GUI_RECT Rect;          //绝对坐标
    TargetData* pTargetData;
   
    if(!gsSysTime.TargetUpdade)
    {
        gsSysTime.TargetUpdade = 50;
        pTargetData = &gsaTargetData[DEVICE_REAR_RADAR_LEFT];
        nFlag1 = pTargetData->UpdateFlag;
        
        pTargetData = &gsaTargetData[DEVICE_REAR_RADAR_RIGHT];
        nFlag2 = pTargetData->UpdateFlag;

        if(nFlag1||nFlag2)
        {
            Rect.x0 = 11;
            Rect.y0  =25;
            Rect.y1 = 160;
            Rect.y1 = 312;
            WM_InvalidateRect(hWinMonitor,&Rect);
//            GUI_Exec();
        
        }
   
    }
}
void TargetLoad(void)
{
    u8 nType,i,nFlag1,nFlag2;
   
    TargetData* pTargetData;
   
    gsMonitorMeauInfo.DataCnt++;
    EDIT_SetValue(WM_GetDialogItem(WM_GetClientWindow(hWinMonitor), ID_EDIT_2), gsMonitorMeauInfo.DataCnt);
    EDIT_SetValue(WM_GetDialogItem(WM_GetClientWindow(hWinMonitor), ID_EDIT_3), gsVehicleInfo.Speed/10);
   
   
    nType = MonitorMeauTypeChoose();
    if(nType == DEVICE_REAR_RADAR_LEFT)
    {
        pTargetData = &gsaTargetData[DEVICE_REAR_RADAR_LEFT];
        
        if(pTargetData->UpdateFlag)
        {
            pTargetData->UpdateFlag = 0;
            for(i = 0;i < pTargetData->Cnt;i++)
            {
               
                TargetDraw(nType,pTargetData->RadarTargetData.CrossDistance,pTargetData->RadarTargetData.Distance);
            
            }
        
        }
        
    }
    else if(nType == DEVICE_REAR_RADAR_RIGHT)
    {
   
        pTargetData = &gsaTargetData[DEVICE_REAR_RADAR_RIGHT];
        if(pTargetData->UpdateFlag)
        {
            pTargetData->UpdateFlag = 0;
            for(i = 0;i < pTargetData->Cnt;i++)
            {
               
                TargetDraw(nType,pTargetData->RadarTargetData.CrossDistance,pTargetData->RadarTargetData.Distance);
            
            }
            
        }
        
    }
    else if(nType == 0x55)
    {
        
        
        pTargetData = &gsaTargetData[DEVICE_REAR_RADAR_LEFT];
        nFlag1 = pTargetData->UpdateFlag;
        pTargetData->UpdateFlag = 0;
        pTargetData = &gsaTargetData[DEVICE_REAR_RADAR_RIGHT];
        nFlag2 = pTargetData->UpdateFlag;
        pTargetData->UpdateFlag = 0;
        if(nFlag1||nFlag2)
        {
            pTargetData = &gsaTargetData[DEVICE_REAR_RADAR_LEFT];
            
            for(i = 0;i < pTargetData->Cnt;i++)
            {
                TargetDraw(DEVICE_REAR_RADAR_LEFT,pTargetData->RadarTargetData.CrossDistance,pTargetData->RadarTargetData.Distance);
            
            }
            pTargetData = &gsaTargetData[DEVICE_REAR_RADAR_RIGHT];
            for(i = 0;i < pTargetData->Cnt;i++)
            {
                TargetDraw(DEVICE_REAR_RADAR_RIGHT,pTargetData->RadarTargetData.CrossDistance,pTargetData->RadarTargetData.Distance);
            
            }
        }
        
    }
   
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2017-9-23 00:45:11 | 显示全部楼层

回 mengtu 的帖子

mengtu:#include "MainTask.h"

#pragma  diag_suppress 870                //编译警告屏蔽

....... (2017-09-22 10:19) 
仅看你提供的代码,没有发现什么问题。另外你重绘里面的窗口初始化做了什么。
回复

使用道具 举报

4

主题

81

回帖

4

积分

初级会员

积分
4
发表于 2017-9-23 08:17:15 | 显示全部楼层
按道理407已经足够快了,不应出现“忙不过来”
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2017-9-23 11:01:37 | 显示全部楼层

回 astudent 的帖子

astudent:按道理407已经足够快了,不应出现“忙不过来” (2017-09-23 08:17) 
TargetDraw(nType,pTargetData->RadarTargetData.CrossDistance,pTargetData->RadarTargetData.Distance);
你说的这个函数吗?填充矩形。
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2017-9-23 11:02:04 | 显示全部楼层

回 astudent 的帖子

astudent:按道理407已经足够快了,不应出现“忙不过来” (2017-09-23 08:17) 
TargetDraw(nType,pTargetData->RadarTargetData.CrossDistance,pTargetData->RadarTargetData.Distance);
你说的这个函数吗?填充矩形。
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2017-9-23 11:03:42 | 显示全部楼层

回 mengtu 的帖子

mengtu:TargetDraw(nType,pTargetData->RadarTargetData.CrossDistance,pTargetData->RadarTargetData.Distance);
你说的这个函数吗?填充矩形。 (2017-09-23 11:02) 
我觉得应该是冲突,GUI_ID_CLOSE和WM_PAINT
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2017-9-25 09:07:47 | 显示全部楼层

回 mengtu 的帖子

mengtu:我觉得应该是冲突,GUI_ID_CLOSE和WM_PAINT (2017-09-23 11:03) 
解决没,还是老样子吗
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2017-9-25 19:41:06 | 显示全部楼层

回 eric2013 的帖子

eric2013:解决没,还是老样子吗 (2017-09-25 09:07) 
我在关闭按钮那里查看刷新控制变量,如果正在刷新,那就把刷新控制变量置位,然后提示再点击才退出,用return直接返回,不会关闭,下一次点击就关闭了。然后就不会出现之前说的情况。准备再试试,启动定时器,延时100MS左右时间后再重发关闭的ID。这样估计应该就能感觉不出来了吧。得试试。。。。。
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2017-9-25 19:43:42 | 显示全部楼层

回 eric2013 的帖子

eric2013:解决没,还是老样子吗 (2017-09-25 09:07) 
另外之前提到的按键卡顿的问题,加了一个流程控制的变量,来做到刷新一次后必须检测一次实体按键然后再刷新。也没什么问题了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 18:55 , Processed in 0.243810 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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