硬汉嵌入式论坛

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

[emWin] 重绘概念的理解WM_PAINT,求助

[复制链接]

5

主题

36

回帖

5

积分

新手上路

积分
5
发表于 2013-12-12 17:30:04 | 显示全部楼层 |阅读模式
在桌面窗口创建8个button,每个BUTTON都有制定的图片,发现触摸其中一个BUTTON的时候,其他BUTTON竟然会闪烁,不知道是不是窗口重绘引起的?
重绘如果不设置回调函数,或者回调函数不对WM_PAINT,在操作过程中是否还是会重绘?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116779
QQ
发表于 2013-12-12 17:47:34 | 显示全部楼层
把你的重绘函数和button初始化函数贴出来看一下。
回复

使用道具 举报

5

主题

36

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-12-13 09:36:52 | 显示全部楼层

回 eric2013 的帖子

eric2013:
把你的重绘函数和button初始化函数贴出来看一下。
static void _cbBkWin(WM_MESSAGE * pMsg) {
        switch (pMsg->MsgId)
        {        
                case WM_PAINT:
                        //GUI_DrawGradientV(0, 0, 480, 272, GUI_BLUE, GUI_LIGHTCYAN);
                        //WM_SetDesktopColor(GUI_GREEN);
                        //GUI_Clear();
                        //LedToggle();
                        //_DrawBackground();
                        break;
                case WM_NOTIFY_PARENT:

                    if (pMsg->Data.v == WM_NOTIFICATION_CLICKED)
                        {
                                //WM_NOTIFICATION_CLICKED
                                                int Id = WM_GetId(pMsg->hWinSrc);
                                                switch (Id)
                                                {
                                                                case GUI_ID_BUTTON_LIJIA:

                                                                        LedOn();
                                                                  GUI_DispStringAtCEOL("Button_Lijia_Clicked", 160, 5);
                                                                        break;

                                                                case GUI_ID_BUTTON1_HUIKE:
                                                                 //for(int i = 0;i<10;i++)
                                                                // {
                                                                //_ShowBMPEx("alloffb.bmp", 400, 28);
                                                                        LedOn();
                                                                //GUI_Clear();//Rect(10, 10, 250, 100);
                                                                  GUI_DispStringAtCEOL("Button_Huike_Clicked", 160, 5);
                                                                        //halMcuWaitMs(300);
                                                                 //}                                                                 
                                                                        break;
                                                                case GUI_ID_BUTTON1:
                                                                break;
                                                                default:

                                                                        break;
                                                                //case GUI_ID_OK:

                                                                        //
                                                                        // No break here...
                                                                        //
                                                                //case GUI_ID_CANCEL:

                                                                //        break;
                                                }
                                }


                                if (pMsg->Data.v == WM_NOTIFICATION_RELEASED)
                                {
                                        int Id = WM_GetId(pMsg->hWinSrc);
                                        switch (Id)
                                        {
                                                case GUI_ID_BUTTON2:

                                                        LedOff();
                                                        GUI_DispStringAtCEOL("Button_Lijia_Released", 160, 5);
                                                break;

                                                case GUI_ID_BUTTON3:

                                                break;
                                                case GUI_ID_BUTTON9:
                                                        //GUI_Clear();
                                                        //BUTTON_Delete(button1);
                                                        //Button_Creat(8,button_ptr);
                                                break;
                                                case GUI_ID_BUTTON1:
                                                        //GUI_Clear();
                                                        //Button_Creat(1,icon);
                                                break;

                                        }
                                }
                        break;
                default:
                WM_DefaultProc(pMsg);
  }

}
void Button_Creat(unsigned char button_cnt, uint16_t * button_icon)
{
        BUTTON_Handle button1,button2,button3,button4,button5,button6,button7,button8;
        for(char i = 0; i < button_cnt; i++)
        {
                __NorFlashDataRead(2, gImage_test_b+i*28800, 318248 + 28800 * i, 28800);//button_icon,从FLASH读图标到外部SRAM。
                //NorFlashDataRead(2, gImage_test_b+i*28800, 318248 + 28800 * i, 28800);
        }
        switch(button_cnt)
        {
                //case 1:
                //        button1 = BUTTON_CreateEx(205,  79,  80, 90, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON9);
                ////        BUTTON_SetBitmap(button1, BUTTON_BI_UNPRESSED, &union_tubiao1);
                //        BUTTON_SetBitmap(button1, BUTTON_BI_PRESSED,   &union_tubiao1_1);
                //break;
                case 8:
                        //读flash数据
                    //__NorFlashDataRead(2, gImage_test_b, 318248, 230400);
                        //NorFlashDataRead (2, gImage_test_b, 318248, 115200);
                        button1 = BUTTON_CreateEx(55,  28,  80, 90, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON1);
                        button2 = BUTTON_CreateEx(153, 28,  80, 90, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON2);
                        button3 = BUTTON_CreateEx(254, 28,  80, 90, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON3);

                        button4 = BUTTON_CreateEx(351, 28,  80, 90, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON4);
                        button5 = BUTTON_CreateEx(55,  128, 80, 90, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON5);
                        button6 = BUTTON_CreateEx(153, 128, 80, 90, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON6);
                        button7 = BUTTON_CreateEx(254, 128, 80, 90, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON7);
                        button8 = BUTTON_CreateEx(351, 128, 80, 90, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_BUTTON8);

                        BUTTON_SetBitmap(button1, BUTTON_BI_UNPRESSED, &union_tubiao1);
                        BUTTON_SetBitmap(button1, BUTTON_BI_PRESSED,   &union_tubiao1_1);
                        BUTTON_SetBitmap(button2, BUTTON_BI_UNPRESSED, &union_tubiao2);
                        BUTTON_SetBitmap(button2, BUTTON_BI_PRESSED,   &union_tubiao2_1);
                        BUTTON_SetBitmap(button3, BUTTON_BI_UNPRESSED, &union_tubiao3);
                        BUTTON_SetBitmap(button3, BUTTON_BI_PRESSED,   &union_tubiao3_1);
                        BUTTON_SetBitmap(button4, BUTTON_BI_UNPRESSED, &union_tubiao4);
                        BUTTON_SetBitmap(button4, BUTTON_BI_PRESSED,   &union_tubiao4_1);
                        BUTTON_SetBitmap(button5, BUTTON_BI_UNPRESSED, &union_tubiao5);
                        BUTTON_SetBitmap(button5, BUTTON_BI_PRESSED,   &union_tubiao5_1);
                        BUTTON_SetBitmap(button6, BUTTON_BI_UNPRESSED, &union_tubiao6);
                        BUTTON_SetBitmap(button6, BUTTON_BI_PRESSED,   &union_tubiao6_1);
                        BUTTON_SetBitmap(button7, BUTTON_BI_UNPRESSED, &union_tubiao7);
                        BUTTON_SetBitmap(button7, BUTTON_BI_PRESSED,   &union_tubiao7_1);
                        BUTTON_SetBitmap(button8, BUTTON_BI_UNPRESSED, &union_tubiao8);
                        BUTTON_SetBitmap(button8, BUTTON_BI_PRESSED,   &union_tubiao8_1);               
                break;
        }        
}
void main()
{
        WM_CALLBACK       * pcbPrev;
        GUI_Init();
        pcbPrev = WM_SetCallback(WM_HBKWIN, _cbBkWin);
        Button_Creat(8,button_ptr);        
        while(1)
        {
                WM_Exec();
        }
}

屏的大小是4.3,分辨率是480*272,每个按钮的都是一个大小为80*90的图片。



























回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116779
QQ
发表于 2013-12-13 09:50:10 | 显示全部楼层

回 fcs19870906 的帖子

fcs19870906:static void _cbBkWin(WM_MESSAGE * pMsg) {
        switch (pMsg->MsgId)
        {        
       &nbs .. (2013-12-13 09:36) 
你的图片是不是从外部flash加载过来的,还是放在了内部flash
回复

使用道具 举报

5

主题

36

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-12-13 09:52:58 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的图片是不是从外部flash加载过来的,还是放在了内部flash (2013-12-13 09:50) 
图片数据以二进制的格式放在外部FLASH,外部RAM有512K,暂时是把用于按钮图标的图片在创建BUTTON之前,全部读到外部的RAM里面。
回复

使用道具 举报

5

主题

36

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-12-13 10:08:36 | 显示全部楼层

回 eric2013 的帖子

eric2013:

你的图片是不是从外部flash加载过来的,还是放在了内部flash
eric2013:

你的图片是不是从外部flash加载过来的,还是放在了内部flash
RTX截图未命名.png 测试后发现,交替触摸按钮时,以交替触摸按钮为左上角和右下角的区域内所有BUTTON都出现重绘。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116779
QQ
发表于 2013-12-13 10:22:56 | 显示全部楼层

回 fcs19870906 的帖子

fcs19870906: 测试后发现,交替触摸按钮时,以交替触摸按钮为左上角和右下角的区域内所有BUTTON都出现重绘。 (2013-12-13 10:08) 
其实问题就是出在这里了,以前我把图片全部都存到NOR,然后加载到内部RAM,然后用于按键显示,发现无法正常的显示,老是出一些莫名其妙的问题,有时候显示的都是一个图片。如果你的图片都是放在了内部flash也不会出现这个问题的。
回复

使用道具 举报

5

主题

36

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-12-13 10:38:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:其实问题就是出在这里了,以前我把图片全部都存到NOR,然后加载到内部RAM,然后用于按键显示,发现无法正常的显示,老是出一些莫名其妙的问题,有时候显示的都是一个图片。如果你的图片都是放在了内部flash也不会出现这个问题的。 (2013-12-13 10:22) 
目前是所有图片都可以正常显示。刚刚又测试了一下,直接按照上面的结构创建8个按钮,不对按钮做任何设置,不给按钮添加图片,就让系统自动生成。然后还是交替1和8按钮仍然会出现其他按钮闪烁的现象。ERIC,你手头有板的话可以试一下~
回复

使用道具 举报

0

主题

12

回帖

0

积分

新手上路

积分
0
发表于 2013-12-13 10:43:36 | 显示全部楼层

回 fcs19870906 的帖子

fcs19870906:目前是所有图片都可以正常显示。刚刚又测试了一下,直接按照上面的结构创建8个按钮,不对按钮做任何设置,不给按钮添加图片,就让系统自动生成。然后还是交替1和8按钮仍然会出现其他按钮闪烁的现象。ERIC,你手头有板的话可以试一下~ (2013-12-13 10:38) 
你外部flash存储图片,怎么把图片数据读出来给gui显示的,全部读?
回复

使用道具 举报

0

主题

12

回帖

0

积分

新手上路

积分
0
发表于 2013-12-13 10:48:56 | 显示全部楼层
你可以创建一个窗体或者对话框,在其中显示这8个button,不会出现你这种现象,已验证。
回复

使用道具 举报

5

主题

36

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-12-13 14:00:44 | 显示全部楼层

回 ouyangjian22 的帖子

ouyangjian22:你外部flash存储图片,怎么把图片数据读出来给gui显示的,全部读? (2013-12-13 10:43) 
没有全部,我界面最多显示8按钮,这8个按钮对应的图片数据就全部读到外部RAM里面。
回复

使用道具 举报

5

主题

36

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-12-13 16:46:59 | 显示全部楼层

回 fcs19870906 的帖子

fcs19870906:目前是所有图片都可以正常显示。刚刚又测试了一下,直接按照上面的结构创建8个按钮,不对按钮做任何设置,不给按钮添加图片,就让系统自动生成。然后还是交替1和8按钮仍然会出现其他按钮闪烁的现象。ERIC,你手头有板的话可以试一下~ (2013-12-13 10:38) 
ERIC,你好,比如我随便创建一个比较大的BUTTON,比如80*90,在CLICK的时候,按钮在变白的过程总是可以看到,除了开启双缓冲有没有什么办法可以解决的。貌似在C++模拟器上创建一个大按钮都无法避免这个过程~
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116779
QQ
发表于 2013-12-13 21:20:04 | 显示全部楼层

回 fcs19870906 的帖子

fcs19870906:ERIC,你好,比如我随便创建一个比较大的BUTTON,比如80*90,在CLICK的时候,按钮在变白的过程总是可以看到,除了开启双缓冲有没有什么办法可以解决的。貌似在C++模拟器上创建一个大按钮都无法避免这个过程~ (2013-12-13 16:46) 
变白的过程是什么意思,这个我不太理解,你说的是按键常态的演示和按下后的颜色吗
回复

使用道具 举报

5

主题

36

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-12-14 17:03:20 | 显示全部楼层

回 eric2013 的帖子

eric2013:变白的过程是什么意思,这个我不太理解,你说的是按键常态的演示和按下后的颜色吗 (2013-12-13 21:20) 
恩,就是按键按下后的颜色……至今没解决…………整个程序我只是创建了几个按钮而已~理论上不可能会的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116779
QQ
发表于 2013-12-14 17:20:03 | 显示全部楼层

回 fcs19870906 的帖子

fcs19870906:恩,就是按键按下后的颜色……至今没解决…………整个程序我只是创建了几个按钮而已~理论上不可能会的。 (2013-12-14 17:03) 
开启这个:WM_SetCreateFlags(WM_CF_MEMDEV);
回复

使用道具 举报

5

主题

36

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-12-16 11:06:16 | 显示全部楼层

回 eric2013 的帖子

eric2013:开启这个:WM_SetCreateFlags(WM_CF_MEMDEV); (2013-12-14 17:20) 
这个其中涉及到的存储设备用的外部RAM的空间吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116779
QQ
发表于 2013-12-16 11:26:47 | 显示全部楼层

回 fcs19870906 的帖子

fcs19870906:这个其中涉及到的存储设备用的外部RAM的空间吗? (2013-12-16 11:06) 
不用,系统会根据你分配的动态内存大小做分配,如果内存够大就直接的申请,如果内存不够用就会采用内存设备的分段处理。
回复

使用道具 举报

5

主题

36

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-12-16 15:23:30 | 显示全部楼层

回 eric2013 的帖子

eric2013:不用,系统会根据你分配的动态内存大小做分配,如果内存够大就直接的申请,如果内存不够用就会采用内存设备的分段处理。 (2013-12-16 11:26) 
des_sto = GUI_MEMDEV_Create(0,0,80,90);
    GUI_MEMDEV_Select(des_sto);
    button1 = BUTTON_CreateEx(0,  0,  80, 90, WM_HBKWIN, WM_CF_SHOW|WM_CF_MEMDEV, 0, GUI_ID_BUTTON1);
WM_EnableMemdev(button1);
这样创建存储设备可以吗?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 22:14 , Processed in 0.667533 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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