用codeblocks编译wxwidget项目在Windows编译运行后有问题,如何解决?

用codeblocks编译wxwidget项目,自定义了一个滑动条,想在main.cpp里获取实时数据实现相关功能,但是只能打出r=0,不知道哪里出了问题,也不知道该怎样获取,希望大家能为我解答,谢谢!
滑动条关键代码:

void wxCustomSlider::render(wxClientDC&  dc)
{
    dc.SetPen( *wxTRANSPARENT_PEN );
    dc.SetBrush( *barbg );
    if(width>height)//横向滑动条
    {
       dc.DrawRectangle( 0, height*0.45, width, height/10 );//画中间的轴
    }
    else//纵向滑动条
    {
       dc.DrawRectangle( width*0.45, 0, width/10, height );//画中间的轴
    }
    if(status == shover||status == sdown)
    {
       dc.SetPen(*hoverbg);
       dc.SetBrush( *wxTRANSPARENT_BRUSH );
       dc.DrawRectangle( 0, 0, width, height );//鼠标悬停、按下时画边框
    }
    else
    {
       dc.SetBrush( *prebg );
    }
    if(width>height)
    {
       dc.SetBrush( *prebg );
       dc.DrawRectangle( start, (height-height/5)/2, width/40,height/5  );//画移动的方块
       dc.SetBrush( *hoverbg );
       dc.DrawRectangle( 0, height*0.45, start, height/10 );//画已经拖动的长度
       dc.DrawText(std::to_string(m), wxPoint(0, height-20));//显示最小值
       dc.DrawText(std::to_string(M), wxPoint(width-30, height-20));//显示最大值
       dc.DrawText(std::to_string(p1), wxPoint(0, 0));//显示当前值
    }
    else
    {
       dc.SetBrush( *prebg );
       dc.DrawRectangle( (width-width/2)/2, start, width/2, height/20 );
       dc.SetBrush( *hoverbg );
       dc.DrawRectangle( width*0.45, 0, width/10, start );
       dc.DrawText(std::to_string(m), wxPoint(width-30, 0));
       dc.DrawText(std::to_string(M), wxPoint(width-30, height-20));
       dc.DrawText(std::to_string(p2), wxPoint(0, 0));
    }
}


void wxCustomSlider::mouseMoved(wxMouseEvent& event)
{
   if(status == sdown)
    {
       if(width>height)
       {
          if(event.GetPosition().x > width-width/40)
            start = width-width/40;//防止移动的方块超出
          else
            start = event.GetPosition().x;
          int getp1 = ((M-m)*start/(width-width/40)+m);
          p1 = getvalue(getp1);
       }
       else
       {
          if(event.GetPosition().y > height-height/20)
            start = height-height/20;
          else
            start = event.GetPosition().y;
          p2 = (M-m)*start/(height-height/20)+m;
       }
    }
    paintNow();
    Update();
    Refresh();
}

mywxSlider::mywxSlider(wxWindow* parent, wxColor bg, wxWindowID id, const wxPoint &pos, const wxSize &size ):
 wxWindow(parent, wxID_ANY)
{
    ms = new wxPanel(this, wxID_ANY);
    ms -> SetBackgroundColour(bg);
    ss = new wxBoxSizer(wxVERTICAL);
    ms -> SetSizer(ss);

    wxBoxSizer* hbox = new wxBoxSizer(wxVERTICAL);
    wxBoxSizer* cbox = new wxBoxSizer(wxHORIZONTAL);

    tc = new wxTextCtrl(ms, wxID_ANY);//设置输入文本框
//    tc -> Bind(wxEVT_SET_FOCUS, wxFocusEventHandler(mywxSlider::OnSetFocus), this);
    tc -> Bind(wxEVT_SET_FOCUS, wxFocusEventHandler(mywxSlider::OnKillFocus), this);
    cbox-> Add(tc, 0, wxALL, 5);

    cbtn = new wxCustomButton( ms, ID_Check, ("Check"), wxSize(100, 40), wxDefaultPosition);//设置确定按键
    cbtn -> normal_bitmap(pic)-> down_bitmap(pic)-> hover_bitmap(pic);
    cbtn -> disable_bitmap(disable);
    cbtn -> pre_bg(cprebg) -> hover_bg(choverbg);
    cbtn -> Bind(wxEVT_LEFT_UP, wxMouseEventHandler(mywxSlider::Check), this);
    cbox-> Add(cbtn, 0, wxALL, 5);

    hbox-> Add(cbox, 0, wxALL, 5);

    mslider = new wxCustomSlider( ms, wxDefaultPosition, wxSize(400,80), 0, 255);
    t = std::to_string(mslider -> m);//滑块最小值
    tc -> SetValue(t);

    hbox -> Add(mslider, 0, wxALL, 5);

    ss -> Add(hbox, 0, wxALL, 5);
    ss -> Fit(ms);
}

//void mywxSlider::OnSetFocus(wxFocusEvent &event) {
void mywxSlider::Check(wxMouseEvent& event){
   std::string s;
   s = tc -> GetValue();
   int x = atoi(s.c_str());//当前滑块值
   if(mslider -> width > mslider -> height)
   {
      if(x <= mslider ->M && x >= mslider ->m)
      {
         mslider -> start = (x-mslider ->m)*(mslider -> width-mslider -> width/40)/(mslider -> M-mslider -> m);
         mslider -> p1 = x;
      }
      else
      {
         wxMessageBox( wxT("请重新输入") );//输入数据不在范围内时
         tc -> SetValue(t);
      }
   }
   else
   {
      if(x <= mslider ->M && x >= mslider ->m)
      {
         mslider -> start = (x-mslider ->m)*(mslider -> height-mslider -> height/20)/(mslider -> M-mslider -> m);
         mslider -> p2 = x;
      }
      else
      {
         wxMessageBox( wxT("请重新输入") );
         tc -> SetValue(t);
      }
   }
   mslider -> paintNow();
   mslider -> Update();
   mslider -> Refresh();

    cout << "now=" << mslider ->p1 << endl;
}

滑动条具体效果:

img

main.cpp中相关代码:

        slider1 = new mywxSlider(top, wxColour(146,168,209), wxID_ANY);
        slider1 -> mslider -> bar_bg(barbg) -> pre_bg(prebg) -> hover_bg(hoverbg);
        slider1 -> Show();//滑动条显示
        s1->Add(slider1, 0, wxALL, 30);
        int r;
        slider1 -> mslider -> Update();
        slider1 -> mslider -> Refresh();
        r = slider1 -> mslider -> p1;
        cout << "r=" << r << endl;


  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7649410
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:使用CodeBlocks搭建wxWidgets C++ GUI图形化开发环境
  • 除此之外, 这篇博客: Windows下CodeBlocks插件开发环境配置中的 3、准备wxWidget编译环境 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1、将下载好的wxWidgets-2.8.12.zip解压到C:\CodeBlocks\wxWidgets-2.8.12;
    在这里插入图片描述
    2、设置MingW编译器的path的环境变量
    在系统环境变量Path中添加MingW的路径,这个路径就是刚才咱们安装到CodeBlocks下的MinGW的路径。
    在这里插入图片描述
    3、 编译wxWidget
    (1)在Dos窗口中进入到wxWidgets的安装目录下:wxWidgets的编译文件被放在build目录下,其中msw目录存放的就是Windows下的编译配置文件。 这里我们的编译器是GCC,所以要使用该目录下的配置文件:makefile.gcc
    (2)用MinGW的GCC编译器来编译wxWidgets:首先首先是清除原来编译的垃圾文件,使用命令如下
    mingw32-make -f makefile.gcc SHARED=1 MONOLITHIC=1 BUILD=release UNICODE=1 clean
    然后实施真正的编译,使用命令如下
    mingw32-make -f makefile.gcc SHARED=1 MONOLITHIC=1 BUILD=release UNICODE=1
    (3)如果编译成功,在…:\wxWidgets-2.8.10\lib目录下创建一个叫gcc_dll的目录
    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    由于问题中并没有提供滑动条关键代码以及main.cpp相关代码,我不能确定具体问题在哪里。对于滑动条获取实时数据为0的问题,一般情况下可能是代码中未正确绑定滑动条事件或者获取实时数据的方法有误。

    如果你想从头开始编译wxWidget项目并获得滑动条实时数据,可以按照以下步骤进行:

    1. 下载最新版本的wxWidget库并解压到本地。例如,解压到C:\wxWidgets-3.1.5。

    2. 安装最新版本的Code::Blocks和MinGW编译器并确保它们可以正常工作。你也可以使用你喜欢的其他IDE和编译器。

    3. 打开Code::Blocks并创建一个新的wxWidget项目。在创建项目时,确保设置以下选项:

    4. 项目类型为“wxWidget项目”。

    5. 编译器为MinGW。
    6. wxWidget库的安装路径为你之前解压的路径。

    7. 在你的项目中添加一个滑动条控件,并绑定它的事件。例如,你可以使用以下代码:

    MyFrame::MyFrame(wxWindow* parent, wxWindowID id, const wxString& title,
      const wxPoint& pos, const wxSize& size, long style)
      : wxFrame(parent, id, title, pos, size, style) {
        wxSlider *slider = new wxSlider(this, wxID_ANY, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL);
        Connect(slider->GetId(), wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler(MyFrame::OnSliderUpdate));
    }
    
    void MyFrame::OnSliderUpdate(wxScrollEvent& event) {
      wxSlider* slider = wxDynamicCast(event.GetEventObject(), wxSlider);
      if (slider) {
        int value = slider->GetValue(); //获取滑动条值
        // ...
      }
    }
    

    在这个示例中,我们创建了一个水平滑动条并将其绑定到OnSliderUpdate方法上。该方法将在用户拖动滑块时被调用,并获取滑动条的新值。

    1. 然后在你的main.cpp中添加你想要的代码来处理获取的实时数据。例如,你可以在OnSliderUpdate方法中向控制台输出滑动条的当前值:
    void MyFrame::OnSliderUpdate(wxScrollEvent& event) {
      wxSlider* slider = wxDynamicCast(event.GetEventObject(), wxSlider);
      if (slider) {
        int value = slider->GetValue();
        std::cout << "Slider value: " << value << std::endl;
      }
    }
    
    1. 最后编译并运行你的程序。当你移动滑块时,应该可以在控制台中看到滑动条的实时值。

    希望这些步骤能够帮助你解决你的问题。如果你遇到任何其他问题,请在评论中提出。