硬汉嵌入式论坛

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

[emWin] 关于对话框的子对话框的刷新

[复制链接]

9

主题

19

回帖

46

积分

新手上路

积分
46
发表于 2015-11-4 17:26:27 | 显示全部楼层 |阅读模式
QQ图片20151104170928.png

如上图,整体上是一个对话框,左边若干按钮,同时有若干个子对话框(初始状态都是隐藏的),每个按钮都对应一个子对话框,我希望点击某个按钮,会在中央区域显示出对应的子对话框(红框区域),同时其他的子对话框隐藏。
我是这样做的:
父对话框回调里面
/**************************************************************/
case WM_PAINT:

            //GUI_Clear();

            GUI_DrawGradientV(0,0,799,419,GUI_BLUE,GUI_DARKBLUE);
            
            GUI_SetColor(0xeecd68);
            GUI_FillRoundedRect(5,5,137,400,5);
            GUI_SetColor(GUI_GREEN);
            GUI_DrawRoundedRect(5,5,137,400,5);
            GUI_SetColor(GUI_CYAN);
            GUI_DrawRoundedRect(150,30,790,360,5);
            switch(iH)
            {
                case 0: WM_HideWindow(hDialog[0]);
                        WM_InvalidateWindow(hWin);
                        
                        break;
                case 1: WM_HideWindow(hDialog[1]);
                        WM_InvalidateWindow(hWin);

                        break;
            }
            switch(iS)
            {
                case 0:   
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),1);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),0);

                        WM_ShowWindow(hDialog[0]);
                        WM_InvalidateWindow(hWin);

                    break;
                case 1:
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),1);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),0);
                        WM_ShowWindow(hDialog[1]);
                        WM_InvalidateWindow(hWin);
                    break;
                case 2:
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),1);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),0);
                    break;
                case 3:
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),1);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),0);
                    break;
                case 4:
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),1);
                    break;
                case 5:
                    break;
                case 6:
                    break;                    
            }

case WM_INIT_DIALOG:

            hDialog[0]=GUI_CreateDialogBox(_admSetSB1Create, GUI_COUNTOF(_admSetSB1Create), NULL, hWin, 0, 0);
            hDialog[1]=GUI_CreateDialogBox(_admSetSB2Create, GUI_COUNTOF(_admSetSB2Create), NULL, hWin, 0, 0);
            hDialog[2]=GUI_CreateDialogBox(_admSetSB3Create, GUI_COUNTOF(_admSetSB3Create), NULL, hWin, 0, 0);
            hDialog[3]=GUI_CreateDialogBox(_admSetSB4Create, GUI_COUNTOF(_admSetSB4Create), NULL, hWin, 0, 0);
            hDialog[4]=GUI_CreateDialogBox(_admSetSB5Create, GUI_COUNTOF(_admSetSB5Create), NULL, hWin, 0, 0);
            
            WM_SetHasTrans(hDialog[0]);
            WM_SetCallback(hDialog[0],_cbAdmSetSB1);
            WM_SendMessageNoPara(hDialog[0],WM_INIT_DIALOG);
            
            WM_SetHasTrans(hDialog[1]);
            WM_SetCallback(hDialog[1],_cbAdmSetSB2);
            WM_SendMessageNoPara(hDialog[1],WM_INIT_DIALOG);
            
            WM_SetHasTrans(hDialog[2]);
            WM_SetCallback(hDialog[2],_cbAdmSetSB3);
            WM_SendMessageNoPara(hDialog[2],WM_INIT_DIALOG);
            
            WM_SetHasTrans(hDialog[3]);
            WM_SetCallback(hDialog[3],_cbAdmSetSB4);
            WM_SendMessageNoPara(hDialog[3],WM_INIT_DIALOG);
            
            WM_SetHasTrans(hDialog[4]);
            WM_SetCallback(hDialog[4],_cbAdmSetSB5);
            WM_SendMessageNoPara(hDialog[4],WM_INIT_DIALOG);
            
            WM_HideWindow(hDialog[0]);
            WM_HideWindow(hDialog[1]);
            WM_HideWindow(hDialog[2]);
            WM_HideWindow(hDialog[3]);
            WM_HideWindow(hDialog[4]);
           break;
/*****************************************************/
我这样做后,发现点击下一个按钮后,中间显示区不刷新,依旧显示的是上一个按钮对应的子对话框。实际上是已经切换到对应的子对话框了,但是就是不刷新画面,我点击一下那列表框的小三角,才刷新一部分。我目前试了左边的最上边两个按钮,后面的还没做。
我反复尝试了发现有另外两个现象:
1、子对话框不设置回调函数,点击两个按钮可以很好的相互切换刷新,子对话框的背景是默认的灰白色;
2、去掉设置透明标志那个函数,点击两个按钮也可以很好的切换刷新,子对话框背景也是默认的灰白色。

以上两个情况的现象,如果子对话框能互相切换刷新,同时子对话框背景成为透明的,则是我最终想要的效果。

请教大侠。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2015-11-4 18:50:12 | 显示全部楼层
楼主,你把帖子整理的太工整了,晚上吃完饭了我好好看下是怎么回事。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2015-11-4 21:20:32 | 显示全部楼层
修改下WM_PAINT消息里面的处理,
不要在这个消息里面做控件的处理,WM_PAINT消息里面只做下面这些处理:
//GUI_Clear();

            GUI_DrawGradientV(0,0,799,419,GUI_BLUE,GUI_DARKBLUE);
            
            GUI_SetColor(0xeecd68);
            GUI_FillRoundedRect(5,5,137,400,5);
            GUI_SetColor(GUI_GREEN);
            GUI_DrawRoundedRect(5,5,137,400,5);
            GUI_SetColor(GUI_CYAN);
            GUI_DrawRoundedRect(150,30,790,360,5);

其余的放在按钮的回调消息里面处理,或者其它控件的回调消息里面处理。
button这些都有专门的按下和弹起消息的,在这些消息里面处理控件是可以的。
回复

使用道具 举报

9

主题

19

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2015-11-5 17:00:48 | 显示全部楼层

回 eric2013 的帖子

eric2013:
修改下WM_PAINT消息里面的处理,
不要在这个消息里面做控件的处理,WM_PAINT消息里面只做下面这些处理:
//GUI_Clear();

            GUI_DrawGradientV(0,0,799,419,GUI_BLUE,GUI_DARKBLUE);
.......
问题解决了,那些我放在通知消息里,然后就正常了,像这样:
                case GUI_ID_BUTTON12:
                    if(NCode==WM_NOTIFICATION_CLICKED)
                    {                        
                        WM_HideWindow(hDialog[1]);
                        WM_HideWindow(hDialog[2]);
                        WM_HideWindow(hDialog[3]);
                        WM_HideWindow(hDialog[4]);

                        WM_ShowWindow(hDialog[0]);               
                    }
                    else if(NCode==WM_NOTIFICATION_RELEASED)
                    {                        
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),1);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),0);
                    }
   
                    break;
                case GUI_ID_BUTTON13:
                    if(NCode==WM_NOTIFICATION_CLICKED)
                    {
                        WM_HideWindow(hDialog[0]);
                        WM_HideWindow(hDialog[2]);
                        WM_HideWindow(hDialog[3]);
                        WM_HideWindow(hDialog[4]);

                        WM_ShowWindow(hDialog[1]);
                    }
                    else if(NCode==WM_NOTIFICATION_RELEASED)
                    {                        
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),1);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),0);
                        BUTTON_SetPressed(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),0);
                    }
                    break;
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2015-11-5 17:02:48 | 显示全部楼层

回 chenyongand 的帖子

chenyongand:问题解决了,那些我放在通知消息里,然后就正常了,像这样:
                case GUI_ID_BUTTON12:
               .. (2015-11-05 17:00) 
[s:151]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 12:19 , Processed in 0.041544 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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