Les Amiga Developper Classes sont un ensemble de classes qui font une surcouche a l'API originale de l'AmigaOS 3.1 et 3.5, de manière a pouvoir programmer le système de façon objet. C'est inspiré ( très ) librement des MFC ( Microsoft Foundation Classes ) sur Windows. Elles permettent d'utiliser ( à mon avis ) plus simplement l'API de l'amigaOS. Ces classes sont en continuels développement. Je les utilises dans mes projets, et j'essaie de faire profiter toute la communauté de mon travail. La version actuelle ( 0.0 ) ne permet pas de faire grand chose ( principalement gérer des fenêtres avec des gadgets de type boutons ), mais elle permet d'apprehender la philosophie de cet ensemble de classes.
Je tiens a dire que je n'ai qu'une courte expérience de l'API AmigaOS. Alors si vous trouvez des erreurs ou des inconsistence n'hésitez pas a m'en tenir au courant grâce a un mail.
Les ACC ont été programmée en utilisant StormC++ de Haage&Partner. Une compilation sur tout autre compilateur doit etre tres aisée.
Conventions et philosophie générale du code
Conventions d'écritureVariables
- Les variables membres commencent
toujours par "m_" (exemple: m_pWnd
)
- Les pointeurs commencent
toujours par "p" ou "m_p" si c'est un pointeur membre.
- Les entier ( int, WORD,
long,...) commencent toujours par "n" ( exemple: m_nNbrUser,
nLength )
- Les boolean ( BOOL ) commencent
toujours par "b"
Classes
- Les classes dont le nom commence par "C" (exemple: CGadget) sont des classes derivée de CBase. Si elles ne sont pas derivée de CBase elles ne comportent pas le "C".
Méthodes
- Les méthodes commencant par "On..." sont les méthodes qu'il faut surcharger pour etre notifié des changements a l'intérieur de l'objet. Dans le cas général on doit appeler la méthode de la classe de base a la fin de la fonction. Pour certaines méthodes un appel en début de fonction est nécessaire. Ce référencer a la documentation.
Exemple:
void CMyWnd::OnRefreshWnd()
{
//
code de l'utilisateur
Refresh();
//Appel
de la classe de base
CWnd::OnRefreshWindow();
}
La classe CBase est la classe de base de toutes les ACC. Elle contient le numéro de version des différentes classes dérivée.
Le constructeur de la classe.
nVersion est un entier représentant le numéro de version de
votre classe dérivée.
Le Copy constructeur de la classe.
Il permet de faire des copies d'objet a objet. Il reçoit en paramètre
l'objet source.
Méthode pour retrouver le numéro de version de l'objet. Retourne un entier contenant le numéro de version. (actuellement pour toutes les classes = 0 )
La classe CRect permet de stocker les coordonées d'un rectangle. Elle permet aussi quelques fonctions "évoluée" comme calculer la hauteur ou la largeur du rectangle.
Membres publiques qui indiquent
les coordonées des sommets du rectangle. ( X1,Y1: Sommet en haut a
gauche, X2,Y2: Sommet en bas a droite )
Constructeur.
Constructeur. On passe chaques
coordonées.
Copy constructeur.
Retourne la hauteur du rectangle.
Retourne la largeur du rectangle.
La classe CString permet de gérer des chaines de caractéres bien plus facilement qu'avec les char* du language C. Plus besoin d'allouer des buffers, et de les libérer, tout est fait en interne dans cette classe.
Constructeur.
Copy constructeur.
Retourne la longueur en caractère
de la string.
Donne accés au buffer interne
de char* de la classe. Ne pas utiliser cette méthode pour modifier
la string. Utilisez cette méthode pour lire les char seulement.
Retourne TRUE si la string est
vide, ou FALSE si elle contient du texte.
Efface la string.
La classe CList est une classe de type template ce qui signifie qu'elle peut contenir n'importe quel type de classe. Vous pouvez donc, au moyen de CList, avoir en mémoire une liste de int, char, CMaClasse, etc...
Constructeur.
Ajoute un élement a la
fin de la liste.
Enléve tous les élements
de la liste.
Retourne le nombre d'élement
que contient la liste.
Retourne un pointeur sur l'élement nIndex. Si le pointeur est NULL l'élement est impossible a retrouver.
La classe CObj est la classe de base pour tous les objets graphiques ( fenêtres, bouton, slider, gadget..) . Elle contient toutes les caractéristiques communes a ces élements.
Constructeur. Le numéro
de version de la classe doit être passé en paramètre.
Copy constructeur.
Retourne le titre de l'objet.
( pour une fenétre son titre, pour un bouton, son texte, etc.. )
Permet de changer le titre de
l'objet.
Positionne l'objet sur l' écran.Ces
coordonnées se referrent toujours a l'objet parent: pour une fenêtre,
l'écran et pour un gadget, sa fenêtre.
Retourne la position actuelle de l'objet.
Cette classe est la classe de base de toutes les fenêtres. Elle contient toute l'ossature pour gérer les messages de Intuition. Elle communique ses notifications au moyen de fonctions virtuelles que le client devra surcharger.
Constructeur.
Crée la fenêtre.
Les coordonnées de la fenêtre sont passé en paramétre.
La variable pScreen contient un pointeur sur l'écran qui doit recevoir
la fenêtre. si il est omi, la fenêtre du Workbench sera choisie.
A chaque gadget que vous créez
pour une fenêtre vous devez l'enregistrer a la fenêtre pour qu'ils
soit tenu au courant des évenement. Cette méthode doit etre
utilisée exclusivement dans la surcharge de OnGadgetCreate()
Permet de faire apparaitre/disparaitre
la fenêtre.
Affiche la fenetre. Ne retourne que lorsque la fenêtre est fermée. Les messages Intuition sont récupérés, et communiqués au client au moyen des méthodes virtuelles ci-dessous.
Appelé lorsque l'utilisateur
veux fermer la fenêtre. Si vous retourner TRUE la fenêtre sera
effectivement fermée, et FALSE la fenêtre restera ouverte.
Appelé lors de la réception
du message intuition IDCMP_MOUSEMOVE.
Appelé lors de la réception
du message intuition IDCMP_REFRESHWINDOW. La classe de base s'occupe deja
de rafraichir les gadgets GadTools.
Méthode appelée lors de la création de la fenêtre. C'est l'endroit ou vous devez créer/enregistrer tous les gadgets de la fenêtre.
La classe CGadget est la classe base de tous les gadgets (Button, Sliders, Radio button, check,...). Elle reçoit les messages intuition de base.
Constructeur.
Permet de fixer un entier pour
designer un gadget ( son ptit nom quoi )
Retrouve l'ID du gadget.
Crée le gadget. Cette étape
doit se faire dans la méthode CWnd::OnGadgetCreate(). le pointeur sur
visual info est a récupérer de la fenêtre.
Appelé lors du message
Intuition IDCMP_GADGETUP
Appelé lors du message Intuition IDCMP_GADGETDOWN.
La classe CButton gére un simple bouton. Elle avertit le client d'un clic au moyen d'une notification.
Constructeur.
Appelé lors du clic sur le bouton.
Dans cet exemple nous allons créer une fenêtre toute simple et lui mettre un bouton dedans. Tout d'abord vous devez dériver une nouvelle fenêtre de la classe CWnd (de manière a lui ajouter un bouton). Vous allez donc déclarer une nouvelle classe comme suit:
//Main window
class CTestWnd : public
CWnd
{
//Overrides
//Creation of all
gadgets
virtual BOOL OnGadgetCreate(void
*pVisualInfos, struct Gadget *pGadgetContext);
//Our button
CTestButton m_button;
};
Nous déclarons donc une nouvelle
classe CTestWnd derivée de CWnd qui contient un bouton ( m_button ) et
qui surcharge la méthode OnGadgetCreate de manière a etre tenu
au courant de la création de la fenêtre.
Vous pouvez constater que le bouton
n'est pas simplement dérivé de CButton. A la place nous créons
une nouvelle classe qui dérive de CButton, CTestButton. Quel est l'interet
de faire ça me direz vous? Et bien si nous mettons seulement un objet
du type de base ( CButton ) dans la fenêtre, il nous sera impossible de
récupérer l'évenement OnClick du bouton.
Donc voici maintenant la déclaration de la classe CTestButton:
class CTestButton : public
CButton
{
public:
//a pointer to
the parent window
CTestWnd *m_pParent;
//override of Click
method
virtual void OnClick();
};
Ici nous dérivons simplement la classe de CButton, nous surchargons la méthode OnClick pour réagir au Clic du bouton, et nous ajoutons un pointeur sur le Parent (la fenêtre) qui nous sera utile plus tard.
Voila les classes sont déclarées, nous n'avons plus qu'a passer a l'implémentation...
D'abord la fonction principale du programme: Main():
int main(void)
{
// Instanciate
a CTestWnd object
CTestWnd wnd;
//Create it with
the coordinates
wnd.Create( 10,10,200,200);
//Set title
wnd.SetTitle("Amiga
rulez!!");
//Display it
wnd.ShowModal();
//end
return(0);
}
C'est simple, hein? bon simplement on instancie un objet CTestWnd, on le crée avec Create et on lui donne ses coordonnées a l'écran. On lui fixe son titre, et on l'affiche avec ShowModal. Quand la fenétre est fermée on retourne 0 pour dire que tout c'est bien passé.. c'est tout.
Ensuite nous allons voir la création du layout de la fenetre. Nous allons voir la methode OnCreateGadget de la fenetre qui est appelée au moment de la creation de la fenetre. C'est le moment ou il faut créer et enregistrer chaques gadget.
BOOL CTestWnd::OnGadgetCreate(void
*pVisualInfos, struct Gadget *pGadgetContext)
{
//set parent
m_button.m_pParent
= this;
//Set caption
m_button.SetTitle("Close
the Window");
//Set position
m_button.SetPosition(10,150,150,18);
//Set ID
m_button.SetID(0);
//Create it
m_button.Create(
pVisualInfos, pGadgetContext );
//register it
RegisterGadget(
m_button );
//Everything is
ok
return TRUE;
}
Ici nous initialisons notre bouton. D'abord on lui fixe le pointeur sur le parent qui nous sera utile pour la methode OnClick, ensuite on lui fixe son texte son ID(optionnel) et sa position. Puis on le crée et on l'enregistre a la fenêtre et on retourne TRUE pour dire a la fenetre que tout c'est bien passé.
La définition du bouton maintenant:
void CTestButton::OnClick()
{
if( m_pParent
!= NULL )
{
//we close the
window
m_pParent->Show(
FALSE );
}
//call base class
CButton::OnClick();
}
Cette méthode est appelée a chaque fois que l'utlisateur appuie sur le bouton. Le but est de fermer la fenetre dans notre cas. Alors on verifie si le pointeur ala fenètre est différent de NULL, puis on appelle la méthode Show(FALSE) de la fenêtre pour la fermer. On appelle ensuite le comportement par défaut du bouton.
Voila c'est tout. C'est sur
que cet exemple n'est pas super impressionnant, mais il est surtout la
pour demontrer la philosophie des ACC. vous pouvez downloader cet exemple
dans la section download.
Dans cette section, j'ai voulu mettre les changements et additions queje vais faire au package. C'est juste une estimation et ça peux changer en fonction de mes projets personnels.
Licence
et informations au sujet de l'auteur
Toutes ces classes sont entieremment Freeware. Vous pouvez les utiliser dans tous programmes commerciaux ou non. Je vous saurais juste gré de m'envoyer un email si vous utilisez partiellement ou entiéremment ce code.
En cas de modifications ou d'ajout de nouvelles classes, veuillez les envoyer a l'auteur de manière a centraliser les données merci.
L'auteur : Alain Bocherens ( alan ) - alain@devils.ch