LIBRAIRIE DE CLASSE POUR GTK+

cs_Light Angel Messages postés 48 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 1 janvier 2005 - 1 janv. 2005 à 16:30
psykocrash Messages postés 240 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 17 mars 2009 - 13 juil. 2005 à 05:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/28550-librairie-de-classe-pour-gtk

psykocrash Messages postés 240 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 17 mars 2009
13 juil. 2005 à 05:19
Voici la réponse à ton problème s'il n'est pas déjà résolu :

void Crystal::Init(void)
{
gtk_init(NULL, NULL);
}
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
2 janv. 2005 à 02:11
Ouais c'est pas plus mal comme ça, mais dans ce cas faut adapter main.cpp pour que ça reflète cette procédure :)
cs_Light Angel Messages postés 48 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 1 janvier 2005
2 janv. 2005 à 00:57
Bein justement, le delete, c'est pas obligatoire, en haut, au lieu de déclarer :

Form *frmMain;
Button *cmdExit;

On déclare :

Form frmMain("Main");
Button cmdExit("Quitter");

Et on ne s'enmerde pas, si jamais une fonction nécéssite un pointeur vers un Crystal ou vers un dérivé de Crystal, on s'enmerde pas, on passe &lobjet en argument ... Les pointeurs, on est pas obligé de les mettre, c'est même mieu de pas les mettres, mais j'en avais besoin pour les tests ...
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
2 janv. 2005 à 00:27
Ouais ben en fait comme je t'ai dit j'ai réglé le pb en implémentant la fonction Close() mais j'ai mis dedans :
gtk_widget_destroy(this->Widget);

Par contre cette histoire de "delete" c'est pas super (même pas super du tout du tout); il doit y avoir moyen de faire comme avec wxWidgets, c'est à dire de faire en sorte que ce soit la librairie, et non le programmeur qui l'utilise, qui détruise les objets alloués (ne serait-ce que dans la fonction Crystal::Exit()...).
cs_Light Angel Messages postés 48 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 1 janvier 2005
1 janv. 2005 à 21:27
voila ce qui devrai normalement être dans la fonction Close :

void Form::Close(void)
{
gtk_widget_destroy(this->Object());
}

PS : les WARNINGS dans DevC++, je ne suis pas au courant, je n'est pas testé. Quoi qu'il en soit, sous VC++, ya pas de Warnings.

PS2 : Je vien de remarquer une autre erreur dans le fichier Main.cpp, faut pas oublier de détruire cmdExit

void *cmdExit_OnClick(GtkWidget *, void *)
{
...
delete cmdExit;
...
}
cs_Light Angel Messages postés 48 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 1 janvier 2005
1 janv. 2005 à 21:23
Ah ui, en effet, me suis gouré dans le fichier Main.cpp, remplace frmMain->Close() par frmMain->Kill() ou alors, rajoute la fonction Close() à Form. Désolé.
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
1 janv. 2005 à 21:14
T'as oublié d'implémenter la fonction Form::Close() dans tes sources, je l'ai rajoutée (j'ai mis un gtk_widget_destroy mais je doute que ce soit vraiment ça...si?).
Quoi qu'il en soi il y a pas mal de warnings quand on compile avec Dev-C++ :(
J'essaie d'en virer un max possible (déjà, rien que le fait de ne pas finir un fichier source par un retour à la ligne crée un warning...).
cs_Light Angel Messages postés 48 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 1 janvier 2005
1 janv. 2005 à 20:52
Attend, j'essaye, comme j'ai changé d'ordinateur et que j'ai pas encore réinstallé GTK+, je ne pourrai pas tester. Mais normalement, sa devrai marcher...
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
1 janv. 2005 à 20:42
Pour ta fonction gtk_init je ne pense pas que ce soit si compliqué.
En fait, le but de gtk_init() est de s'occuper de paramètres passés à l'application via la ligne de commande (+ l'initialisation de GTK+, bien entendu ^^).
Comme ça, si par exemple il y avait une option "display=" pour spécifier le numéro du Display (pour le système X Window, sous les UNIXs) tu pourrais appeler ton applciation comme ça :
mon_app display=2
Toi tu ne verrais pas la différence au niveau de la prog, vu que GTK+ aura soigneusement modifié argc et argv :)

Bref quoi qu'il en soi essaie ça :

class Crystal
{
// blabla...
public:
static void Init(int* pargc, char*** pargv);
};

void Crystal::Init(int* pargc, char*** pargv)
{
gtk_init(pargc, pargv);
}

Et bien sûr dans le main() :
Crystal::Init(&argc, &argv);

PS : j'avais pas vu, mais mettre main() qui renvoie un int est préférable en général...c'est la norme ^^
cs_Light Angel Messages postés 48 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 1 janvier 2005
1 janv. 2005 à 20:30
Ensuite, pour ce qui est de faire la meme librairie pour l'API Win32, j'ai essayé, mais j'arrive po (honte à moi). Enfin, pour les GtkWidget * dans les CallBacks, je vois pas ce que je peut faire à part faire un typedef.
cs_Light Angel Messages postés 48 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 1 janvier 2005
1 janv. 2005 à 20:27
Oui, je sais. J'ai fait des fonctions statiques dans la classe Crystal (à savoir, Run et Exit) et j'ai essayé de rajouter la fonction Init, mais sa marché pas. Surtout que gtk_init est une macro, et non ne fonction, donc, pour savoir ce que je dois mettre dans les arguments ...
Qu'est-ce qui peut nécéssité l'adresse d'un tableau de pointeur (char *[]) parce que gtk_init demande l'adresse de argc, sa c'est facile, mais l'adresse de argv, c plus compliqué ... Je pourrait éventuelement le mettre a jour, mais je ne voit pas ce que je doit rajouter ...
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
1 janv. 2005 à 20:19
L'API me plaît bien...bah ça ressemble à du GTK-- (logique...^^).
Ce qui serait sympa serait de faire une version basée sur l'API Win32 sous Win et sur GTK+ sous les UNIXs (voire sous Win aussi pourquoi pas puisque c'est déjà là :p).

Par contre je trouve dommage que certaines parties du code que l'on crée soit relatif à GTK (on utilise des "GtkWidget" et gtk_init()), quitte à avoir une librairie pour masquer ça, autant tout masquer non?
cs_Light Angel Messages postés 48 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 1 janvier 2005
1 janv. 2005 à 16:30
N'hesitez pas à rajouter des commentaires