【问题标题】:How to change the progress bar color?如何更改进度条颜色?
【发布时间】:2014-10-08 01:45:34
【问题描述】:

我在更改进度条颜色时遇到问题。最初,我为该进度控件和OnInitDialog() 创建了一个实例。我正在尝试更改进度条的颜色(最初进度条颜色为绿色)。现在,我尝试使用OnInitDialog() 中的这段代码将条形颜色设置为红色,如下所示,

BOOL OnInitDialog()
{
    CPropertyPage::OnInitDialog();
    m_ProgressBar->SetRange32(0,100);
    m_ProgressBar->SetPos(50);
    m_ProgressBar->SetBarColor(RGB(255,0,0));
    return TRUE;
}

这是我必须更改条形颜色的东西,我使用的是 Windows 7 操作系统。我观察到的一件事是,当我将主题更改为“windows classic”时,我能够看到我设置的颜色(在本例中为红色)。但是,如果我回到 Windows 7 航空主题,颜色又是绿色。

此外,我什至在这里检查了SetBkColor 方法,它与我使用SetBarColor() 时遇到的问题相同。

谁能建议一种可能的方法来更改所有主题中的条形颜色(我认为如果它支持所有类型的主题就可以了)?

【问题讨论】:

    标签: c++ visual-c++ mfc


    【解决方案1】:

    进度条颜色由当前系统主题决定;没有提供自定义功能。如果用户设置了“Windows 经典”主题,则进度条将填充系统突出显示颜色。如果用户设置了 Aero 主题,则使用 Aero 进度条样式,这确实是绿色。

    如果您想更改进度条的呈现方式,则需要更改系统范围的主题。当然,这不是应用程序应该做的事情——这是用户会做的事情,因为他们喜欢不同的主题。例如,他们可能会安装a theme that has blue progress bars。网上有很多例子。生成这些主题很容易;您只需在资源编辑器中打开 aero.msstyle 文件并修改它用于显示进度条的图像。

    但是,Aero 风格的进度条确实具有三种不同的状态:正常、暂停和错误。在正常状态下,它被填充为绿色。在暂停状态下用黄色填充,在错误状态下用红色填充。

    但是你不应该仅仅因为你希望它是某种颜色就改变进度条的状态——这三种状态除了颜色之外还有特定的语义含义。理论上,甚至可以更改颜色以适应不同的语言环境(尽管我怀疑它们是)。考虑 Windows 用户体验指南在 progress bars 上的内容;具体来说:

    进度条颜色

    • 仅使用红色或黄色进度条来指示进度状态,而不是任务的最终结果。红色或黄色进度条表示用户需要采取一些行动才能完成任务。如果条件不可恢复,请将进度条保持为绿色并显示错误消息。
    • 当存在阻止进一步进展的用户可恢复条件时,将进度条变为红色。显示消息以解释问题并推荐解决方案。
    • 将进度条变为黄色,表示用户已暂停任务,或者存在阻碍进度但仍在进行的情况(例如,网络连接不佳)。如果用户已暂停,请将 Pause 按钮​​标签更改为 Resume。如果进度受阻,请显示一条消息来解释问题并推荐解决方案。

    如果您决定更改进度条的状态适合您的情况,您可以通过将PBM_SETSTATE message 发送到控制窗口来实现:

    SendMessage(hwndProgressBar, PBM_SETSTATE, PBST_ERROR, 0);
    

    当然,它仅在启用 Aero 主题时才有效。 “经典”风格的进度条不会发生任何事情。

    【讨论】:

    • 发现发送此消息后并没有直接重绘进度条。您可以使窗口无效以强制重绘。或者也许将位置更改为与以前不同的值也可以。
    【解决方案2】:

    您可以禁用进度条(和任何其他控件)的视觉样式:

    SetWindowTheme(hwnd, L" ", NULL); //second param is one space string
    

    您可以根据需要更改颜色、边距等

    【讨论】:

      【解决方案3】:

      创建 MFC 项目后 ---

      1] 将进度条从工具箱带到对话框窗格 ....

      2] 现在为进度条添加一个变量

      -> Selecting Progress Bar 
      
      -> Right Click on it
      
          -> Select Add Variable Button 
      
      -> provide name for it like EX: m_progressBar 
      

      代码:

      INSIDE ::OnInitDialog() 方法 ->>

          m_progressBar.SetRange(  0 , 200 ) ;
      

      INSIDE 用户定义函数 ->> 诠释 r = 50 ;整数 g = 50 ;诠释 b = 250 ;

          for( int i=0 ; i<=200 ; i++ )
          {  m_progressBar.SetPos( i )  ; 
             m_progressBar.SetBarColor( RGB( r , g+i , b-i ) )  ; 
              ::Sleep(20 )  ; 
          }
      

      享受编码.......!!!

      享受 MFC .....!!

      【讨论】:

        猜你喜欢
        • 2016-11-02
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        相关资源
        最近更新 更多