[Solved][WxWidgets] Przekazanie wskaźnika z własnego main-a

0

Witam
Męczę się z problemem przekazania wskaźnika na obiekt do aplikacji WxApp. Chodzi o to by we własnym main-ie można było ustawiać zawartość pola tekstowego.
Ma ktoś pomysł jak to zrobić?
Poniżej uproszczona wersja mojego kodu, kod składa się z 4 plików wxgui.h/cpp i main.h/cpp. Platforma to Linux

wxgui.h

#include <wx/wx.h>					
#include <wx/image.h>

enum
{
	ID_TEXT_LABEL = wxID_HIGHEST + 11,
	ID_PANEL = wxID_HIGHEST + 120
};

class Okno: public wxFrame {
public:
	Okno(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE);

protected:
	wxTextCtrl* text_label;
	virtual void ustawText(int ID_ELEMENTU, std::string& tekst);
}		

class WuXy: public wxApp {
public:
	bool OnInit();
	virtual void ustawText(int ID_ELEMENTU, std::string& tekst);
};	 

wxgui.cpp

 #include "wxgui.h"
Okno::Okno(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxFrame(parent, id, title, pos, size, wxDEFAULT_FRAME_STYLE)
{
	panel = new wxScrolledWindow(this, ID_PANEL, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
	text_label = new wxTextCtrl(panelGlowny, ID_TEXT_LABEL, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
	set_properties();
	do_layout();
}

void Okno::ustawText(int ID_ELEMENTU, std::string &tekst)
{
	wxTextCtrl *pole_tekstowe;
	wxString text_wx(tekst.c_str(), wxConvUTF8);
	if (ID_ELEMENTU == ID_TEXT_LABEL)
		pole_tekstowe = text_label;
	pole_tekstowe -> AppendText(text_wx);
}

bool WuXy::OnInit()
{
	wxInitAllImageHandlers();
	Okno OknoWx = new Okno(NULL, wxID_ANY, wxEmptyString);	// Zle miejsce na tworzenie obiektu
	SetTopWindow(OknoWx);
	std::string tekst="Labelek";					// Zle miejsce na tekst
	OknoWx->ustawText(ID_TEXT_LABEL, tekst);			// Zle miejsce na ustawianie
	OknoWx->Show();
	return true;
}

void WuXy::ustawText(int ID_ELEMENTU, std::string &tekst)
{
	this->ustawText(ID_ELEMENTU, tekst);
}

IMPLEMENT_APP_NO_MAIN(WuXy) 		// Makro dla WuXow z informacja ze mam wlasnego main-a

main.h

#include "wxgui.h" 

main.cpp

 int main(int argc, char * argv[])
{
	wxEntry(argc, argv);			// Odpal WuXy
	std::string tekst="TekstMain";
	// Jak tutaj ustawic tekst?
	// ??->ustawText(ID_TEXT_LABEL, tekst);
	
	return 0;
}
0
void WuXy::ustawText(int ID_ELEMENTU, std::string &tekst)
{
        this->ustawText(ID_ELEMENTU, tekst); // <--- pewny jesteś tego???
}
0

Nie, nie jestem tego pewny ale to już mniejsze zło, jeśli będzie trzeba to zadeklaruje obiekt wcześniej i będę na nim operował:

class WuXy: public wxApp {
public:
	OknoGlowne* OknoWx;   // <- 
        bool OnInit();
        virtual void ustawText(int ID_ELEMENTU, std::string& tekst);
};  
bool WuXy::OnInit()
{
        wxInitAllImageHandlers();
        OknoWx = new Okno(NULL, wxID_ANY, wxEmptyString);        // <-
        SetTopWindow(OknoWx);
        OknoWx->Show();
        return true;
} 
 void WuXy::ustawText(int ID_ELEMENTU, std::string &tekst)
{
        OknoWx->ustawText(TEXT_LABEL, tekst);
}

main

int main(int argc, char * argv[])
{
        wxEntry(argc, argv);                        // Odpal WuXy
        std::string tekst="TekstMain";
	wxTheApp->ustawText(TEXT_LABEL, tekst);
        
        return 0;
} 
0

No dobrze, ale po co tak kombinujesz? Nie wystarczy typowe stworzenie i zainicjowanie wxApp?

0

Chodzi o: ?

main.cpp
int main(int argc, char * argv[])
{
std::string tekst="TekstMain";
WuXy* wxAPP = new WuXy();
wxEntry(argc, argv);  
wxAPP->ustawText(TEXT_LABEL, tekst);   
return 0;
}
0

Nie, wywal funkcję **main ** razem z linią IMPLEMENT_APP_NO_MAIN i daj:

IMPLEMENT_APP(WuXy)

I tyle. Całą resztę robisz w OnInit.

0

Mój kod się skompilował ale źle się skończył :/
Niestety, main musi zostać. Program bazuje na innym kodzie (GPL) i jest tego sporo. WxWidgets ma być tylko jedną ze skórek i to main ma rządzić w tym małżeństwie. Inna skórki to np ncurses, cdk i kiedyś Qt.

Dlatego zależy mi by to właśnie main decydował kiedy ma się tekst zmienić w polu tekstowym.


Edit
Udało się i działa. Potrzebowałem zmienić wxEntry(), na wxEntryStart()

 int main(int argc, char * argv[])
{
std::string tekst="TekstMain";
WuXy* wxAPP = new WuXy();
wxApp::SetInstance(wxAPP);
wxEntryStart(argc, argv);  
wxTheApp->OnInit();
wxAPP->ustawText(TEXT_LABEL, tekst);   
wxTheApp->OnRun();
wxTheApp->OnExit();
void wxEntryCleanup();
return 0;
}

Zawiera to jeszcze część kodu niepotrzebnego i/lub niepoprawnego ale jutro jeszcze poczytam co poszczególne funkcje robią dokładnie i zrobię jak należy.

Dzięki serdeczne za pomoc i wskazanie mi drogi. Tu zawsze można liczyć na dobrą radę :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1