SOUI官方论坛

 找回密码
 立即注册
查看: 165|回复: 10

关于实时刷新窗口问题,SProgress使用演示

[复制链接]

该用户从未签到

2

主题

10

帖子

149

积分

24:00金丹期

Rank: 2

积分
149
发表于 2020-1-7 17:16:16 | 显示全部楼层 |阅读模式
我将xml里面的一个按钮 通过name绑定了 自己定义的函数。
当我点击这个函数时成功进入这个函数
我的目的是点击这个按钮 设置进度条的value.
但是我不管设置几个pPronMax->Invalidate();还是SWindow::Invalidate();他都要我的这个函数执行完后才能刷新一次
我希望在我这个函数执行的 随时都可以重绘窗口。请问怎么解决?
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    361

    主题

    803

    帖子

    7115

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    7115
    发表于 2020-1-7 22:42:05 | 显示全部楼层
    录制_2020_01_07_22_40_36_980.gif

    ProgressBar.rar (29.75 KB, 下载次数: 1, 售价: 1 SOUI币)

    该用户从未签到

    2

    主题

    10

    帖子

    149

    积分

    24:00金丹期

    Rank: 2

    积分
    149
     楼主| 发表于 2020-1-8 11:48:38 | 显示全部楼层

    这种方式我是可以实现的 我想要的样子是 在点击一次加号 在 add函数中多次对滚动条赋值并且在页面中展示出来赋值后的结果.而不是每点击一次加号 他只会刷新一次结果
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    361

    主题

    803

    帖子

    7115

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    7115
    发表于 2020-1-8 11:53:34 | 显示全部楼层
    chen302511519 发表于 2020-1-8 11:48
    这种方式我是可以实现的 我想要的样子是 在点击一次加号 在 add函数中多次对滚动条赋值并且在页面中展示 ...

    不太理解,多次赋值,只要你setvalue一次,就会刷新一次,
    int value = pProgress->GetValue();
    你是想value+3,value+3,最后再setvalue吗?

    该用户从未签到

    2

    主题

    10

    帖子

    149

    积分

    24:00金丹期

    Rank: 2

    积分
    149
     楼主| 发表于 2020-1-8 11:58:59 | 显示全部楼层
    admin 发表于 2020-1-8 11:53
    不太理解,多次赋值,只要你setvalue一次,就会刷新一次,
    int value = pProgress->GetValue();
    你是想va ...

    int value = pPronMax->GetValue() + 3;
            pPronMax->SetValue(value);
            Sleep(300);
            value = pPronMax->GetValue() + 3;
            pPronMax->SetValue(value);
            Sleep(300);
            value = pPronMax->GetValue() + 3;
            pPronMax->SetValue(value);
            Sleep(300);
            value = pPronMax->GetValue() + 3;
            pPronMax->SetValue(value);
            Sleep(300);
            value = pPronMax->GetValue() + 3;
            pPronMax->SetValue(value);
            Sleep(300);
    我是在这个函数中多次set 但是他并不是每set一次就会刷新页面一次 而是这个函数执行完毕才会显示最后的value的值

    该用户从未签到

    2

    主题

    10

    帖子

    149

    积分

    24:00金丹期

    Rank: 2

    积分
    149
     楼主| 发表于 2020-1-8 12:07:41 | 显示全部楼层
    chen302511519 发表于 2020-1-8 11:58
    int value = pPronMax->GetValue() + 3;
            pPronMax->SetValue(value);
            Sleep(300);

    就是这样
    gdt.gif
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    361

    主题

    803

    帖子

    7115

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    7115
    发表于 2020-1-8 12:31:10 | 显示全部楼层

    SOUI_NSIS打包demo, 显示安装详细信息
    http://www.soui.vip/thread-453-1-1.html
    (出处: SOUI官方论坛)
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    361

    主题

    803

    帖子

    7115

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    7115
    发表于 2020-1-8 13:52:07 | 显示全部楼层

    不能在主线程中直接setvalue吗?

    SOUI作者 13:44:36
    你要在主线程里SetValue的话,你需要UpdateWindow

    SOUI作者 13:45:20
    不然CPU都去执行你的代码去了,UI得不到刷新机会。

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    361

    主题

    803

    帖子

    7115

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    7115
    发表于 2020-1-8 13:54:48 | 显示全部楼层
    也就是说不能在主线程中操作UI相关的,不能达到预期效果的

    该用户从未签到

    21

    主题

    238

    帖子

    1033

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1033

    突出贡献优秀版主

    发表于 2020-1-8 13:56:30 | 显示全部楼层
    最简单的做法是在SetValue的时候,执行一个msgloop
    1. static void DoSomething()
    2. {
    3.         MSG msg;
    4.         while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
    5.         {
    6.                 ::TranslateMessage(&msg);
    7.                 ::DispatchMessage(&msg);
    8.         }
    9. }
    10. void CMainDlg::OnAdd()
    11. {
    12.         int value = pProgress->GetValue();
    13.         while(value<100)
    14.         {
    15.                 Sleep(100);
    16.                 value = pProgress->GetValue()+3;
    17.                 pProgress->SetValue(value);
    18.                 pTip->SetWindowText(SOUI::SStringT().Format(_T("当前进度为%d"),value));
    19.                 DoSomething();
    20.         }
    21.        
    22. }
    复制代码
    录制_2020_01_08_14_01_58_910.gif
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛 ( 粤ICP备18103663号-2 )

    GMT+8, 2020-1-23 20:52

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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