Amiga Developper Classes - documentation V 0.1


  Introduction & But des ADC

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'écriture

Variables

- 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();
}
 

Descriptions des classes

Diagramme des classes

CBase

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.


CRect

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.

CString

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.

CList

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...


CObj

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.


CWnd

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.

Notifications:


CGadget

La classe CGadget est la classe base de tous les gadgets (Button, Sliders, Radio button, check,...). Elle reçoit les messages intuition de base.

Notifications:


CButton

La classe CButton gére un simple bouton. Elle avertit le client d'un clic au moyen d'une notification.


Exemples

Exemple 1: ouverture d'une fenêtre avec un bouton CLOSE:

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.
 

Versions


Downloads


Futur

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