C ++ wxWidgets - 没有宽度的ScrolledWindow出现问题

时间:2012-01-04 13:21:15

标签: c++ wxwidgets

我对wxWidgets和C ++很新,但我熟悉其他工具包。我想要这样的布局:

My design

这就是它的样子。看起来我的窗户根本没有宽度:

enter image description here

所以这是我的代码,大量注释。

这是我的代码,我相信它与我能得到它的意图一样接近。 设计就是这样,每个“发送者”,“发送到”和“消息”都在一个基于可重用面板的独特块中:

//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);
}

我很抱歉在这里提出这样的具体问题,但我是C ++和wxWidgets的新手,我花了大约5个小时试图解决这个问题而且我没有 知道我缺乏什么知识。

这是完整源代码的链接:https://github.com/PhillipTaylor/SMSReader

2 个答案:

答案 0 :(得分:1)

这需要查看很多代码,我不会假装了解发生了什么。

我正在编写和调试很多代码,据我所知,这些代码都可以使用wxGrid替换。使用wxGrid会使事情变得更简单,所有棘手的东西都已经过测试和调试。

答案 1 :(得分:0)

这是DialogBlocks生成的一段代码。应该如你所描述的那样创建布局。

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
}