PDA

View Full Version : WxWindows e console


miondere
23-04-2004, 14:33
Esiste qualcosa nelle wxwindow che mi simuli la console (dos) tipica del
C++, dato che volevo inserire all'interno della mia OnInit() un programma
già scritto in C++ ma dove voglio sia input che output su console?

Grazie.
Ciao

ilsensine
23-04-2004, 15:57
Se sei sotto windows, dovresti tentare di creare un normale progetto per console: oltre alle finestre di wxwindows, avrai anche una console dove potrai scriverci con le normali funzioni per stdout. Ho provato questo procedimento tempo fa con le FOX, e mi funzionava. Non so se la lettura però funziona.
Se sei sotto linux, la console è sempre abilitata (basta che lanci il programma da console, o imposti un link in kde indicando di eseguire il programma da console).

miondere
23-04-2004, 19:17
Mi è stato suggerita anche la seguente cosa:

"Se vuoi l'output su console è sufficiente non inserire il
flag -mwindows(questo in Mingw) o simili nelle opzioni del
compilatore(dipende dal compilatore)"


Io uso visual studio 6.0 da poco, sai che opzione non devo inserire? Equivalente a questa -mwindows?

Ciao

ilsensine
23-04-2004, 19:54
Il vc non consente di create una applicazione per console?
Non lo conosco molto neanch'io...

gokan
23-04-2004, 20:15
Se nella scelta dei progetti prendi "console application", non ti va bene?

miondere
26-04-2004, 00:59
Una cosa del genere secondo voi può permettermi di utilizzare il cout e il cin?



wxFFileOutputStream output(stdout);
wxTextOutputStream cout(output);

wxFFileInputStream input(stdin);
wxTextInputStream cin(input);

cionci
26-04-2004, 02:10
Ma utilizzare cin e cout non ti piace ? ;)

miondere
26-04-2004, 07:40
Originariamente inviato da cionci
Ma utilizzare cin e cout non ti piace ? ;)

Mi piacerebbe :D
Ma come faccio? La console come faccio ad attivarla dentro la OnInit() e usare li dentro il cin e i cout?

cionci
26-04-2004, 08:47
Ma il suggerimento che ti hanno dato gli altri non funziona ?

Quindi tu vorresti attivarla da codice...
Credo che si possa fare, ma devi ricorrere a qualche API...

Prova con AllocConsole...

miondere
26-04-2004, 10:23
Allocconsole non mi sembra che sia portabile...l'avevo già guardata qualche giorno fa...sbaglio?

cionci
26-04-2004, 10:32
Chiaramente non è portabile...

Comunque basta fare:

#ifdef WIN32
AllocConsole....
#elif LINUX //non mi ricordo qual'è la costante predefinita
....
#endif

miondere
26-04-2004, 20:55
Originariamente inviato da cionci
Ma il suggerimento che ti hanno dato gli altri non funziona ?


Ho provato a partire da un progetto con la console, ma mi da errori di linking e non so come toglierli (avete idee?)

Linking...
p2p.obj : error LNK2001: unresolved external symbol "public: void __thiscall wxStringData::Free(void)" (?Free@wxStringData@@QAEXXZ)
MSVCRTD.lib(crtexe.obj) : error LNK2001: unresolved external symbol _main
Debug/P2P.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

P2P.exe - 3 error(s), 0 warning(s)



Proverò a guardare se con l'AllocConsole riesco a farlo andare...

ilsensine
26-04-2004, 21:02
p2p.obj : error LNK2001: unresolved external symbol "public: void __thiscall wxStringData::Free(void)" (?Free@wxStringData@@QAEXXZ)

Sembrerebbe che non stai linkando con la lib di wxwindows. La cosa strana è che se così fosse, dovrebbe dartene una caterba di simili errori.

MSVCRTD.lib(crtexe.obj) : error LNK2001: unresolved external symbol _main
I processi per console devono iniziare con la funzione "int main(int argc, char **argv)". Forse sei abituato a iniziare con la procedura WinMain e la stai usando anche qui?

miondere
26-04-2004, 22:07
Originariamente inviato da ilsensine
Sembrerebbe che non stai linkando con la lib di wxwindows. La cosa strana è che se così fosse, dovrebbe dartene una caterba di simili errori.

I processi per console devono iniziare con la funzione "int main(int argc, char **argv)". Forse sei abituato a iniziare con la procedura WinMain e la stai usando anche qui?



Io ho utilizzato la seguente struttura. Essendo alle primissime armi con le wxwindows (è il primo programma che provo a scrivere) non ho sinceramente idea di dove piazzare int main() classico del linguaggio C.
Il programma con le WxWindows lo sto scrivendo dentro la OnInit()




#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif


#include "wx/db.h"

#include "wx/dbtable.h"

#include "stdio.h"








// the application icon (under Windows and OS/2 it is in resources)
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
#include "mondrian.xpm"
#endif




class MyApp : public wxApp
{
public:
virtual bool OnInit();
};


class MyFrame : public wxFrame
{
public:

MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,
long style = wxDEFAULT_FRAME_STYLE);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);

private:
DECLARE_EVENT_TABLE()
};


enum
{
Minimal_Quit = 1,
Minimal_About = wxID_ABOUT
};



BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
EVT_MENU(Minimal_About, MyFrame::OnAbout)
END_EVENT_TABLE()

IMPLEMENT_APP(MyApp)



bool MyApp::OnInit()
{


//*** QUI DENTRO CI HO SCRITTO LA MIA APPLICAZIONE E LA FACCIO GIRARE QUI ***


return TRUE;
}




//da qui in poi ci sono altre funzioni inerenti al frame, niente di importante nel nostro caso

cionci
26-04-2004, 22:46
Credo che il main venga implementato qui dentro:

IMPLEMENT_APP(MyApp)


di conseguenza suppongo che l'unico tipo di main supportato sia il winmain...ed è per questo che non funziona... In tal caso non puoi creare la console in questo modo...

miondere
26-04-2004, 23:13
Originariamente inviato da cionci
Credo che il main venga implementato qui dentro:

IMPLEMENT_APP(MyApp)


di conseguenza suppongo che l'unico tipo di main supportato sia il winmain...ed è per questo che non funziona... In tal caso non puoi creare la console in questo modo...


Devo quindi puntare sull'AllocConsole....
Se metto come hai detto mi gira quindi anche su linux, sicurissimo? :-) (non ho qui con me linux adesso e non posso fare la prova pure li)
Ho fatto una prova ora su Windows e me la apre la console, mettendo il seguente codice dentro la mia OnInit()

AllocConsole();
SetConsoleTitle("Titolo");
cprintf("Scrivo qualcosa");
cscanf( "%u", prova);

miondere
26-04-2004, 23:31
Originariamente inviato da cionci
Credo che il main venga implementato qui dentro:

IMPLEMENT_APP(MyApp)


di conseguenza suppongo che l'unico tipo di main supportato sia il winmain...ed è per questo che non funziona... In tal caso non puoi creare la console in questo modo...


Devo quindi puntare sull'AllocConsole....
Se metto come hai detto mi gira quindi anche su linux, sicurissimo? :-) (non ho qui con me linux adesso e non posso fare la prova pure li)
Ho fatto una prova ora su Windows e me la apre la console, mettendo il seguente codice dentro la mia OnInit()

AllocConsole();
SetConsoleTitle("Titolo");
cprintf("Scrivo qualcosa");
cscanf( "%u", prova);

cionci
28-04-2004, 03:21
Diciamo che ti compila su Linux...sicuramente per visualizzare la console su Linux devi puntare su qualche altra cosa...

miondere
04-05-2004, 18:23
Ho creato un frame, ora però vorrei riuscire a scrivere e visualizzare qualcosa all'interno.
Mi sapreste indicare 2 funzioni per wxwindows per:

- mandare uno stream in output all'interno di questo frame

- prendere un valore in input in questo frame e salvarlo poi in una variabile

ciao

Luc@s
08-05-2004, 11:47
up