C++;wxWidgets-滚动窗口没有宽度时出现问题 我对WxWiWeDes和C++非常陌生,但我熟悉其他工具包。我想要这样的布局:

C++;wxWidgets-滚动窗口没有宽度时出现问题 我对WxWiWeDes和C++非常陌生,但我熟悉其他工具包。我想要这样的布局:,c++,wxwidgets,C++,Wxwidgets,这就是它看起来的样子。我的窗口看起来一点宽度都没有: 这是我的代码,有很多注释 这是我的代码,我相信它尽可能接近我的意图。 设计是这样的,每个“发送者”、“发送者”和“消息”都位于基于可重用面板的唯一块中: //CONTENTS OF GUI_MESSAGE_ITEM.H #ifndef GUIMESSAGEITEM_H #define GUIMESSAGEITEM_H #include "wx/panel.h" // Base class: wxPanel #include "wx/st

这就是它看起来的样子。我的窗口看起来一点宽度都没有:

这是我的代码,有很多注释

这是我的代码,我相信它尽可能接近我的意图。 设计是这样的,每个“发送者”、“发送者”和“消息”都位于基于可重用面板的唯一块中:

//CONTENTS OF GUI_MESSAGE_ITEM.H

#ifndef GUIMESSAGEITEM_H
#define GUIMESSAGEITEM_H

#include "wx/panel.h" // Base class: wxPanel
#include "wx/stattext.h"
#include "sms_message.h"
#include "wx/window.h"
#include "wx/wx.h"

class GUIMessageItem : public wxPanel {

public:
    GUIMessageItem(wxWindow* parent, wxWindowID winid, const SMSMessage& smsMessage);
    ~GUIMessageItem();

private:
    wxStaticText* stSender;
    wxStaticText* stSentTime;
    wxStaticText* stMessageContents;
};

#endif // GUIMESSAGEITEM_H

//CONTENTS OF GUI_MESSAGE_ITEM.CPP

#include "gui_message_item.h"

GUIMessageItem::GUIMessageItem(wxWindow* parent, wxWindowID winid, const SMSMessage& smsMessage) :
    wxPanel(parent, winid),
    stSender(new wxStaticText(this, winid, smsMessage.GetSender())),
    stSentTime(new wxStaticText(this, winid, smsMessage.GetSentTime())),
    stMessageContents(new wxStaticText(this, winid, smsMessage.GetMessage()))
{
    wxColour blue(wxT("#2A2AF7"));
    wxColour green(wxT("#56DB4F"));
    wxFont originalFont = stSender->GetFont();
    wxFont boldFont(originalFont);
    boldFont.SetWeight( wxFONTWEIGHT_BOLD );
    wxSize stsMin(100, 60);
    wxSize bodyMin(300, 100);

    stSender->SetForegroundColour(blue);
    stSentTime->SetForegroundColour(green);
    stSender->SetFont(boldFont);
    stSentTime->SetFont(boldFont);
    stSender->SetMinSize(stsMin);
    stSentTime->SetMinSize(stsMin);

    stMessageContents->SetMinSize(bodyMin);
    stMessageContents->Wrap(200);

    wxBoxSizer* lines = new wxBoxSizer( wxVERTICAL );
    wxBoxSizer* topLine = new wxBoxSizer( wxHORIZONTAL );
    lines->AddSpacer(4);
    topLine->AddSpacer(5);
    this->SetSizer(lines);

    topLine->Add(stSender, wxALIGN_LEFT);
    topLine->Add(stSentTime, wxALIGN_RIGHT);
    lines->Add(topLine);
    lines->Add(stMessageContents, wxALIGN_CENTER_HORIZONTAL );

    lines->SetMinSize(wxSize(400,400));
    this->FitInside();
    this->Layout();
}

GUIMessageItem::~GUIMessageItem()
{
}

//MAIN CODE FOR THE WHOLE FORM

MainFrameBase::MainFrameBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
    this->SetSizeHints( wxDefaultSize, wxDefaultSize );

    //Menu Bar stuff.
    m_menuBar = new wxMenuBar( 0 );
    m_menuFile = new wxMenu();
    wxMenuItem* menuFileExit;
    menuFileExit = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ) + wxT('\t') + wxT("Alt+X"), wxEmptyString, wxITEM_NORMAL );

    wxMenuItem* menuFileOpen;
    menuFileOpen = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open") ) + wxT('\t') + wxT("Alt+O"), wxEmptyString, wxITEM_NORMAL );

    m_menuFile->Append( menuFileOpen );
    m_menuFile->Append( menuFileExit );
    m_menuBar->Append( m_menuFile, _("&File") );

    this->SetMenuBar( m_menuBar );

    //main sizer for whole interface
    wxBoxSizer* mainSizer = new wxBoxSizer( wxVERTICAL );

    this->SetSizer( mainSizer );

    // Filter box section
    wxStaticText* filterLabel = new wxStaticText(this, wxID_ANY, wxT("Filter by Sender:"));

    m_filter = new wxComboBox(
        this,
        wxID_ANY,
        wxT(""),
        wxDefaultPosition,
        wxDefaultSize,
        0,
        NULL,
        wxCB_DROPDOWN|wxCB_READONLY
    );

    wxBoxSizer* filterSizer = new wxBoxSizer( wxHORIZONTAL );
    filterSizer->Add(filterLabel);
    filterSizer->Add(m_filter);
    mainSizer->Add(filterSizer);

    // List of Messages section //The issue must be here somewhere...
    m_scrWin = new wxScrolledWindow(
        this,
        wxID_ANY
    );

    m_listSizer = new wxBoxSizer(wxVERTICAL);
    m_scrWin->SetSizer(m_listSizer);
    mainSizer->Add(m_scrWin, wxEXPAND); //m_scrWin should take the WHOLE of the interface.

    //example msg
    SMSMessage* exampleMessage = new SMSMessage(
        wxT("+44 07950 322 789"),
        wxT("2011-13-07 13:22"),
        wxT("Yo mate, what's up?")
    );

    for (int i = 0; i < 6; i++) {
        AddSMSMessagePanel(*exampleMessage);
    }

    //wxSize minimum(300,500);

    m_scrWin->FitInside();                //Use fit inside to make the scrollwindow use the width of the items inside? without doing this I get no scrollbar at all...
    //m_scrWin->SetMinSize(minimum);
    //m_listSizer->SetMinSize(minimum);
    //m_scrWin->EnableScrolling(true, true);
    //m_scrWin->SetScrollRate(1,1);
    m_scrWin->SetScrollRate(5, 5);

    this->Layout();
    m_statusBar = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY );

    this->Centre( wxBOTH );

    // Connect Events
    this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnCloseFrame ) );
    this->Connect( menuFileOpen->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnFileOpen ) );
    this->Connect( menuFileExit->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnExitClick ) );
}

void MainFrameBase::AddSMSMessagePanel(const SMSMessage& message) {
    GUIMessageItem* gmi = new GUIMessageItem(m_scrWin, wxID_ANY, message); //object inherits from wxPanel
    m_listSizer->Add(gmi);
}
//GUI\u MESSAGE\u ITEM.H的内容
#ifndef guimessage项目
#定义GUIMESSAGEITEM_H
#包括“wx/panel.h”//基类:wxPanel
#包括“wx/stattext.h”
#包括“sms_message.h”
#包括“wx/window.h”
#包括“wx/wx.h”
类GUIMessageItem:publicwxpanel{
公众:
GUIMessageItem(wxWindow*父项、wxWindowID winid、常量SMSMessage和SMSMessage);
~GUIMessageItem();
私人:
wxStaticText*stSender;
wxStaticText*stSentTime;
wxStaticText*stMessageContents;
};
#endif//GUIMESSAGEITEM_H
//GUI_MESSAGE_ITEM.CPP的内容
#包括“gui\u message\u item.h”
GUIMessageItem::GUIMessageItem(wxWindow*父项、wxWindowID winid、常量SMSMessage和SMSMessage):
wxPanel(父级,winid),
stSender(新的wxStaticText(this,winid,smsMessage.GetSender()),
stSentTime(新的wxStaticText(this,winid,smsMessage.GetSentTime()),
stMessageContents(新的wxStaticText(this、winid、smsMessage.GetMessage())
{
wxcolourblue(wxT(#2A2AF7”);
wxcolourgreen(wxT(#56DB4F));
wxFont originalFont=stSender->GetFont();
wxFont粗体字体(原始字体);
boldFont.SetWeight(wxFONTWEIGHT_粗体);
wxSize-stsMin(100,60);
wxSize bodyMin(300100);
stSender->SetForeGroundColor(蓝色);
stSentTime->SetForeGroundColor(绿色);
stSender->SetFont(粗体);
stSentTime->SetFont(粗体);
stSender->SetMinSize(stsMin);
stSentTime->SetMinSize(stsMin);
stMessageContents->SetMinSize(bodyMin);
stMessageContents->Wrap(200);
wxBoxSizer*行=新的wxBoxSizer(wxVERTICAL);
wxBoxSizer*topLine=新的wxBoxSizer(wxHORIZONTAL);
线->添加垫片(4);
背线->添加垫片(5);
此->设置器(行);
背线->添加(stSender,wxALIGN_左);
背线->添加(标准时间,右对齐);
行->添加(顶行);
行->添加(stMessageContents,wxALIGN\u CENTER\u HORIZONTAL);
行->设置大小(wxSize(400400));
这个->FitInside();
这个->布局();
}
GUIMessageItem::~GUIMessageItem()
{
}
//整个表单的主代码
MainFrameBase::MainFrameBase(wxWindow*父级,wxWindowID id,常量wxString和标题,常量wxPoint和pos,常量wxSize和size,长样式):wxFrame(父级,id,标题,位置,大小,样式)
{
此->设置大小提示(wxDefaultSize,wxDefaultSize);
//菜单栏的东西。
m_menuBar=新的wxMenuBar(0);
m_menuFile=新的wxMenu();
wxMenuItem*菜单文件退出;
menuFileExit=新的wxMenuItem(m_menuFile,wxID_EXIT,wxString(U(“E&xit”))+wxT('\t')+wxT(“Alt+X”),wxEmptyString,wxITEM_NORMAL);
wxMenuItem*菜单文件打开;
menuFileOpen=newwxmenuitem(m_menuFile,wxID_OPEN,wxString(uu(“&OPEN”))+wxT('\t')+wxT(“Alt+O”),wxEmptyString,wxITEM_NORMAL);
菜单文件->附加(菜单文件打开);
菜单文件->附加(菜单文件退出);
菜单栏->附加(菜单文件,“&File”);
这->设置菜单栏(m_菜单栏);
//全界面主施胶器
wxBoxSizer*mainSizer=新的wxBoxSizer(wxVERTICAL);
此->设置器(mainSizer);
//滤箱段
wxStaticText*filterLabel=新的wxStaticText(this,wxID_ANY,wxT(“按发件人筛选”);
m_过滤器=新的wxComboBox(
这
wxID_ANY,
wxT(“”),
wxDefaultPosition,
wxDefaultSize,
0,
无效的
wxCB_下拉列表| wxCB_只读
);
wxBoxSizer*filterSizer=新的wxBoxSizer(wxHORIZONTAL);
filterSizer->Add(过滤器标签);
filterSizer->添加(m_过滤器);
mainSizer->Add(filterSizer);
//邮件列表部分//问题必须在此处某处。。。
m_scrWin=新wxScrolledWindow(
这
wxID_ANY
);
m_listSizer=新的wxBoxSizer(wxVERTICAL);
m_scrWin->SetSizer(m_listSizer);
mainSizer->Add(m_-scrWin,wxEXPAND);//m_-scrWin应该占据整个接口。
//示例消息
SMSMessage*示例消息=新SMSMessage(
wxT(“+44 07950 322 789”),
wxT(“2011-13-07 13:22”),
wxT(“伙计,怎么了?”)
);
对于(int i=0;i<6;i++){
AddSMSMessagePanel(*示例消息);
}
//wxSize最小值(300500);
m_scrWin->FitInside();//使用fit inside使滚动窗口使用内部项目的宽度?如果不这样做,我就不会得到任何滚动条。。。
//m_scrWin->SetMinSize(最小值);
//m_listSizer->SetMinSize(最小值);
//m_scrWin->启用滚动(true,true);
//m_scrWin->SetScrollRate(1,1);
m_scrWin->SetScrollRate(5,5);
这个->布局();
m_statusBar=this->CreateStatusBar(1,wxST_SIZEGRIP,wxID_ANY);
本->中心(wxBOTH);
//连接事件
此->连接(wxEVT_关闭_窗口,wxCloseEventHandler(MainFrameBase::OnCloseFrame));
此->连接(menuFileOpen->GetId(),选中wxEVT_命令_菜单,wxCommandEventHandler(MainFrameBase::OnFileOpen));
此->连接(menuFileExit->GetId(),选中wxEVT_命令_菜单,wxCommandEventHandler(MainFrameBase::OnExitClick));
}
void MainFrameBase::AddSMSMessagePanel(常量SMSMessage&message){
GUIMessageItem*gmi=new GUIMessageItem(m_scrWin,wxID_ANY,message);//对象从wxPanel继承
m_listSizer->Add(gmi);
}
对不起,我带来了这样的问题,但是我对C++和WXWIDGET是新的,我花了大约5个小时来解决这个问题,但我没有。 知道我缺少什么知识


这是一个完整源代码的链接:

这有很多代码要看,我并不假装理解发生了什么

void test::CreateControls()
{    
////@begin test content construction
    test* itemPanel1 = this;

    wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
    itemPanel1->SetSizer(itemBoxSizer2);

    wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
    itemBoxSizer2->Add(itemBoxSizer3, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5);

    wxStaticText* itemStaticText4 = new wxStaticText( itemPanel1, wxID_STATIC, _("Static text"), wxDefaultPosition, wxDefaultSize, 0 );
    itemBoxSizer3->Add(itemStaticText4, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);

    wxArrayString itemChoice5Strings;
    wxChoice* itemChoice5 = new wxChoice( itemPanel1, ID_CHOICE, wxDefaultPosition, wxDefaultSize, itemChoice5Strings, 0 );
    itemBoxSizer3->Add(itemChoice5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);

    wxArrayString itemSimpleHtmlListBox6Strings;
    wxSimpleHtmlListBox* itemSimpleHtmlListBox6 = new wxSimpleHtmlListBox( itemPanel1, ID_SIMPLEHTMLLISTBOX, wxDefaultPosition, wxSize(400, 300), itemSimpleHtmlListBox6Strings, wxHLB_DEFAULT_STYLE );
    itemBoxSizer2->Add(itemSimpleHtmlListBox6, 1, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);

////@end test content construction
}