amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Programm mit GUI [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

11.02.2005, 13:31 Uhr

Bernhard
Posts: 144
Nutzer
Hallo!

Kann mir jemand erklären, wie ich ein kleines programm mit nem fenster und buttons und so machen kann, dass es ohne irgendwelchen zusätzlichen libs unter AmigaOS 1.3 läuft?

Das mit dem Fenster hab ich jetz schon hingekriegt, nur hab i jetz keine ahnung wie i da jetzt irgendwelche schaltflächen machen kann. gibts da irgendwas wo ich des nachlesen kann oder kann mir jemand ein kleines beispiel programm posten?

Danke
Bernhard

[ - Antworten - Zitieren - Direktlink - ]

11.02.2005, 14:34 Uhr

thomas
Posts: 7716
Nutzer
Beispiel:

code:
#include <proto/exec.h>
#include <proto/intuition.h>

#include <stdio.h>

#define GID_OK     1001
#define GID_CANCEL 1002

#define XY3DBorder(x,y,w,h) (x)+1,(y)+1, (x)+1,(y)+(h)-2, (x),(y)+(h)-1, (x),(y), (x)+(w)-2,(y), (x)+(w)-2,(y)+(h)-2, (x)+(w)-2,(y)+1, (x)+(w)-1,(y), (x)+(w)-1,(y)+(h)-1, (x)+1,(y)+(h)-1

WORD xy[] = {
	XY3DBorder(0,0,80,19), 
	};

struct Border border[] = {
	{0,0,2,0,JAM2,5,&xy[ 0],&border[1]},
	{0,0,1,0,JAM2,5,&xy[10],NULL      },
	};

struct IntuiText gtext[] = {
	{1,0,JAM2,32,3,NULL,"Ok",NULL},
	{1,0,JAM2,16,3,NULL,"Cancel",NULL},
	};

struct Gadget gad[] = {
	{&gad[1], 4,4,80,19,GFLG_GADGHCOMP,GACT_RELVERIFY,GTYP_BOOLGADGET,&border[0],NUL L,>ext[0],0,NULL,GID_OK,NULL},
	{NULL   ,88,4,80,19,GFLG_GADGHCOMP,GACT_RELVERIFY,GTYP_BOOLGADGET,&border[0],N ULL,>ext[1],0,NULL,GID_CANCEL,NULL},
	};

struct NewWindow nw = {
	20,20,200,50,0,1,
	IDCMP_CLOSEWINDOW|IDCMP_GADGETUP,
	WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_ACTIVATE|WFLG_NOC AREREFRESH|WFLG_GIMMEZEROZERO,
	&gad[0],NULL,
	"Mein Fenster",
	NULL,NULL,0,0,0,0,
	WBENCHSCREEN
	};


int main (void)

{
struct Window *win;
struct IntuiMessage *mess;
BOOL cont;


if (win = OpenWindow (&nw))
	{

	cont = TRUE;
	do	{
		WaitPort (win->UserPort);
		while (mess = (struct IntuiMessage *) GetMsg (win->UserPort))
			{
			switch (mess->Class)
				{
			case IDCMP_GADGETUP:
				break;
			case IDCMP_CLOSEWINDOW:
				cont = FALSE;
				break;
				}
			ReplyMsg ((struct Message *) mess);
			}
		}
	while (cont);

	CloseWindow (win);
	}
else
	printf ("cannot open window\n");

return (0);
}


Das ganze muß natürlich noch Font-sensitiv gemacht werden. Ich habe die Koordinaten jetzt so ungefähr für Helvetica/13 eingesetzt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

15.02.2005, 20:23 Uhr

Bernhard
Posts: 144
Nutzer
Danke, für das beispiel. is wirklich super!

Hab allerdings noch ein paar anmerkungen zu machen:
In die main-funktion gehört noch rein:

struct IntuitionBase *IntuitionBase=NULL;
IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0L); /* öffnen der intuition.library */
CloseLibrary((struct Library *)IntuitionBase); /* Schließen der Library */

ohne das gehts bei mir nicht. BTW ich verwende den gcc.

Hab jetzt aber noch eine Frage:
In dem Beispiel gibts ja zwei buttons. allerdings passiert da nix wenn einer gedrückt wird. wie und wo kann ich jetzt merken wenn einer gedrückt wird? wo gehört das in das Programm?

Danke
Bernhard

[ - Antworten - Zitieren - Direktlink - ]

16.02.2005, 00:09 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Also mit OS1.3 gadgets habe ich schon seit über 15 jahren nichts mehr gemacht, aber soweit ich mich erinnere kannst du in der Gadget Struktur eine GadgetID oder USERData angeben und die kannst du über die empfangene Message über den Eintrag IAddress herausfinden, denke IAddress zeigt auf die Gadgetstruktur.

[ - Antworten - Zitieren - Direktlink - ]

16.02.2005, 00:34 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Hab's nochmal ausprobiert, in der Gadget Struktur gibst du als vorletzten Parameter irgendeinen einmaligen Wert für jedes Gadget an, in Thomas beispiel ist es GID_OK bzw. GID_CANCEL. in switch Statement musst du den CASE IDCMP_GADGETUP part folgendermassen anpassen:

code:
case IDCMP_GADGETUP:
    switch (((struct Gadget *) mess->IAddress)->GadgetID) {

      case GID_OK:
        printf("ok gedrückt\n");
        break;

      case GID_CANCEL:
        printf("cancel gedrückt\n");
        break;
    }
  break;


so sollte es laufen.

[ - Antworten - Zitieren - Direktlink - ]

16.02.2005, 08:04 Uhr

thomas
Posts: 7716
Nutzer

@Darius: stimmt, das wichtigste hatte ich vergessen.

@Bernhard: wenn du beim Linken -lauto angibst, müßte das auch ohne OpenLibrary gehen. Ich weiß allerdings nicht, ob der Code, den GCC erzeugt, auch auf 1.3 läuft. Nimm lieber Dice C, der läuft garantiert.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

16.02.2005, 09:52 Uhr

gni
Posts: 1106
Nutzer
Zitat:
thomas:
@Bernhard: wenn du beim Linken -lauto angibst, müßte das auch ohne OpenLibrary gehen.

libauto.a ist _nur_ für ixemul. Libnix öffnet (System-)Bibliotheken selber. Weder braucht noch verwendet man da -lauto!
Zitat:
Ich weiß allerdings nicht, ob der Code, den GCC erzeugt, auch auf 1.3 läuft.
Bei ixemul hängt es von der im Startup-Code verwendeten Version der ixemul.library ab: 39.x läuft noch unter 1.2/1.3. Libnix benötigt zwingend 2.0 oder neuer. Mag sein, das man bei libnix mit Tricks auch noch 1.3 kompatible Programme hinbekommt, aber empfehlen kann ich das nicht.

[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 19:05 Uhr

Bernhard
Posts: 144
Nutzer
also ich hab das programm jetz mal ausprobiert und läuft super.
danke an alle!!!

außerdem hab ich mir erlaubt das programm auf http://w3studi.informatik.uni-stuttgart.de/~walternn/CodeGuru/UserEintragen.html einzutragen, weil ich finde, dass ne tolle idee hinter der seite ist und es nicht schadet wenn man das da reinmacht.

hab auch noch ein bisschen weiter rumprogrammiert und auch ein kleines programm geschrieben, das unterschiedlich große buttons hat. haut auch alles hin, nur mit dem rand hab ich so meine probleme. was muss ich jetz im struct Border border[] eintragen, wenn ich nen großen und nen kleinen button will?

Danke
Bernhard

[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 20:15 Uhr

thomas
Posts: 7716
Nutzer

Du hättest vielleicht *vorher* fragen sollen.

Außerdem solltest du dem Kommentar hinzufügen, daß dies ausdrücklich die WB 1.3-Methode ist, eine GUI zu schreiben. Ab 2.0 benutzt man dafür GadTools, seit 3.0 BOOPSI und seit OS 3.5 ReAction (das auf BOOPSI basiert). Gerade auf OS 4.0 oder MorphOS sollte man nicht mehr die ganz alte Methode benutzen, denn das kann dazu führen, daß die GUI nicht so aussieht, wie man sich das vorstellt. Ein objektorientierter Ansatz wie BOOPSI erlaubt es dem Betriebssystem, die Darstellung dem allgemeinen Erscheinungsbild anzupassen, das geht bei selbstgebastelten Gadget-Strukturen nicht.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 20:27 Uhr

Bernhard
Posts: 144
Nutzer
sorry. hab mich halt so gefreut dass es endlich funktioniert hat und da wollt ich des eben auch anderen zuteil werden lassen. werd jetz erst mal schaun dass i da einigermaßen durchblicke und dann werd i schaun wie man des jetz am besten macht.

Bernhard

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Programm mit GUI [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.