硬汉嵌入式论坛

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

[emWin] 窗口创建和移动窗口使用存储设备遇到的问题??

[复制链接]

4

主题

50

回帖

62

积分

初级会员

积分
62
发表于 2018-1-29 11:51:02 | 显示全部楼层 |阅读模式
版主,各位坛友大家好,最近学习EMWIN遇到了一个问题,创建窗口移动时使能存储设备时显示不正常,而且把不是窗口的部分给填充了,失能存储设备后,一切演示正常,效果如下所示,请大家帮我解答一下,谢谢!!!!!!!!!!!!!
一、使能存储设备现象:
thumb106879.jpg thumb106821.jpg
二、失能存储设备现象
thumb106819.jpg thumb106818.jpg
三、问题:
1.我的EMWIN用的内存总大小为960*1024,足以演示这个例程,而且在电脑上仿真也正常,移植到板子上就不正常了?而且使用存储设备的宏#defineGUI_SUPPORT_MEMDEV (1) 也定义了。移动时边框也异常了,不整齐。
2.创建的窗口使用内储设备来重绘,背影回调刷新是0,50,320,240这个区域,但为什么在失效WM_Invalidate(WM_HBKWIN);这个之后,上面的标题也给乱填充了呢?
//===========================================================================背景窗口回调函数
static void _cbBkWindow(WM_MESSAGE *pMsg)
{
       
        switch(pMsg->MsgId) //¸ù¾Y2»í¬μÄÏûÏ¢ààDí′|àí
        {
                case WM_PAINT:   
                 
                        GUI_ClearRect(0,50,320,210);

                        break;
                default:
                        WM_DefaultProc(pMsg);  
                break;
        }
               
}
//===========================================================================创建窗口回调函数
static void _cbWindow(WM_MESSAGE *pMsg)
{
        GUI_RECT Rect;

        switch(pMsg->MsgId)
        {
                case WM_PAINT:
                {
                        WM_GetInsideRect(&Rect);  
                        GUI_SetBkColor(GUI_RED);
                        GUI_SetColor(GUI_YELLOW);
                        GUI_ClearRectEx(&Rect);          
                        GUI_DrawRectEx(&Rect);          
                        GUI_SetColor(GUI_BLACK);
                        GUI_SetFont(&GUI_Font16_ASCII);  
                        GUI_DispStringHCenterAt("Foreground Window",75,40);
                        break;
                }
                default:
                {
                        WM_DefaultProc(pMsg);
                  break;
                }
        }
               
}

//===========================================================================移动窗口
static void _MoveWindow(const char* pText)
{
        WM_HWIN hWnd;
        int i;
        hWnd = WM_CreateWindow(50,50,150,100,WM_CF_SHOW,_cbWindow,0);

        for(i=0;i<20;i++)
        {
                WM_MoveWindow(hWnd,3,3);  
                GUI_Delay(10);
        }
        if(pText)
        {
                GUI_DispStringAt(pText,5,50);
                GUI_Delay(300);
        }
       
        WM_DeleteWindow(hWnd);  
        WM_Invalidate(WM_HBKWIN);
        GUI_Exec();
       
}
//===========================================================================演示代码主函数
void Emwin_DemoRedraw(u8 index)
{
        char buff[45];
        WM_CALLBACK *_cbOldBK;
        GUI_SetBkColor(GUI_BLACK);  
        GUI_Clear();

        GUI_SetColor(GUI_WHITE);         
        GUI_SetFont(&GUI_Font24_ASCII);
        GUI_DispStringHCenterAt("WM_Redraw-Sample",160,5);
        GUI_SetFont(&GUI_Font16B_ASCII);  
       
        if(index)WM_DisableMemdev(WM_HBKWIN);//失能存储设备
        else WM_EnableMemdev(WM_HBKWIN);//使能存储设备

       
        while(1)
        {
                _MoveWindow("Background has not been redraw"); //ò&#198;&#182;ˉ′°&#191;ú

                sprintf(buff,"GUI UsedBlocks: %.8d FreeBlocks: %.8d\r\n", GUI_ALLOC_GetNumUsedBlocks(), GUI_ALLOC_GetNumFreeBlocks());
               GUI_DispStringHCenterAt(buff,160,210);

                GUI_Delay(2000);
                _cbOldBK = WM_SetCallback(WM_HBKWIN,_cbBkWindow);
                _MoveWindow("Background has been redraw");
                WM_SetCallback(WM_HBKWIN,_cbOldBK);
                sprintf(buff,"GUI UsedBlocks: %.8d FreeBlocks: %.8d\r\n", GUI_ALLOC_GetNumUsedBlocks(), GUI_ALLOC_GetNumFreeBlocks());
                GUI_DispStringHCenterAt(buff,160,210);
                GUI_Delay(2000)        ;
                break;
        }

}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-1-29 12:01:54 | 显示全部楼层
你的是不是F1/F4 + 外部SRAM搞的,如果是的话,你的SRAM不给力,布线上应该存在些问题。改用内部SRAM测试下,应该就不存在这种问题了。
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-1-29 12:07:01 | 显示全部楼层
eric2013 发表于 2018-1-29 12:01
你的是不是F1/F4 + 外部SRAM搞的,如果是的话,你的SRAM不给力,布线上应该存在些问题。改用内部SRAM测试下 ...

是的,我用的是外部SRAM 1M,改成F4片上的RAM还是一样的现象,EMWIN版本是5.32B
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-1-29 12:10:15 | 显示全部楼层
bebj2009 发表于 2018-1-29 12:07
是的,我用的是外部SRAM 1M,改成F4片上的RAM还是一样的现象,EMWIN版本是5.32B

测试下你的这个程序在模拟器上面跑是否正常。
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-1-29 13:17:21 | 显示全部楼层
eric2013 发表于 2018-1-29 12:10
测试下你的这个程序在模拟器上面跑是否正常。

模拟器上正常的,而且我专门创建了一个存储设备是可以画图的,为啥使用到窗口就不行了,//===========================================================================分段存储演示
void Emwin_DemoBandingMemdev(u8 index)
{
        tDrawItContext DrawItContext;
        int i, swap=0;
       
        GUI_SetBkColor(GUI_BLACK);
        GUI_Clear();
       
        GUI_SetColor(GUI_YELLOW);
        GUI_SetFont(&GUI_Font24_ASCII);
        GUI_DispStringHCenterAt("10.MEMDEV_Banding - Sample", 160, 5);
        GUI_SetFont(&GUI_Font16_ASCII);
        GUI_DispStringHCenterAt("Banding memory device\nwithout flickering", 160, 40);
       
        DrawItContext.XPos_Poly = 160;
        DrawItContext.YPos_Poly = 120;
        DrawItContext.YPos_Text = 116;
        while (1)
        {
                swap = ~swap;
                for (i = 0; i < 220; i++)
                {
                        float angle = i * 3.1415926 / 60;
                        DrawItContext.XPos_Text = (swap) ? i : 220 - i;
                       
                        GUI_RotatePolygon(DrawItContext.aPointsDest, abwms,SIZE_OF_ARRAY(abwms),  
                       
                        if(index)
                        {
                                GUI_RECT Rect = {0, 70, 320,170};
                                GUI_MEMDEV_Draw(&Rect,&Emwin_DrawIt,&DrawItContext,0,0); //分段存储演示
                        }
                        else Emwin_DrawIt((void *)&DrawItContext);
                }
                break;
        }
}
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-1-29 14:15:13 | 显示全部楼层
各位坛友,解决了,折腾了2天啊,原来我在初始化之前设了一个标志,就出错了如下
void MAIN_task(void *pdata)//代码中创建的一个任务
{
        static u8 anti=0;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);  
       WM_SetCreateFlags(WM_CF_MEMDEV);//我在这之前设定了一个窗口标志,把这句屏蔽掉好OK了,实在让我很无语,看来EMWIN移植的全局思路还有待理清
        GUI_Init();                                           
       
       while(1)
        {  
             Emwin_DemoRedraw(anti);
            anti=~anti;       
           break;
       }                       

}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-1-30 01:18:24 | 显示全部楼层
bebj2009 发表于 2018-1-29 14:15
各位坛友,解决了,折腾了2天啊,原来我在初始化之前设了一个标志,就出错了如下
void MAIN_task(void *pd ...

回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-5-4 23:40:30 | 显示全部楼层
我用builder创建了一个对话框界面,我调用WM_InvalidateWindow(hWin)使窗体无效进行重绘,然后在WM_PAINT中调用重绘函数,但是我将窗体设置为无效后,对话框窗口并没有进行重绘,求高手指点原因
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-5-4 23:45:57 | 显示全部楼层
补充一下是framewin创建的小工具背景重绘不起作用
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-5-5 02:27:15 | 显示全部楼层
bebj2009 发表于 2018-5-4 23:40
我用builder创建了一个对话框界面,我调用WM_InvalidateWindow(hWin)使窗体无效进行重绘,然后在WM_PAINT中 ...

函数是在那个地方被调用的,WM_InvalidateWindow(hWin),另外这个句柄hWin是有效的句柄吧
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-5-5 09:13:29 | 显示全部楼层
是在定时器里面每秒更新一次无效化窗口,希望它重绘背景,现在是这个问题是:我釆用对话框窗口framewin_CreateindireCt不能重绘,釆用window__Createindirect结构的就能正常重绘,其它都是在自己窗口回调函数里面做的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-5-6 11:37:14 | 显示全部楼层
bebj2009 发表于 2018-5-5 09:13
是在定时器里面每秒更新一次无效化窗口,希望它重绘背景,现在是这个问题是:我釆用对话框窗口framewin_Create ...

如果是framewin_CreateindireCt的话,获取FrameWin的客户区窗口,然后使用这个句柄看看。
回复

使用道具 举报

9

主题

59

回帖

86

积分

初级会员

积分
86
发表于 2019-7-20 10:18:28 | 显示全部楼层
bebj2009 发表于 2018-5-4 23:40
我用builder创建了一个对话框界面,我调用WM_InvalidateWindow(hWin)使窗体无效进行重绘,然后在WM_PAINT中 ...

WM_Invalidate(WM_GetClientWindow(pMsg->hWin))这样写应该就好了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 05:04 , Processed in 0.272748 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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