#c #events #event-handling #scrollbar #wxwidgets
Вопрос:
Я использую wxNotebook для представления двух вкладок в своем приложении. И на 1-й вкладке у меня есть окно wxscrolled, которое получает данные из рабочего потока и отображает их. Проблема в том, что когда данные получены из рабочего потока и отображаются на 1-й вкладке(в терминах кнопок WX), кнопки не прокручиваются. Но когда я переключаюсь на 2-ю вкладку, а затем снова возвращаюсь(переключаюсь) на вкладку 1, кнопки становятся прокручиваемыми. Я приложил скриншот ситуации, в которой я оказался. Показанные кнопки изначально не прокручиваются, когда они создаются/отображаются внутри вкладки 1. Но когда я перехожу на вкладку 2, а затем обратно на вкладку 1, они становятся прокручиваемыми. Это код, который я использую для отправки данных:
wxThread::ExitCode WorkerThread::Entry()
{
wxThreadEvent *sendEvent = new wxThreadEvent(wxEVT_THREAD, ID_WORKER_THREAD);
for(int i = 0; i< 100; i )
{
sendEvent->SetInt(i);
std::cout<<"Sending event"<<std::endl;
wxQueueEvent(m_parentScrolled, sendEvent->Clone());
}
delete sendEvent;
return NULL;
}
И вот как я получаю данные и отображаю кнопки:
void MyScrolledWindow::onWorkerThread(wxThreadEvent amp;event)
{
std::cout<<"Student event received"<<std::endl;
wxButton* b = new wxButton(this, wxID_ANY, wxString::Format(wxT("Button %i"), event.GetInt()));
myScrolledWindow_Sizer->Add(b, 0, wxEXPAND, 3);
Layout();
}
Как я могу сделать кнопки прокручиваемыми в момент их создания, чтобы мне не приходилось переключаться между вкладками 1 и 2, чтобы сделать их прокручиваемыми.
Также рабочий поток был создан из обработчика событий onClick класса MyNotebook. Код, который я использовал для создания потока, выглядит следующим образом:
void MyNotebook::onClick(wxMouseEvent amp;event)
{
MyScrolledWindow *myScrolledWindow = dynamic_cast<MyScrolledWindow*>(FindWindowById(15));
//do the check if the above pointer is valid or not then proceed for the creation of thread
//create the thread
WorkerThread *workerThread = new WorkerThread(this, myScrolledWindow);
........//other code here
}
Может ли это быть проблемой? Когда я возвращаю NULL изнутри WorkerThread::Entry
, поток управления приходит сюда. Может ли это быть причиной проблемы?
Ответ №1:
В MyScrolledWindow::onWorkerThread
дополнение к вызову макета вам нужно позвонить в FitInside , чтобы пересчитать виртуальный размер окна. Добавьте строку FitInside();
в конец метода.