2009-11-25 5 views
2

Je commence tout juste à utiliser MetroWerks CodeWarrior 1.1 Pour Mac 68k dans un Mac System 7.5.5, mais j'ai besoin de savoir: Comment créer un simple formulaire avec un TextBox dessus? Merci.Création d'un formulaire en C++

+1

+1: Avoir un upvote. Devinez parce que vous travaillez avec une technologie plus ancienne. –

+0

... ce qui bien sûr est une raison terrible pour une downvote –

+0

Merci pour votre vote Jim. –

Répondre

1

Il existe plusieurs façons de le faire. Si votre version de CodeWarrior l'a, il serait préférable d'utiliser le framework PowerPlant. Il s'agit d'un cadre d'application qui facilite la création d'applications conformes aux normes d'interface utilisateur Mac. Cela fait plus de 10 ans, donc j'ai complètement purgé la hiérarchie de la classe PowerPlant de ma mémoire. Pardon.

Une autre façon de procéder consiste à créer une ressource DLOG dans ResEdit qui inclut un champ TextEdit qui correspond plus ou moins à la fenêtre. Ensuite, vous écrivez votre application principale, qui va inclure la boîte à outils typiques initialisations (je fais ce TOTALEMENT de la mémoire):

DialogPtr myDlog; 
short itemHit; 
InitGraf(&qd.thePort); 
InitFonts(); 
InitWindows(); 
InitMenus(); 
TEInit(); 
InitDialogs(0L); 
InitCursor(); 

myDlog = GetNewDialog(myDlogResID, 0L, -1L); 
ShowWindow(myDlog); 
while (true) { 
    ModalDialog(myDlog, &itemHit); 
} 

Ce qui va probablement travailler et est la façon la plus mal à faire l'interface utilisateur sur le Mac , mais si tout ce que vous voulez est une boîte avec une interface utilisateur simple et simple, vous serez OK.

Le problème avec ce code est qu'il ne gère pas bien les événements, la boucle est infinie, il n'y a pas de gestion de couper/copier/coller, il n'y a pas de respect des événements de menu, etc.

La boîte à outils Mac de cette époque vous oblige à faire beaucoup plus de travail que vous ne le pensez. C'est pourquoi il y avait des bibliothèques comme MacApp, Think Class Library et PowerPlant - ils ont fourni des méthodes POO pour gérer une grande partie de la merde d'entretien ménager pour vous. Au moment où j'ai fait la majeure partie de ma programmation Mac, je construisais une bibliothèque non-classe qui était du code C brut qui facilitait l'écriture de fenêtres en couches (avec des palettes flottantes) et une interface utilisateur fluide sans la surcharge de POO. Fondamentalement, j'ai dû écrire un gestionnaire de fenêtres, un gestionnaire de menus, un gestionnaire de dialogues, un gestionnaire d'événements, un répartiteur de commande, etc. Quand tout a été dit et fait, il y avait quelque chose comme 18K de frais généraux pour construire une application typique. FYI, Acrobat Recherche sur Macintosh jusqu'à la version 4, tout comme Acrobat Catalog.

Vous pouvez trouver des exemples canoniques dans MacTech, like this qui est similaire au code ci-dessus. Avant de commencer à créer votre interface utilisateur entière à partir des boîtes de dialogue, toutes les vieilles notes techniques Macintosh ont dit NE PAS FAIRE CECI. Le DialogManager est l'un des morceaux les plus abusés du code Macintosh. Il a été construit dans le but de le rendre facile à mettre d'une boîte qui dit, "Êtes-vous sûr que vous voulez fermer 'Sans titre'?" avec un bouton OK et un bouton d'annulation. C'est surprenant de voir à quel point on peut en abuser.

La vraie façon de faire est d'écrire une main qui initialise les éléments de la boîte à outils, construit une barre de menu de base puis alloue un objet que vous concevez, par exemple NathanWindow. NathanWindow pourrait ressembler à ceci:

class NathanWindow { 
public: 
    NathanWindow(); 
    virtual ~NathanWindow(); 
    void Initialize(); 
    void Click(short part, EventRecord *evt); 
    void Show(); 
    void Hide(); 
    void Drag(); 
    void Move(); 
    // etc; 
protected: 
    virtual WindowPtr MakeWindow() = 0; 
    virtual void OnInit() = 0; 
private: 
    WindowPtr _win; 
}; 

alors vous sous-classe avec ce code pour appeler NewWindow() dans le style approprié.

Initialiser ressemblera à quelque chose comme ceci:

void NathanWindow::Initialize() 
{ 
    _win = MakeWindow(); 
    _win->refCon = this; 
    OnInit(); 
} 

maintenant, ce dernier peu est la partie la plus délicate - j'ai mis un pointeur sur le NathanWindow dans le champ Refcon WindowPtr Macintosh. Ensuite, vous aurez à construire une boucle d'événement dans votre code principal qui ressemblera à ceci:

void HandleMouseDown(EventRecord *evt) 
{ 
    WindowPtr win; 
    short thePart; 

    thePart = FindWindow(eventPtr->where, &win); 
    if (win) { 
     NathanWindow *nw = (NathanWindow *)win->refCon; 
     nw->Click(thePart, evt); 
    } 
} 

void EventLoop(void) 
{ 
    EventRecord evt; 

    while (true) { 
     if (WaitNextEvent(everyEvent, &evt, kSleep, nil)) { 
      switch (evt.what) { 
      case mouseDown: 
       HandleMouseDown(&evt); 
       break; 
     } 
    } 
} 

puis Cliquez ressemblera à ceci:

NathanWindow::Click(short thePart, EventRecord *evt) 
{ 
    switch(thePart) { 
     case inGoAway: Close(); break; 
     case inDrag: Drag(); break; 
     case inGrow: Grow(); break; 
    } 
} 

et ainsi de suite.

Et même encore, c'est (potentiellement) faux car vous voulez vraiment que chaque NathanWindow soit accroché dans un parent d'application qui gère les couches et les groupements de fenêtres. Un NathanWindow devrait contenir une liste de NathanControls. Un NathanControl est quelque chose qui peut dessiner, réagir aux événements, et ainsi de suite.

Tout cela est dans le cas où vous n'avez pas PowerPlant, qui fait tout cela pour vous. Il y avait une raison pour laquelle Apple aimait vanter la ligne "c'est dur d'être facile", parce que l'API que vous aviez à portée de main était tellement primitive.

+0

Merci beaucoup! Très bien expliqué! +1 et accepté –

2

Je ne sais pas si CodeWarrior 1.1 contient un concepteur d'interface graphique, mais vous pouvez créer une fenêtre en utilisant l'API C native (CreateNewWindow).

Le problème est, il n'y a plus de documentation en ligne pour 7.5, donc je ne peux pas vous aider en détail.

+0

Pouvez-vous publier un exemple d'utilisation de CreateNewWindow? Merci. –

+0

+1 pour votre conseil! –

Questions connexes