硬汉嵌入式论坛

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

[emWin] 请教下,在emwin 控件里面调用 GUI 开头的函数工作貌似不稳定或者异常 ?

[复制链接]

692

主题

3583

回帖

5684

积分

论坛元老

积分
5684
发表于 2018-5-31 20:21:55 | 显示全部楼层 |阅读模式
请教下,在emwin 控件里面调用 GUI 开头的函数貌似不行 ?

请问一下有什么方法可以解决啊 ?

比如 GUI_DispStringAt((const char *) "25fgdg", 25, 23);

还有其他的划线、等等 ?????????

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-6-1 03:05:29 | 显示全部楼层
学习下我们新版emWin教程的这个章节:
https://forum.anfulai.cn/forum.p ... &extra=page%3D1

QQ截图20180601030554.png
回复

使用道具 举报

692

主题

3583

回帖

5684

积分

论坛元老

积分
5684
 楼主| 发表于 2018-6-1 09:36:27 | 显示全部楼层
本帖最后由 hpdell 于 2018-6-3 08:43 编辑

你,参考了,这个历程是使用点击某个按钮控件后跟新的,我也测试过,确实是可以的

但是我目前的这个使用方法是不需要点击某个按钮控件的,不知道有什么好方法啊 ??????
程序如下:

模拟日历程序:

typedef struct
{
        U16 X;                                           // X
        U16 Y;                                           // Y

        U16 X_x;                                         // X显示阴历 x 坐标
        U16 Y_y;                                         // Y显示阴历 y 坐标
        U32 Color;                                       // 颜色
        U8  Date;                                        // 日期

} CLD_DAY;


/**************************************************************************************
* FunctionName   : _DateToWeek()
* Description    : 通过日期获取周
* EntryParameter : year,  输入年 10进制
                   month, 输入月 10进制
                   day    输入日 10进制, day 固定输入为 1,切记切记
* ReturnValue    : 返回周
**************************************************************************************/
U8 _DayToWeek(U8 year, U8 month, U8 day)
{
        U8  i, y, m, d, weekDay;
        U16 ti = 2000;
        U32 days = 0;

        y = (year / 10)  * 10 + (year % 10);
        m = (month / 10) * 10 + (month % 10);
        d = (day / 10)   * 10 + (day % 10);

        for (i = 0; i<y; i++)
        {
                if (((ti % 4) == 0) && (((ti % 100) != 0) || ((ti % 400) == 0)))
                {
                        days += 366;
                }
                else
                {
                        days += 365;
                }
                ti++;
        }

        for (i = 1; i<m; i++)
        {
                switch (i)
                {
                        case 1:
                        case 3:
                        case 5:
                        case 7:
                        case 8:
                        case 10:
                        case 12:
                        {
                                days += 31;
                                break;
                        }

                        case 2:
                        {
                                ti = 2000 + y;
                                if (((ti % 4) == 0) && (((ti % 100) != 0) || ((ti % 400) == 0)))
                                {
                                        days += 29;
                                }
                                else
                                {
                                        days += 28;
                                }
                                break;
                        }

                        case 4:
                        case 6:
                        case 9:
                        case 11:
                        {
                                days += 30;
                                break;
                        }
                }
        }

        days    += d;
        weekDay  = (days % 7) + 5;
        weekDay %= 7;

        return weekDay;
}




#define USER_X_BASE_ADDR   1024-367
#define USER_Y_BASE_ADDR   32+332

/**************************************************************************************
* FunctionName   : _DrawCalendar()
* Description    : 绘制日历表格
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
//static const U8 cstWek[][4] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
const char *cstWek[] = { "日\0", "一\0", "二\0", "三\0", "四\0", "五\0", "六\0" };
void _DrawCalendar(WM_MESSAGE * pMsg, CLD_DAY *pDay)
{
        WM_HWIN  hWinOld;
        U8 i;
        U8 n ;
        int x1,x2,y;
        GUI_RECT  pRect;
        char pData[4];
        hWinOld = WM_SelectWindow(pMsg->hWin);
        
        GUI_SetBkColor(GUI_GRAY_C8);  //矩形区域背景色
        pRect.x0 = USER_X_BASE_ADDR;
        pRect.y0 = USER_Y_BASE_ADDR;
        pRect.x1 = 1024;
        pRect.y1 = 600;
    GUI_ClearRectEx      (&pRect);  //绘制矩形框背景色

        GUI_SetColor(GUI_WHITE);
        
        for ( i = 0; i < 7; i++)  
        {
    sprintf((char *)&pData[0],
                "%s",
                cstWek
                );
                GUI_SetFont(&GUI_FontHZ16);  //显示中文字体
                GUI_DispStringAt((const char *) & pData[0], USER_X_BASE_ADDR+4+8+(i*52), USER_Y_BASE_ADDR);  // 显示星期
        }

        y = (USER_Y_BASE_ADDR+16+1) ;  //24是年、月高度,16是星期高度
        x1 = USER_X_BASE_ADDR;
        x2 = 1024;
        GUI_SetColor(GUI_BROWN);      // 设置线条颜色
        GUI_SetFont(&GUI_Font16_ASCII);
        GUI_DrawHLine(y, x1, x2);    // 画水平线


// 设置日期显示坐标值

        for ( i = 0; i < 7; i++)        // 设置显示 阳历的 y坐标
        {
                for ( n = 0; n < 7; n++)
                {
                        {
                                pDay[i * 7 + n].Y = (USER_Y_BASE_ADDR +16+4 + (i * 36));  // 39 = (600-32-332-24-16-1)/5
                        }
                }
        }


        for ( i = 0; i < 7; i++)        // 设置显示 阳历的 x坐标
        {
                for ( n = 0; n < 6; n++)   // 显示 6行
                {
                        pDay[i + 7 * n].X = (12 + USER_X_BASE_ADDR + (i * 52));  // 12 是为了显示在每格的中间位置
                }
        }
        
        /* 配置回之前选择的目标窗口 */
        WM_SelectWindow(hWinOld);
}


/**************************************************************************************
* FunctionName   : _FillCalendar()
* Description    : 日历填写
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
//        static const U8 cstmonth[][4] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEQ", "OCT", "NOV", "DEC" };
static const U8 monthDay[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
void _FillCalendar(WM_MESSAGE * pMsg, CLD_DAY *pDay, U8 year, U8 month, U8 day)
{
        WM_HWIN  hWinOld;

        U8 tmpWek;
    U8 i;
hWinOld = WM_SelectWindow(pMsg->hWin);
        tmpWek = _DayToWeek(year, month, 0x01);                       // 获取星期

        for ( i = 0; i < tmpWek; i++)                               // 存储上月的
        {
                if (month == 0x01)
                {
                        pDay.Date = monthDay[12 - 1] - tmpWek + i + 1;
                }
                else
                {
                    pDay.Date = monthDay[month - 2] - tmpWek + i+1;      
            }

                pDay.Color = GUI_GRAY;
        }
        
        for ( i = 0; i < monthDay[month-1]; i++)
        {
                pDay[i + tmpWek].Date  = i+1;                               // 存储本月的
                pDay[i + tmpWek].Color = (day == i + 1) ? GUI_WHITE : GUI_MAGENTA;
        }

        for ( i = 0; i < 42 - tmpWek - monthDay[month-1]; i++)
        {
                if (month == 0x12)
                {
                        pDay[i + tmpWek + monthDay[1-1]].Date = i + 1;
                }
                else
                {
                        pDay[i + tmpWek + monthDay[month - 1]].Date = i + 1;    // 存储下月的
                }

                pDay[i + tmpWek + monthDay[month-1]].Color = GUI_GRAY;
        }

        for ( i = 0; i < 42; i++)
        {
                GUI_SetFont(&GUI_Font16B_ASCII);
                GUI_SetColor(pDay.Color);
                GUI_DispDecAt(pDay.Date, pDay.X, pDay.Y, ((pDay.Date > 10) ? 2 : 1));
        }
        /* 配置回之前选择的目标窗口 */
        WM_SelectWindow(hWinOld);
}



/**************************************************************************************
* FunctionName   : DisCalendar()
* Description    : 日历显示
* EntryParameter : year,  输入年 10进制
                   month, 输入月 10进制
                   day    输入日 10进制
* ReturnValue    : None
**************************************************************************************/
static CLD_DAY tmpDay[42];
void DisCalendar(WM_MESSAGE * pMsg, U8 year, U8 month, U8 day)
{
        _DrawCalendar(pMsg, tmpDay);
        _FillCalendar(pMsg, tmpDay, year, month, day);
}


// 在需要使用的地方使用

main()
{
WM_MESSAGE * pMsg;
... ...


switch(xx)
{

         /* 定时1秒更新一次时间 */
                case WM_TIMER:                     或者在 WM_PAINT 这个消息里面调用也行  ??????????
                        WM_InvalidateRect(hWin, &rRTC);   //指定区域无效化
                        GUI_ClockUpdate(pMsg);  
  

        break;



            case WM_PAINT :    // 此处 跟新或者上面跟新都不行,此时貌似程序比较容易死掉 ?????????????????
               DisCalendar( pMsg, 53, 11, 29);       //日期设置为 2053.11.29 日
             break;

}
}


回复

使用道具 举报

15

主题

56

回帖

101

积分

初级会员

积分
101
发表于 2018-6-1 10:30:28 | 显示全部楼层
hpdell 发表于 2018-6-1 09:36
你,参考了,这个历程是使用点击某个按钮控件后跟新的,我也测试过,确实是可以的

但是我目前的这个使 ...

代码太多没敢看,如果是想在对话框中用2D绘图,那要在WM_PAINT里面处理不知道对不对
回复

使用道具 举报

692

主题

3583

回帖

5684

积分

论坛元老

积分
5684
 楼主| 发表于 2018-6-1 14:30:05 | 显示全部楼层
drifting1024 发表于 2018-6-1 10:30
代码太多没敢看,如果是想在对话框中用2D绘图,那要在WM_PAINT里面处理不知道对不对

那需要在 WM_PAINT  如何处理 呀 ???
回复

使用道具 举报

692

主题

3583

回帖

5684

积分

论坛元老

积分
5684
 楼主| 发表于 2018-6-1 16:44:16 | 显示全部楼层
eric2013 发表于 2018-6-1 03:05
学习下我们新版emWin教程的这个章节:
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=19834&extr ...

刚刚在电脑模拟器运行时,发现,貌似开启了 WM_MULTIBUF_Enable(1); 这个就不行,如果不开启这个多缓冲貌似就可以了, 这个是怎么个情况啊 ?

但是如果不开启的话,刷新图片 等显示又会变得比较慢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-6-2 01:37:25 | 显示全部楼层
hpdell 发表于 2018-6-1 16:44
刚刚在电脑模拟器运行时,发现,貌似开启了 WM_MULTIBUF_Enable(1); 这个就不行,如果不开启这个多缓冲貌 ...

更新数值之类的,直接使用文本控件 就好了,简单省事,在WM_PAINT消息里面稍麻烦。
回复

使用道具 举报

692

主题

3583

回帖

5684

积分

论坛元老

积分
5684
 楼主| 发表于 2018-6-2 09:30:37 | 显示全部楼层
eric2013 发表于 2018-6-2 01:37
更新数值之类的,直接使用文本控件 就好了,简单省事,在WM_PAINT消息里面稍麻烦。

你好,我使用 emwin v5.32 版本的貌似就可以了,就是实现画线,举行等操作,而且开启了 多缓冲 也没有问题了,

貌似 v5.40 版本的不行
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-6-3 02:16:52 | 显示全部楼层
hpdell 发表于 2018-6-2 09:30
你好,我使用 emwin v5.32 版本的貌似就可以了,就是实现画线,举行等操作,而且开启了 多缓冲 也没有问 ...

估计是你程序的问题。回头我测试下我的万年历例子用5.40库。
回复

使用道具 举报

692

主题

3583

回帖

5684

积分

论坛元老

积分
5684
 楼主| 发表于 2018-6-3 08:08:33 | 显示全部楼层
eric2013 发表于 2018-6-3 02:16
估计是你程序的问题。回头我测试下我的万年历例子用5.40库。

好的,多谢多谢了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-19 17:27 , Processed in 0.046545 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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