最近做个项目,把windows下程序移植到国产操作系统,UI上有一个状态栏显示进度条的设计。UI我用的wxWidgets,这个需求网上没有搜到完整的示例,于是自己动手试了下,实现了。
头文件:ProgressStatusBar.hpp
#pragma once
#include <wx/statusbr.h>
#include <wx/gauge.h>
class ProgressStatusBar : public wxStatusBar
{
public:
ProgressStatusBar(wxWindow *parent, long style=wxSTB_DEFAULT_STYLE);
virtual ~ProgressStatusBar();
void SetRange(int range);
void SetValue(int pos);
void OnSize(wxSizeEvent &event);
enum
{
Field_Text,
Field_Status,
Field_Process
};
private :
wxGauge* m_ProgressBar;
DECLARE_EVENT_TABLE()
};
源文件:ProgressStatusBar.cpp
#include "ProgressStatusBar.h"
BEGIN_EVENT_TABLE(ProgressStatusBar, wxStatusBar)
EVT_SIZE(ProgressStatusBar::OnSize)
END_EVENT_TABLE()
ProgressStatusBar::ProgressStatusBar(wxWindow *parent, long style)
: wxStatusBar(parent, wxID_ANY, style, wxStatusBarNameStr)
{
int widths[3];
widths[Field_Text] = -1; // growable
widths[Field_Status] = 150;
widths[Field_Process] = 200;
SetFieldsCount(3);
SetStatusWidths(3, widths);
wxRect rect;
GetFieldRect(Field_Process, rect);
m_ProgressBar = new wxGauge(this, wxID_ANY, 0, rect.GetPosition(), rect.GetSize(), wxGA_SMOOTH);
}
ProgressStatusBar::~ProgressStatusBar()
{
}
void ProgressStatusBar::SetRange(int range)
{
if(m_ProgressBar)
m_ProgressBar->SetRange(range);
}
void ProgressStatusBar::SetValue(int pos)
{
if(m_ProgressBar)
m_ProgressBar->SetValue(pos);
}
void ProgressStatusBar::OnSize(wxSizeEvent &event)
{
wxRect rect;
GetFieldRect(Field_Process, rect);
m_ProgressBar->SetSize(rect.x, rect.y, rect.width, rect.height);
}
在注释掉原来MainFrame里的CreateStatusBar(),调用自定义状态栏函数CreateProgressStatusBar()。
bool MainFrame::CreateProgressStatusBar()
{
wxStatusBar *statbarOld = GetStatusBar();
if (statbarOld)
{
SetStatusBar(nullptr);
delete statbarOld;
}
m_pStatusBar = new ProgressStatusBar(this, wxSTB_DEFAULT_STYLE);
SetStatusBar(m_pStatusBar);
SetStatusText(wxT("Welcome to wxWidgets!"));
//m_pStatusBar->SetRange(100);
//m_pStatusBar->SetValue(33);
return m_pStatusBar != nullptr;
}
最终效果如下: