Just another IT weblog

Code::Blocks vs Gtk2+

Luglio 20th, 2007 by Mattneri

Ammetto che sviluppo software sotto linux da relativamente poco tempo. Quindi inizialmente mi sono trovato un pò spiazzato nella scelta di un’IDE che potesse rimpiazzare almeno in parte le funzioni offerte dagli IDE commerciali presenti su piattaforma Microsoft.

Ho provato veramente varie opzioni, da quelle più minimali (Vim/Make) a Eclipse, passando per il plugin C++ di Netbeans e dando un’occhiata a Anjuta. Alla fine però la soluzione che mi ha maggiormente convinto consiste in un IDE cross-platform open source chiamato Code::Blocks.

Le cose che mi hanno più colpito di Code::Blocks, oltre alla pulizia della GUI, sono la curva di apprendimento relativamente veloce, l’estrema flessibilità ed adattabilità ( gli posso dire di utilizzare il compilatore della M$, il gcc, quello della Borland ecc…), la struttura modulare a plugin e gli aggiornamenti giornalieri!

Ultimamente lo sto utilizzando per sviluppare una GUI con le GTK+ ed eccoci giunti finalmente al motivo principale di questa guida…utilizzare Code::Blocks per sviluppare con C/C++ e GTK+.

Per prima cosa scarichiamoci tutto il necessario (la mia guida è relativa a Ubuntu ma non credo sia difficile adattarla a un’altra distro):

sudo apt-get install build-essential gdb libgtk2.0-dev

E poi inserendo in /etc/apt/sources.list il seguente repository scaricate le wxWidgets 2.8 necessarie x utilizzare le Nightly Builds:

## wget http://www.tt-solutions.com/vz/key.asc | sudo apt-key add key.asc
deb http://apt.tt-solutions.com/ubuntu/ feisty main

Che verranno poi installate con il seguente comando:

sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev wx2.8-headers wx-common

 

Ora scarichiamo e installiamo la Nightly Build di Code::Blocks.

A questo punto dovremmo avere il nostro ambiente di sviluppo funzionante.

Creiamo un nuovo Progetto Vuoto e a questo punto non resta che configurare un paio di opzoioni di compilazione:

 

  1. In Project/Build options…/Compiler Settings/Other Options inserite `pkg-config –cflags gtk+-2.0`
  2. In Project/Build options…/Linker Settings/Other linker options inserite `pkg-config --libs gtk+-2.0`

Ora potete creare un nuovo User Template selezionando File/Save project as user template..

 

 

Posted in C/C++, Linux, Programmazione | 2 Comments »

Comunicazione tra Flash e C++/CLI

Giugno 6th, 2007 by Mattneri

 

Nei giorni scorsi stavo tentando si sviluppare un controllo flash da utilizzare all’interno di una Windows Form e mi sono di conseguenza scontrato con varie problematiche inerenti la comunicazione e il passaggio di dati fra le due tecnologie. Di seguito vi riporto brevemente alcune annotazioni. Gli snippets di codice riportati sono in ActionScript e C++/CLI, ma possono facilmente essere convertiti in qualunque linguaggio che giri sotto il .Net Framework.

 

 

Comunicazione da .Net a Flash:

  • SetVariable( String^ nome, String^ valore );

Permette di settare il valore di una variabile ActionScript. Il problema è che SetVariable prende come parametri due stringhe, quindi non posso passare altri tipi di dato.

flashObj->SetVariable( nome, valore );

 

  • CallFunction( String^ command );

Permette di richiamare una funzione definita in ActionScript passando eventuali parametri. Permette di passare come parametro booleani, stringhe, array e oggetti;

In actionscript bisogna ricordarsi di importare ExternalInterface:

import flash.external.ExternalInterface;

e di definire un CallBack per ogni funziona che si vuole richiamare da C++:

ExternalInterface.addCallback("setVisible", null, setVisible);

 

- Invoca la funzione resetAll (definita in actionscript) senza passare alcun parametro.

String^ command = "<invoke name=\"resetAll\" returntype=\"xml\"><arguments></arguments></invoke>";

flashObj->CallFunction(command);

 

- Invoca la funzione setVisible (definita in actionscript) e le passa un booleano a true.

command = "<invoke name=\"setVisible\" returntype=\"xml\"><arguments><true/></arguments></invoke>";

 

X maggiori info:

http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/

html/wwhelp.htm?context=LiveDocs_Parts&file=00000344.html

 

 

Comunicazione da Flash a .Net:

  • fscomand( string comando, string parametro );

Permette di scatenare un evento FSCommand che verrà catturato dal container del Ocx Flash. Anche in questo caso vi è la limitazione che fscommand permette di restituire solo stringhe(che poi andranno quindi convertite nel formato appropriato).

 

Da C++ quindi dobbiamo andare a gestire l’evento FSCommand.

void MyUserCtrl::flashObj_FSCommand(System::Object^ sender, AxShockwaveFlashObjects::_IShockwaveFlashEvents_FSCommandEvent^ e)

{

if(e->command == "Start")

{

switch(Int32::Parse(e->args))

{

case 1:

MessageBox::Show(“Start 1”);

break;

case 2:

MessageBox::Show (“Start 2”);

break;

}

}

else if(e->command == "stop")

{

MessageBox::Show(“Stop”);

}

}

 

Da ActionScript la sintassi da usare sarà la seguente:

fscommand(“Start”, “1”);

fscommand(“Stop”, “”);

 

  • ExternalInterface.call()

Permette di eseguire un metodo presente nel contenitore del controllo Flash. Richiede almeno un parametro che è il nome della funzione da richiamare. Gli eventuali altri parametri verranno poi passati alla funziona richiamata. Inoltre anche in questo caso è necessario importare la classe ExternalInterface.

var num1:Number = 5;

var num2:Number = 2;

var result:uint = ExternalInterface.call("somma", num1, num2 );

 

 

Gli argomenti passati da actionscript si potranno ricevere attraverso la proprietà request dell’evento e avranno una struttura simile alla seguente:

<invoke name="somma" returntype="xml">

<arguments>

<number>5</number>

<number>2</number>

</arguments>

</invoke>

 

Quindi in C++ il gestore dell’evento FlashCall sarà il seguente:

void MyUserCtrl:: flashObj _FlashCall(System::Object^ sender, AxShockwaveFlashObjects::_IShockwaveFlashEvents_FlashCallEvent^ e)

{

XmlDocument^ document = gcnew XmlDocument();

document->LoadXml(e->request);

XmlNodeList^ list = document->GetElementsByTagName("arguments");

somma( Convert::ToInt32( list[0]->FirstChild->InnerText ), Convert::ToInt32(list[0]->ChildNodes[1]->InnerText) );

}

 

void MyUserCtrl::somma( int num1, int num2 )

{

MessageBox::Show( (num1 + num2).ToString() );

}

Posted in C/C++, Net Framework, Programmazione | No Comments »