wxWidgets динамически переносит wxStaticText в диалоге

У меня проблемы с получением wxStaticText метка для динамического переноса в диалоге, используя wxWidgets 3.0.2. Я следовал за идеями для других вопросов, таких как этот, немного у меня еще странные эффекты.

Я использую Wrap(int) функция на тексте, в обратном вызове на wxEVT_SIZE событие, но это, кажется, оказывает неожиданное влияние на текст, а также, кажется, только «укорачивает» размер и не будет снова переноситься при расширении окна.

Основная часть привязки это:

CTOR(...) {
....
m_text->Bind(wxEVT_SIZE, &DIALOG_WRAPTEXT::onResize, this);
}

void CLASS::onResize( wxSizeEvent& event )
{
m_text->Wrap( event.GetSize().GetWidth() );
event.Skip();
}

Результат выглядит хорошо, когда диалоговое окно впервые показывается, но когда вы изменяете размер уже и копируете, вы получаете этот результат:

Сделав уже
Снова сделав широкий

Минимальный воспроизводимый пример:

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
class DIALOG_WRAPTEXT: public wxDialog
{
public:

DIALOG_WRAPTEXT( wxWindow* parent,
const wxString& aTitle, const wxSize aSize );

private:

void onResize( wxSizeEvent& evt );

wxBoxSizer* m_itemBoxSizer;
wxStaticText* m_text;
};

DIALOG_WRAPTEXT::DIALOG_WRAPTEXT(
wxWindow* parent, const wxString& aTitle, const wxSize aSize ):
wxDialog( parent, wxID_ANY, aTitle,
wxPoint( -1, -1 ), aSize,
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
m_itemBoxSizer = new wxBoxSizer( wxVERTICAL );
SetSizer( m_itemBoxSizer );

wxString msg("Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ");

m_text = new wxStaticText( this, wxID_ANY, msg );
// wxEXPAND makes no difference
m_itemBoxSizer->Add( m_text, 1, wxALIGN_TOP | wxALL | wxEXPAND, 5 );

// Bind to m_text or this, same effect
m_text->Bind(wxEVT_SIZE, &DIALOG_WRAPTEXT::onResize, this);

}

void DIALOG_WRAPTEXT::onResize( wxSizeEvent& event )
{
//m_text->Freeze(); // makes no difference
const auto w = event.GetSize().GetWidth();
wxLogDebug( "Wrap to width: %d",w ); // produces sensible values
m_text->Wrap( w );
//m_text->Thaw();
event.Skip();
}class MyApp: public wxApp
{
public:

bool OnInit() override
{
auto d = new DIALOG_WRAPTEXT(NULL, "Dialog title", wxSize(200, 200));

d->ShowModal();
d->Destroy();
}
};

wxIMPLEMENT_APP(MyApp);

Как правильно динамически переносить статический текст в диалоге?

0

Решение

Без использования wrap () wxStaticText отображает текст корректно (с переносом по границам слов), используя следующий минимальный код для окон с wx 3.0.2. Я могу изменить размер диалога (уменьшить, увеличить), и wxStaticText будет обновляться правильно. Этого недостаточно для вашего варианта использования? Вы уверены, что вам нужно использовать функцию обтекания?

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
class DIALOG_WRAPTEXT : public wxDialog
{
public:

DIALOG_WRAPTEXT(wxWindow* parent,
const wxString& aTitle, const wxSize aSize);

private:

void onResize(wxSizeEvent& evt);

wxBoxSizer* m_itemBoxSizer;
wxStaticText* m_text;
};

DIALOG_WRAPTEXT::DIALOG_WRAPTEXT(
wxWindow* parent, const wxString& aTitle, const wxSize aSize) :
wxDialog(parent, wxID_ANY, aTitle,
wxPoint(-1, -1), aSize,
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
m_itemBoxSizer = new wxBoxSizer(wxVERTICAL);
SetSizer(m_itemBoxSizer);

wxString msg("Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ""Lots and lots of text to wrap hopefully. ");

m_text = new wxStaticText(this, wxID_ANY, msg);
// wxEXPAND makes no difference
m_itemBoxSizer->Add(m_text, 1, wxALIGN_TOP | wxALL | wxEXPAND, 5);

// Act on dialog resize
Bind(wxEVT_SIZE, &DIALOG_WRAPTEXT::onResize, this);

}

void DIALOG_WRAPTEXT::onResize(wxSizeEvent& event)
{
// layout everything in the dialog
Layout();
event.Skip();
}class MyApp : public wxApp
{
public:

bool OnInit() override
{
auto d = new DIALOG_WRAPTEXT(NULL, "Dialog title", wxSize(200, 200));

d->ShowModal();
d->Destroy();

return true;
}
};

wxIMPLEMENT_APP(MyApp);
1

Другие решения

Столкнулся с подобной проблемой. Я должен хранить распакованное сообщение где-нибудь, когда wxStaticText изменен, установите сообщение и вызовите перенос. в противном случае строка не может быть красиво завернута.

void MyFrame::onResize(wxSizeEvent& evt)
{
const auto w = evt.GetSize().GetWidth();
m_text->SetLabel(m_msg); // unwrapped message
m_text->Wrap(w);
evt.Skip();
}
0

По вопросам рекламы [email protected]