home *** CD-ROM | disk | FTP | other *** search
-
- /****************************************************************************
- Das nachfolgende Beispiel verdeutlicht das Zusammenwirken
- der einzelnen Komponenten der WINEDIT-Anwenderschnittstelle.
-
- Zur Übersetzung des Programms stehen TC-Projektdatei und
- TC-Konfigurationsfile zur verfügung. Sicherzustellen ist, daß
- im TC-Menüpunkt Options/Directories die Pfade zum
- LIB-File W_TBC_LM.LIB und zum INCLUDE-File W_DEF.H eingetragen
- sind, oder sich diese im aktuellen Directory befinden.
- Weiter muß die Übersetzung im LARGE-MODEL erfolgen, da aus
- Platzgründen nur eine Libary für diese Modell beigefügt ist.
-
- Auf eine Fehlerüberprüfung nach Aufruf von WINEDIT-Funktionen
- wurde der Übersicht halber weitgehend verzichtet.
-
- Häufigste Fehlerursachen sind erfahrungsgemäß
-
- - falscher Dateiname beim Laden einer Maskendatei mit w_load
-
- - nicht ausreichend verfügbarer Speicherplatz beim Laden oder
- Öffnen einer Maske;
- es sollte überprüft werden, ob z.B. durch Unterbinden des
- Anlegens virtueller Bilder bei Aufruf von w_load Speicher
- gespart werden kann.
- es sollten selten benutzte Masken erst bei Bedarf geladen
- und anschließend mit w_erase(..) sofort wieder gelöscht werden.
-
-
- - das vielfache Laden ein und derselben Maske dadurch, daß der
- Ladevorgang erst bei Bedarf z.B. in einem Unterprogramm erfolgt,
- ein Löschen der Maske mit w_erase(..) jedoch bei Verlassen des
- Unterprogramms nicht erfolgt. Es ist durchaus zulässig, eine
- Maske mehrfach zu laden; nur ist irgendwann unweigerlich der
- Speicher voll.
-
- - ein zu kleiner Stackbereich des Programms; dieser läßt
- sich bekanntermaßen setzen mit z.B.
-
- extern unsigned int _stklen = 16384;
-
-
- Im Beispielprogramm werden die einzelnen Masken erst bei Bedarf
- zugeladen und anschließend wieder gelöscht. Möglich wäre natürlich
- auch, alle Masken am Anfang des Programms einmalig zu Laden; dadurch
- werden Verzögerungszeiten beim Nachladen vermieden, der Speicherbedarf
- ist jedoch um einiges größer.
-
- Um die Wirkung der Konfigurationsfunktionen zu w_switch(..) zu
- ergründen, empfiehlt sich ein Herumspielen an diesen und
- Betrachten der Ergebnisse;
- ****************************************************************************/
-
-
- /*
- W_DEF.H enhält die Prototypen der WINEDIT-Funktionen
- und definiert einige Konstanten
- */
- #include <w_def.h>
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <dos.h>
- #include <dir.h>
- #include <string.h>
- #include <mem.h>
-
-
-
- /**************************************************************************
- Gibt verschiedene Hilfstexte aus
- ***/
- void hilfe(void);
-
- /**************************************************************************
- Ermöglich die Anwahl eines Dateinamens
- ***/
- int datei_menue(char name[MAXPATH],int mode);
-
- /**************************************************************************
- Ermöglicht die Anwahl eines Ascii-Zeichens
- ***/
- int ascii_waehlen(void);
-
- /**************************************************************************
- Ermöglicht die Anwahl eines Bildschirm-Attributes
- ***/
- int attribut_waehlen(int altes_attribut);
-
- /**************************************************************************
- Baut ein (teilweise) dreistufiges Menü auf
- ***/
- void menue(void);
-
-
-
- void main(void)
- {
- int m;
- char s[MAXPATH];
-
- w_init(0);
- /*
- Initialisierung,
- Parameter 0 bewirkt einen direkten Zugriff auf den Bildspeicher
- Returnwert zeigt an, ob Maus angeschlossen ist
- */
-
-
- m=w_load("hmenue.msk",1);
- /*
- Das Hauptmenü wird ohne Anlegen eines virtuellen Bildes geladen,
- über die Maskennummer in m wird das Hauptmenü zukünftig angesprochen
- */
-
- w_open(m);
- /*
- Das Hauptmenü wird auf den Schirm ausgegeben
- */
-
- do
- switch(w_switch(m))
- /*
- In w_switch erfolgt die Auswahl aus dem Hauptmenü, die
- einzelnen anwählbaren Stellen im Hauptmenü sind bei
- Erstellung der Maske definiert und nummeriert worden.
- */
- {
- case 0:
- hilfe();
- break;
- case 1:
- datei_menue(strcpy(s,"*.*"),1);
- break;
- case 2:
- ascii_waehlen();
- break;
- case 3:
- attribut_waehlen(0x07);
- break;
- case 4:
- menue();
- break;
- default:
- break;
- }
- while(w_switch_last_key(m)!= KEY_ESC &&
- w_switch_last_key(m)!= MOUSE_R_B);
- /*
- Abbruch nur, wenn die letzte Taste in w_switch ESC
- oder linke Maustaste war.
- */
-
-
- w_close();
- /*
- Das Hauptmenü wird vom Bildschirm genommen, der
- ursprüngliche Bildinhalt zurückgesichert. Eine
- Referenznummer ist nicht erforderlich, da die
- Masken in einem Maskenstapel verwaltet werden und
- somit immer die oberste Maske im Stapel
- geschlossen wird.
- */
- v_clrscr();
- w_deinit();
- /*
- Beseitigt und löscht alle Maskenbestandteile im Speicher;
- */
- }
-
-
- /***************************************************************************/
- int ascii_waehlen(void)
- {
- int i;
- int m;
-
- m=w_load("ascii.msk",1);
- /*
- Maske von Platte laden
- */
-
- w_switch_matrix(m,1,0,0,0,0);
- /*
- Beschleunigte Anwahl wegen Maxtrix-artiger Anordnung
- der Positionen möglich; Dies ist nur bei einer großen
- Anzahl an Positionen relevant.
- Entfernt man diesen Aufruf, so wird man einen
- Zeitverzug nach Aufruf von w_switch bemerken.
- In dieser Zeit wird dann die Anordnung
- der einzelnen Anwahlpositionen zueinander überprüft.
- */
-
- w_open(m);
- /*
- Maske ausgeben auf Schirm
- */
-
- i=w_switch(m);
- /*
- Auswahl durchführen
- */
-
- w_close();
- /*
- Maske vom Schirm nehmen
- */
-
- w_erase(m);
- /*
- Da die Maske bei jedem Unterprogrammaufruf neu geladen wird,
- muß sie natürlich bei verlassen des Unterprogramms gelöscht
- werden
- */
-
- if(i<0)
- return(i);
- else
- return(i+32);
- }
-
- /***************************************************************************/
- int attribut_waehlen(int altes_attribut)
- {
- int i,m;
-
- m=w_load("attrib.msk",1);
-
- w_switch_mark_mode(m,1);
- /*
- Markierung der Anwahlpositionen mit Pfeilen
- statt mit Attribut
- */
-
- w_switch_pos(m,altes_attribut);
- /*
- Bei Start markierte Position setzen;
- normalerweise wird bei Position 0 begonnen,
- hier nun bei Position altes_attribut
- */
-
- w_switch_matrix(m,1,0,0,0,0);
- w_open(m);
- i=w_switch(m);
- w_close();
- w_erase(m);
- return(i);
- }
-
-
-
-
- /***************************************************************************/
- void menue(void)
- {
- int i,m[40],s,ok0,ok1,ok2;
-
- m[ 0]=w_load("m0-00.msk",1);
- m[ 1]=w_load("m1-00.msk",1);
- m[ 2]=w_load("m1-01.msk",1);
- m[ 3]=w_load("m1-02.msk",1);
- m[ 4]=w_load("m1-03.msk",1);
- m[ 5]=w_load("m1-04.msk",1);
- m[ 6]=w_load("m2-00.msk",1);
- m[ 7]=w_load("m2-01.msk",1);
- m[ 8]=w_load("m2-02.msk",1);
- m[ 9]=w_load("m2-03.msk",1);
- /*
- Alle Menüs und Untermenüs laden
- */
-
- for(i=0;i<10;++i)
- if(m[i]<0)
- {
- printf("\nFehler beim Laden von Nummer %d",i);
- w_deinit();
- exit(-1);
- }
-
-
- for(s=0;s<10;++s)
- {
- w_switch_mouse_cr(m[s],1);
- w_switch_mouse_esc(m[s],1);
- }
- /*
- Hier wird die w_switch(..) so konfiguriert, daß lediglich durch
- Positionierung des Mauszeigers eine Anwahl erfolgt.
- Weiter ist das Verlassen eines Untermenüs über beliebige
- Menühirachien hinweg mittels Mauszeiger möglich.
-
- Der Wert dieser Funktionen läß sich am besten erfahren, in dem
- man sie testweise entfernt.
- */
-
-
- if(!w_open(m[0]))
- {
- printf("\nFehler %d beim Öffnen ",w_error());
- w_deinit();
- exit(-1);
- }
- /*
- So könnte eine Fehlermeldung aussehen
- */
-
-
- do
- {
- ok0=0;
- switch(s=w_switch(m[0]))
- {
- case 0:
- w_open(m[s+1]);
- ok1=0;
- do
- {
- switch(w_switch(m[s+1]))
- {
- case 0:
- w_open(m[6]);
- ok2=0;
- do
- {
- switch(w_switch(m[6]))
- {
- case 0:
- /*
- Hier und folgend sind
- die anwählbaren Aktionen
- einzusetzen
- */
- break;
- case 1:
- break;
- case 3:
- break;
- case -1:
- ok2=1;
- break;
- default:
- break;
- }
- }
- while(!ok2);
- w_close();
- break;
- case 1:
- w_open(m[7]);
- ok2=0;
- do
- {
- switch(w_switch(m[7]))
- {
- case 0:
- break;
- case 1:
- break;
- case 3:
- break;
- case -1:
- ok2=1;
- break;
- default:
- break;
- }
- }
- while(!ok2);
- w_close();
- break;
- case 2:
- w_open(m[8]);
- ok2=0;
- do
- {
- switch(w_switch(m[8]))
- {
- case 0:
- break;
- case 1:
- break;
- case 3:
- break;
- case -1:
- ok2=1;
- break;
- default:
- break;
- }
- }
- while(!ok2);
- w_close();
- break;
- case 3:
- w_open(m[9]);
- ok2=0;
- do
- {
- switch(w_switch(m[9]))
- {
- case 0:
- break;
- case 1:
- break;
- case 3:
- break;
- case -1:
- ok2=1;
- break;
- default:
- break;
- }
- }
- while(!ok2);
- w_close();
- break;
- case 4:
- break;
- case -1:
- ok1=1;
- break;
- default:
- break;
- }
- }
- while(!ok1);
- w_close();
- break;
- case 1:
- w_open(m[s+1]);
- ok1=0;
- do
- {
- switch(w_switch(m[s+1]))
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- break;
- case -1:
- ok1=1;
- break;
- default:
- break;
- }
- }
- while(!ok1);
- w_close();
- break;
- case 2:
- w_open(m[s+1]);
- ok1=0;
- do
- {
- switch(w_switch(m[s+1]))
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- break;
- case -1:
- ok1=1;
- break;
- default:
- break;
- }
- }
- while(!ok1);
- w_close();
- break;
- case 3:
- w_open(m[s+1]);
- ok1=0;
- do
- {
- switch(w_switch(m[s+1]))
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- break;
- case -1:
- ok1=1;
- break;
- default:
- break;
- }
- }
- while(!ok1);
- w_close();
- break;
- case 4:
- w_open(m[s+1]);
- ok1=0;
- do
- {
- switch(w_switch(m[s+1]))
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- break;
- case -1:
- ok1=1;
- break;
- default:
- break;
- }
- }
-
- while(!ok1);
- w_close();
- break;
- case -1:
- ok0=1;
- break;
- default:
- break;
- }
- }
- while(!ok0);
- w_close();
- for(i=0;i<10;++i)
- w_erase(m[i]);
- }
-
-
-
- /***************************************************************************/
- void hilfe(void)
- {
- int i,m[6],s,ok;
- int akt;
-
- m[ 0]=w_load("h0.msk",1);
- m[ 1]=w_load("h2.msk",1);
- m[ 2]=w_load("h3.msk",1);
- m[ 3]=w_load("h1.msk",1);
- m[ 4]=w_load("h4.msk",1);
-
- for(i=0;i<5;++i)
- if(m[i]<0)
- {
- printf("\nFehler beim Laden von Nummer %d",i);
- w_deinit();
- exit(-1);
- }
-
-
- akt=0;
- ok=0;
- do
- {
- w_open(m[akt]);
- switch(s=w_switch(m[akt]))
- {
- case 0:
- case 1:
- case 2:
- case 3:
- if(s>=akt)
- akt=s+1;
- else
- akt=s;
- w_close();
- break;
- case -1:
- w_close();
- ok=1;
- default:
- break;
- }
- }
- while(!ok);
-
- for(i=0;i<5;++i)
- w_erase(m[i]);
- }
-
-
-
-
- #define FELDER 40 /* Felder der Maske*/
- #define SPALTEN 4 /* Felder pro Zeile der Maske */
- #define DATEIEN 256 /* Maximum an einlesbaren Dateien, erweiterbar ! */
-
-
- static char dateiname[DATEIEN][13]; /*Speichert die Dateinamen*/
- static int anzahl=0; /*Dateien + Subdirectories im Pfad*/
- static int scroll=0; /*Anzahl der (gescrollten Zeilen)*SPALTEN*/
- static int maske; /*Maskenreferenznummer*/
-
-
- static void vshow(void);
-
- /*****************************************************************************/
- int datei_menue(char name[MAXPATH],int mode)
- {
-
- struct ffblk merkmal;
- int i,ret;
- int newdir=1; /*Neues Directory wurde angewaehlt*/
- int anzfile; /*Summe der Dateien im Pfad*/
- int ok=0; /*Schleifendeterminator*/
- int aktpos=0; /*Aktuelle Dateinummer*/
- int viewpos=0; /*Aktuelles Feld in der Maske*/
- int res;
- int wechsel=1; /*Kontrolliert Maskenrefresh*/
- int taste;
-
- char drive[MAXDRIVE];
- char dir[MAXDIR];
- char fname[MAXFILE];
- char ext[MAXEXT];
- char pfad[MAXPATH];
- char aktpfad[MAXPATH];
- char buffer[MAXPATH];
- char *bufferp;
-
- /*
- Maskenbeschreibung wird aus einer Datei in den Speicher geladen;
- Der zweite Parameter mit dem Wert 0 bewirkt, daß zu dieser Maske
- ein virtueller Bildschirm angelegt wird.
- */
-
- maske=w_load("file.msk",0);
- if(maske<0)
- {
- printf("\nFehler %d beim Laden der Maske file.msk",w_error());
- w_deinit();
- exit(-1);
- }
- w_switch_matrix(maske,1,1,1,1,1);
- /*
- a) Matrix-artige Anordnung
- b) Bei Cursorbewegungen über die Kanten der Maske hinaus
- Abbruch der Funktion w_switch(..). Dies ist zur
- Realisierung einer Scroll-Funktion sinnvoll.
- */
- w_switch_break_on_key(maske,2);
- w_open(maske);
- strcpy(buffer,strupr(name));
- while(1)
- {
- /*
- Maske einlesen
- */
- w_in_break_on_key(1);
- taste=w_in_last_key();
- res=w_in_str(maske,40,MAXPATH,buffer,"");
- if((res==-1) || ((res==-2)&&(taste==MOUSE_R_B)))
- {
- w_close();
- w_erase(maske);
- return(0);
- }
-
- /*
- Komplette Pfadbezeichnung erzeugen
- */
- strupr(buffer);
-
- if(strlen(buffer)==0)
- strcat(buffer,"*.*");
-
- if(strlen(buffer)<2 || buffer[1]!=':')
- /*
- Laufwerk ergänzen
- */
- {
- aktpfad[0]=getdisk()+'A';
- aktpfad[1]=':';
- bufferp=&buffer[0];
- }
- else
- {
- memcpy(aktpfad,buffer,2);
- bufferp=&buffer[2];
- }
-
- if(bufferp[0]!='\\')
- /*
- Aktuellen Pfad ergänzen
- */
- {
- aktpfad[2]='\\';
- getcurdir(aktpfad[0]+1-'A',aktpfad+3);
- if(aktpfad[strlen(aktpfad)-1] != '\\')
- strcat(aktpfad,"\\");
- strcat(aktpfad,bufferp);
- }
- else
- {
- strcpy(aktpfad+2,bufferp);
- }
-
-
- while(newdir)
- {
- wechsel=1;
- for(i=0;i<FELDER;++i)
- /*
- Felder löschen
- */
- {
- w_vout_str(maske,i," ");
- }
- w_switch_pos(maske,0);
-
- fnsplit(aktpfad,drive,dir,fname,ext);
- fnmerge(pfad,drive,dir,"*",NULL);
-
- anzahl=0;
- ret=findfirst(aktpfad,&merkmal,0);
- while(!ret && (anzahl < (DATEIEN-4)))
- {
- strcpy(&dateiname[anzahl++][0],merkmal.ff_name);
- ret=findnext(&merkmal);
- }
-
- anzfile=anzahl;
- ret=findfirst(pfad,&merkmal,FA_DIREC);
- while(!ret && (anzahl < (DATEIEN-2)) && mode)
- {
- if(merkmal.ff_attrib==FA_DIREC)
- {
- strcpy(&dateiname[anzahl][0],merkmal.ff_name);
- strcat(&dateiname[anzahl++][0],"\\");
- }
- ret=findnext(&merkmal);
- }
-
-
- w_vout_str(maske,40,aktpfad);
-
- for(i=0;i<anzahl && i<FELDER;++i)
- {
- w_vout_str(maske,i,&dateiname[i][0]);
- }
-
- /*
- Virtuelles Bild ausgeben
- */
- w_vout(maske);
- taste=0;
- scroll=0;
- ok=0;
- do
- {
- if(anzahl==0)
- {
- w_out_str(maske,1,"KEINE DATEI");
- taste=KEY_ESC;
- break;
- }
-
-
- if(scroll>0)
- w_vout_str(maske,41," ZURÜCK ");
- else
- w_vout_str(maske,41," ");
-
- if((scroll+FELDER) < anzahl)
- w_vout_str(maske,42," VOR ");
- else
- w_vout_str(maske,42," ");
-
- i=anzahl-scroll-1;
- if(i>=FELDER)
- i=FELDER-1;
- w_switch_range(maske,0,i);
- if(wechsel==1)
- {
- w_vout(maske);
- wechsel=0;
- }
-
- switch(i=w_switch(maske))
- {
- case -1:
- taste=KEY_ESC;
- ok=1;
- break;
- case -2:
- taste=w_switch_last_key(maske);
- viewpos=w_switch_pos(maske,-1);
- switch(taste)
- {
- case MOUSE_L_B:
- case KEY_PGUP:
- case KEY_PGDN:
- if((w_xyon_field(maske,w_mouse_cur_x(),w_mouse_cur_y())==41) || (taste==KEY_PGUP))
- {
- scroll-=FELDER;
- if(scroll < 0)
- scroll=0;
- wechsel=1;
- vshow();
- }
- else if((w_xyon_field(maske,w_mouse_cur_x(),w_mouse_cur_y())==42) || (taste==KEY_PGDN))
- {
- if((scroll+FELDER) < anzahl)
- {
- scroll+=FELDER;
- if((scroll + viewpos) >= anzahl)
- {
- viewpos=anzahl-1-scroll;
- w_switch_pos(maske,viewpos);
- }
- wechsel=1;
- vshow();
- }
- }
- break;
- case KEY_C_D:
- if((scroll+FELDER) < anzahl)
- {
- scroll+=SPALTEN;
- if((scroll + viewpos) >= anzahl)
- {
- viewpos=anzahl-1-scroll;
- w_switch_pos(maske,viewpos);
- }
- wechsel=1;
- vshow();
- }
- break;
- case KEY_C_L:
- if((viewpos==0) && scroll>0)
- {
- scroll-=SPALTEN;
- wechsel=1;
- vshow();
- }
- else if(viewpos>0)
- {
- viewpos-=1;
- w_switch_pos(maske,viewpos);
- }
- break;
- case KEY_C_R:
- if( ( (scroll+FELDER) < anzahl) && (viewpos==(FELDER-1)))
- {
- scroll+=SPALTEN;
- wechsel=1;
- vshow();
- }
- else if((scroll+viewpos) < (anzahl-1))
- {
- viewpos+=1;
- w_switch_pos(maske,viewpos);
- }
- break;
- case KEY_C_U:
- if(scroll > 0)
- {
- scroll-=SPALTEN;
- wechsel=1;
- vshow();
- }
- break;
- default:
- break;
- }
- break;
- default:
- if( (i>=0) && (i < anzahl))
- ok=1;
- taste=KEY_CR;
- break;
- }
- if(!(i<0))
- {
- aktpos=i + scroll;
- viewpos=i;
- }
- aktpos=scroll+viewpos;
- }
- while(!ok);
-
-
- if((taste==KEY_ESC))
- {
- break;
- }
- else if(strnicmp(&dateiname[aktpos][0],"..\\",3)==0)
- /*
- Einen Pfad zurück
- */
- {
- newdir=1;
- *strrchr(dir,'\\')='\0';
- if(strrchr(dir,'\\')!=NULL)
- *(1+strrchr(dir,'\\'))='\0';
- else
- *dir='\0';
- fnmerge(aktpfad,drive,dir,fname,ext);
- }
- else if(strnicmp(&dateiname[aktpos][0],".\\",3)==0)
- /*
- Root wurde angewählt
- */
- {
- newdir=1;
- strcpy(dir,"\\");
- fnmerge(aktpfad,drive,dir,fname,ext);
- }
- else if((aktpos)>(anzfile-1))
- {
- newdir=1;
- strcat(dir,&dateiname[aktpos][0]);
- fnmerge(aktpfad,drive,dir,fname,ext);
- }
- else
- {
- newdir=0;
- }
- }
-
- if(taste==KEY_CR)
- {
- taste=0;
- fnmerge(aktpfad,drive,dir,&dateiname[aktpos][0],NULL);
- if(strlen(aktpfad)>79)
- *(aktpfad+79)='\0';
- /*
- Pfad ,wenn möglich, um aktuellen Pfad verkürzen
- */
-
- getcurdir(aktpfad[0]+1-'A',buffer);
- if((getdisk()+'A')==aktpfad[0])
- /*
- Laufwerk im Pfad ist aktuelles Laufwerk
- */
- {
- if(strncmp(buffer,aktpfad+3,strlen(buffer))==0 && strlen(buffer)!=0)
- /*
- Aktueller Pfad ist enthalten
- */
- {
- strcpy(name,aktpfad+4+strlen(buffer) /*+2 für Backslash*2 */ );
- }
- else
- /*
- Nur das Laufwerk kann entfallen
- */
- {
- strcpy(name,aktpfad+2);
- }
- }
- else
- {
- name[0]=aktpfad[0];
- name[1]=aktpfad[1];
- if(strncmp(buffer,aktpfad+3,strlen(buffer))==0 && strlen(buffer)!=0)
- /*
- Aktueller Pfad ist enthalten
- */
- {
- strcpy(name+2,aktpfad+4+strlen(buffer));
- }
- else
- /*
- Nichts kann entfallen
- */
- {
- strcpy(name+2,aktpfad+2);
- }
- }
- w_close();
- w_erase(maske);
- return(1);
- }
- }
- return(1);
- }
-
-
-
- static void vshow(void)
- {
- int j;
-
- /*Neue Belegung auf den virtuellen Schirm ausgeben*/
-
- for(j=0;j<(anzahl-scroll) && j<FELDER;++j)
- {
- w_vout_str(maske,j,&dateiname[j+scroll][0]);
- }
-
- /*Rest löschen*/
-
- for(j=(anzahl-scroll);j<FELDER;++j)
- {
- w_vout_str(maske,j," ");
- }
- }
-