HTBasic Help
×
Menu
Index

Example:  Bitmap Widget

 
10     ! *********************************************************************
20     ! Example: BITMAP Widget
30     !
40     ! This program demonstrates the use of the BITMAP widget. It
50     ! allows you to bring in and display bitmaps, as well as select
60     ! portions of them and save them in a file.
70     !
80     ! It also demonstrates the SCROLLABLE attribute for the PANEL,
90     ! such as the various operations needed to make SCROLL WIDTH
100   ! and SCROLL HEIGHT as correct as possible.
110   !
120   ! ***********************************************************
130   !
140   ! Variables used:
150   !
160   !   S$:                                General-purpose string
170   !   N:                                General-purpose variable
180   !   Btn:                                Returns button value from dialogs
190   !   Sc:                                Scroll factor
200   !   Bitfile$:                                Name of bitmap file to be read
210   !   Dirname$:                Directory name returned from FILE dialog
220   !   B1$(*):                                Stores MENU BUTTONS
230   !   A1$,A2$:                Stores dialog attributes
240   !
250   DIM S$[256]
260   INTEGER N,Btn,Sc
270   DIM Bitfile$[100],Dirname$[100],Btns$(1:3)[50],A1$[50],A2$[50]
280   !
290   DATA "BMP File","XWD File","Cancel","DIALOG BUTTONS","SELECTION",20
300   READ Btns$(*),A1$,A2$,Sc
310   !
320   ! Widget dimensions
330   !
340   INTEGER Pw,Ph,Px,Py,Iw,Ih,Ww,Wh,Wx,Wy
350   !
360   ! Variables for display scaling
370   !
380   INTEGER Cursor,D(1:4),Dw,Dh
390   !
400   ! Get display size
410   !
420   GESCAPE CRT,3;D(*)
430   Dw=D(3)-D(1)
440   Dh=D(4)-D(2)
450   !
460   CLEAR SCREEN
470   !
480   Pw=Dw*.7                                                ! PANEL width
490   Ph=Dh*.7                                                ! PANEL height
500   Px=(Dw-Pw)/2                                ! Center PANEL
510   Py=(Dh-Ph)/2
520   !
530   ! Create PANEL for BITMAP widget. The SCROLL WIDTH and
540   ! HEIGHT are set to a small value so that scroll bars
550   ! will not appear initially. The actual heights are set
560   ! later to fit the bitmap that has been loaded.
570   !
580   ASSIGN @Main TO WIDGET "PANEL";SET ("VISIBLE":0)
590   CONTROL @Main;SET ("X":Px,"Y":Py,"WIDTH":Pw,"HEIGHT":Ph)
600   CONTROL @Main;SET ("TITLE":" Example: BITMAP Widget")
610   CONTROL @Main;SET ("SIZE CONTROL":"SCROLLABLE","MINIMIZABLE":1)
620   CONTROL @Main;SET ("SCROLL WIDTH":1,"SCROLL WIDTH UNITS":Sc)
630   CONTROL @Main;SET ("SCROLL HEIGHT":1,"SCROLL HEIGHT UNITS":Sc)
640   !
650   ! Build menu
660   !
670   ASSIGN @Menu TO WIDGET "PULLDOWN MENU";PARENT @Main
680   CONTROL @Menu;SET ("LABEL":"Menu")
690   ASSIGN @Getfile TO WIDGET "MENU BUTTON";PARENT @Menu
700   CONTROL @Getfile;SET ("LABEL":"Get Bitmap File")
710   ASSIGN @Savefile TO WIDGET "MENU BUTTON";PARENT @Menu
720   CONTROL @Savefile;SET ("LABEL":"Cut Bitmap To File")
730   ASSIGN @Cd TO WIDGET "MENU BUTTON";PARENT @Menu
740   CONTROL @Cd;SET ("LABEL":"Change Directory")
750   ASSIGN @S TO WIDGET "MENU SEPARATOR";PARENT @Menu
760   ASSIGN @Quit TO WIDGET "MENU BUTTON";PARENT @Menu
770   CONTROL @Quit;SET ("LABEL":"Quit")
780   !
790   ! Create and size BITMAP widget. (Setting RETAIN RASTER makes
800   ! the widget redraw quickly when overwritten by a dialog.)
810   !
820   ASSIGN @Bitmap TO WIDGET "BITMAP";PARENT @Main
830   CONTROL @Bitmap;SET ("RETAIN RASTER":1,"AUTO SIZE":1)
840   STATUS @Main;RETURN ("INSIDE WIDTH":Iw,"INSIDE HEIGHT":Ih)
850   Wx=Iw*.01
860   Wy=Ih*.01
870   Wh=Ih*.98
880   Ww=Iw*.98
890   CONTROL @Bitmap;SET ("X":Wx,"Y":Wy,"WIDTH":Ww,"HEIGHT":Wh)
900   !
910   ! Set events
920   !
930   ON EVENT @Getfile,"ACTIVATED" GOSUB Getbitfile
940   ON EVENT @Savefile,"ACTIVATED" GOSUB Savebits
950   ON EVENT @Cd,"ACTIVATED" GOSUB Chdir
960   ON EVENT @Quit,"ACTIVATED" GOTO Finis
970   !
980   CONTROL @Main;SET ("VISIBLE":1)
990   !
1000  ! Loop and wait for input
1010  !
1020  LOOP
1030    WAIT FOR EVENT
1040  END LOOP
1050  STOP
1060  !
1070  ! ************** End of Main Program **********************
1080  !
1090  ! This routine gets a bitmap file and displays it. It gets
1100  ! the bitmap size and sets up PANEL scrolling accordingly.
1110  ! Also, it makes the BITMAP widget invisible so the display
1120  ! will "thrash" as little as possible.
1130  !
1140 Getbitfile: !
1150  S$="Please enter the name of a bitmap (.XWD or .BMP) file:"
1160  DIALOG "FILE",S$,Btn;RETURN ("SELECTION":Bitfile$)
1170  !
1180  IF Btn=0 THEN
1190    CLEAR ERROR
1200    ON ERROR GOSUB Errtrap
1210    CONTROL @Bitmap;SET ("VISIBLE":0,"BITMAP FILE":Bitfile$)
1220    OFF ERROR
1230    IF ERRN<>0 THEN
1240      DIALOG "ERROR","Can't open file / invalid bitmap file."
1250      CONTROL @Bitmap;SET ("BITMAP FILE":"","VISIBLE":1)
1260    ELSE
1270      CONTROL @Bitmap;SET ("VISIBLE":0)
1280      STATUS @Bitmap;RETURN ("BITMAP HEIGHT":Wh,"BITMAP WIDTH":Ww)
1290      CONTROL @Main;SET ("SCROLL HEIGHT":2+INT(Wh/Sc))
1300      CONTROL @Main;SET ("SCROLL WIDTH":2+INT(Ww/Sc))
1310      CONTROL @Bitmap;SET ("VISIBLE":1)
1320      DIALOG "INFORMATION","File read completed"
1330    END IF
1340  END IF
1350  RETURN
1360  !
1370  ! This routine allows you to cut a section of a bitmap and
1380  ! save it in a file. String variables are used in the FILE
1390  ! dialog to specify the DIALOG BUTTONS attribute and the
1400  ! SELECTION attribute to keep a compact statement length.
1410  !
1420 Savebits: !
1430  S$="Enter file name, then click-and-drag image to save:"
1440  DIALOG "FILE",S$,Btn;SET (A1$:Btns$(*)),RETURN (A2$:Bitfile$)
1450  !
1460  SELECT Btn
1470  CASE 0
1480    S$="BMP"                                ! Dump format is MS-Windows .BMP file.
1490  CASE 1
1500    S$="XWD"                                ! Dump format is X11 XWD format.
1510  CASE 2
1520    RETURN
1530  END SELECT
1540  !
1550  CLEAR ERROR
1560  ON ERROR GOSUB Errtrap
1570  CONTROL @Bitmap;SET ("DUMP FORMAT":S$,"DUMP AREA":Bitfile$)
1580  OFF ERROR
1590  IF ERRN<>0 THEN
1600    DIALOG "ERROR","Can't open file."
1610  ELSE
1620    DIALOG "INFORMATION","Bitmap saved to "&S$&" file."
1630  END IF
1640  !
1650  RETURN
1660  !
1670  ! This routine changes directories
1680  !
1690 Chdir: !
1700  S$="Please enter the name of a directory:"
1710  DIALOG "FILE",S$,Btn;RETURN ("DIRECTORY":Dirname$)
1720  !
1730  Err=0
1740  CLEAR ERROR
1750  ON ERROR GOSUB Errtrap
1760  MASS STORAGE IS Dirname$
1770  OFF ERROR
1780  IF ERRN<>0 THEN
1790    DIALOG "ERROR","Can't change directory"
1800  END IF
1810  RETURN
1820  !
1830  ! Dummy routine for trapping errors
1840  !
1850 Errtrap: ERROR RETURN
1860  !
1870 Finis: !
1880  ASSIGN @Main TO *                                ! Delete PANEL widget
1890  CLEAR SCREEN
1900  END