Кнопки wxButton не прокручиваются При получении данных от WorkerThread в wxWidgets

#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(); в конец метода.