往wxWidgets状态栏添加进度条

    最近做个项目,把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;
}

最终效果如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
wxWidgets中,我们可以通过继承wxTaskBarIcon类来处理任务栏按钮的事件。下面是一个示例代码,演示了如何使用wxWidgets处理任务栏按钮的点击事件: ```cpp #include <wx/wx.h> class MyTaskBarIcon : public wxTaskBarIcon { public: MyTaskBarIcon() { // 在构造函数中添加任务栏按钮 SetIcon(wxICON(wxLOGO), "My TaskBar Icon"); } void OnLeftButtonDClick(wxTaskBarIconEvent& event) { // 处理任务栏按钮的双击事件 wxMessageBox("TaskBar Icon Double Clicked!"); } void OnMenuOpen(wxCommandEvent& event) { // 处理任务栏按钮的右键菜单打开事件 wxMessageBox("TaskBar Icon Menu Opened!"); } wxMenu* CreatePopupMenu() { // 创建任务栏按钮的右键菜单 wxMenu* menu = new wxMenu; menu->Append(wxID_OPEN, "Open"); menu->Append(wxID_CLOSE, "Close"); return menu; } wxDECLARE_EVENT_TABLE(); }; wxBEGIN_EVENT_TABLE(MyTaskBarIcon, wxTaskBarIcon) EVT_TASKBAR_LEFT_DCLICK(MyTaskBarIcon::OnLeftButtonDClick) EVT_MENU(wxID_OPEN, MyTaskBarIcon::OnMenuOpen) EVT_MENU(wxID_CLOSE, MyTaskBarIcon::OnMenuClose) wxEND_EVENT_TABLE() class MyApp : public wxApp { public: bool OnInit() { // 创建应用程序的主窗口 wxFrame* frame = new wxFrame(NULL, wxID_ANY, "My App"); frame->Show(); // 创建任务栏按钮 MyTaskBarIcon* taskBarIcon = new MyTaskBarIcon; taskBarIcon->SetIcon(wxICON(wxLOGO), "My TaskBar Icon"); return true; } }; wxIMPLEMENT_APP(MyApp); ``` 在上面的代码中,我们首先创建了一个自定义的MyTaskBarIcon类,继承自wxTaskBarIcon类。在构造函数中,我们使用SetIcon()函数添加了一个任务栏按钮。然后,我们重写了OnLeftButtonDClick()函数和CreatePopupMenu()函数来处理任务栏按钮的双击事件和右键菜单打开事件。最后,我们使用宏定义wxDECLARE_EVENT_TABLE()和wxBEGIN_EVENT_TABLE()来声明和定义事件表,将事件与相应的处理函数关联起来。 在应用程序的主函数中,我们创建了一个主窗口,并创建了一个MyTaskBarIcon对象来添加任务栏按钮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值