如何更改进度条颜色?

时间:2014-08-14 11:57:58

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

我在更改进度条的颜色时遇到问题。最初我在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 aero主题,颜色再次变为绿色。

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

任何人都可以建议一种可能的方法来改变所有主题中的条形颜色(我认为如果它支持所有类型的主题会没问题吗?)

3 个答案:

答案 0 :(得分:7)

进度条颜色由当前系统主题决定;没有提供自定义功能。如果用户拥有" Windows Classic"主题设置,进度条填充系统高亮颜色。如果用户具有Aero主题集,则使用Aero进度条样式,这样式确实为绿色。

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

但是,Aero风格的进度条 有三种不同的状态:正常,暂停和错误。在正常状态下,它充满绿色。在暂停状态下,它充满黄色,在错误状态下,它充满红色。

sample of Aero-style progress bars, each set to a different state

但是你不应该只是因为你想让它成为某种颜色而改变进度条的状态 - 这三种状态除了它们的颜色之外还具有特定的语义含义。理论上,颜色甚至可以改变以适应不同的区域(虽然我怀疑它们是)。考虑Windows用户体验指南对progress bars所说的内容;具体是:

  

进度条颜色

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

如果您已确定更改进度条的状态适合您的情况,则可以通过将PBM_SETSTATE message发送到控制窗口来执行此操作:

SendMessage(hwndProgressBar, PBM_SETSTATE, PBST_ERROR, 0);

当然,它仅在启用Aero主题时有效。 "经典"风格的进度条没有任何结果。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

创建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 UserDefined Function - >> int r = 50; int g = 50; int 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 ..... !!