// ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» // º NPSGUI.LIB º // º Copyright 93-94, Nearly Perfect Software. Ç¿ // º All Rights Reserved º³ // º þ Written by Brad Broerman º³ // º þ Last Modified: 04/08/94 º³ // º þ Revision 2.5 º³ // ÈÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ³ // ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ #ifndef NPSGUIH #define NPSGUIH #include <graphics.h> #include <iostream.h> // These two are for the button mode. #define TEXT 0 #define IMAGE 1 // These two are for the panels InOrOut. #define IN 0 #define OUT 1 // These are for the mouses buttons in btnpressed. #define LEFT_BTN 1 #define RIGHT_BTN 2 #define CENTR_BTN 4 // These are for the screen resolution. #define LO_RES 0 #define MED_RES 1 #define HI_RES 2 // These are for the line thickness in checkbox.setline(). #define THICK 3 #define THIN 1 // These are for the predefined mouse cursor shapes. #define ARROW 1 #define UPARROW 2 #define LEFTAROW 3 #define CHECK 4 #define HAND 5 #define HOURGLASS 6 // This is an RGB pallete entry. It's used in the graphic classes. typedef struct { unsigned char r,g,b; } RGBPAL; class screen { // This is the class for initializing the screen in graphics mode. // The Init function, or the constructor will initialize the graphics // system in the specified resolution (HI_RES, MED_RES, LO_RES.) // // Parameters: mode=the graphics mode to use. // can be: HI_RES, MED_RES, or LO_RES. int gdriver, // Holds the name of the graphics driver (VGA Only.) gmode; // Holds the name of the mode to use (use 'mode'parameter to specify.) public: screen(int mode); // Constructor that also starts graphics mode. screen() {}; // Default constructor. Does nothing. ~screen(); // Default destructor. Closes the graphics system. void init(int mode); // Used to start graphics if default constructor was used, or changing modes. void close(); // Used to shut down graphics mode when changing modes. }; class gbase { // This is a base class for all of the graphics objects in this library. // it contains the basic location data, as well as the background data // for the objects, as well as a few useful functions, and the basic // functions NEEDED in all derived classes. // // Parameters: x,y = coordinates of the upper corner of the object. // w,h = Width and height of the object. // k = Flag: Keep track of the background or not. // // Preconditions: x and y must be positive. // x+w must be <= the maximum posible x coordinate. // y+h must be <= the maximum possible y coordinate. protected: int X, // The objects location and size. Y, Width, Height, isShown, // Is the object shown or not. KeepBkg; // Keep track of the background or not. void far *BackBuffer; // Holds the data for the background. int BkgHndl; // The EMS handle for the BackBuffer. int BkgPages; // Number of EMS pages for the BackBuffer. 0 if using main memory. void ReSize(int w, int h); // Changes the width and height of a gbase object. void virtual getbkg(); // copies the background of the object to BackBuffer. public: gbase(int x, int y, int w, int h, int k=1);// Inits a gbase object. ~gbase(); // Default destructor. void virtual show() = 0; // pure virtual. void virtual hide(); // Hides the image (removes it from the screen.) int virtual hit(); // Determines if the cursor is on the object. int virtual getX() // Returns the X coordinate of the upper left corner. {return X; }; int virtual getY() // Returns the Y coordinate of the upper left corner. { return Y; }; int virtual getW() // Returns the Width of the item. { return Width; }; int virtual getH() // Returns the Height of the item. { return Height; }; int virtual shown() // Returns 1 if the item is shown, 0 if it isn't. { return isShown; }; void virtual moveto(int x, int y);// Moves an object to coordinates x,y. }; class bitmap : public gbase { // This is the base class for graphic and icon. This class handles all // routines associated with loading and displaying graphics. // // Parameters: x: The x coordinate of the upper left corner. // y: The y coordinate of the upper left corner. // fname : The name of the file containing the image data. // // Preconditions: x and y must both be positive. // 'fname' must be a pathname to a valid existing bitmap. // or a filename to a valid existing bitmap in the current directory. // If mode = 0, then the bitmap must be NPG format (saved from the graphic object) // else, if mode = 1, the picture is a 16 color PCX file. // Also, the bitmap must be able to fit onto the screen, starting at (X,Y) // protected: unsigned int ImageSize; // The size in bytes of the graphics image. char far *Buffer; // The actual buffer storing the graphics image. char get_imgpxl(int x, int y); void put_imgpxl(int x, int y, char color); public: bitmap(int x, int y, int mode, char *fname="", int k=1); //Initializes a bitmap object. ~bitmap(); // The destructor. void virtual load(char *fname, int mode = 0); // Loads a new bitmap into the object. void virtual show(); // Displays the bitmap on the screen. int virtual getW(); // Returns the width of the bitmap in pixels. int virtual getH(); // Returns the height of the bitmap in pixels. }; class panel : public gbase { // This class displays a blank panel on the screen. // // Parameters: x,y= coordinates of the top left corner of the flat surface of the panel. // w=Width. Self Explanitory. // h=Height. Self Explanitory. // d=How high the panel should be raised. // io=tells wether the panel should be raised (OUT) or sunken(IN). // c= any color from BLACK to DARKGRAY (0-7). // k= if 1, the background will be stored to allow hiding. // // Preconditions: X-Depth, and y-Depth must be positive. // Also, X+Width+Depth must be less than the largest possible X coordinate. // and Y+Height+Depth must be less than the largest possible Y coordinate. // c must be between BLACK and LIGHTGRAY (0-7). protected: int Depth, // The panels depth (in pixels). InorOut, // Wether the panel is concave or convex. Color; // The panels color (valid from 0 to 7). public: panel(int x,int y,int w,int h, int d=1, int io=1,int c=7, int k=1); //Initializes a panel. ~panel(); // Destroys a panel. void virtual resize (int w, int h); // Changes the panels height and width. void moveto (int x, int y); // Move a panel. void virtual setbkgclr(int c); // Changes the panels color. void show (void); // Displays the panel. }; class bevel : public panel { // This is similar to a panel, but is more like a frame. it consists of 2 panels. // one concave, and one convex. /--\___________/--\ // // Parameters: x,y = the coorinate of the upper left corner of the inner surface. // w,h = the width and height of the inner surface. // d = depth of the frame. // bw = border width (width of the frame.) // c = color of the bevel (defaults to light gray). // k = keep background flag. // // Preconditions: x-d-bw and y-d-bw must be > 0 // x+w+2*(d+bw) must be < the greatest x coordinate for the current reslution. // y+h+2*(d+bw) must be < the greatest y coordinate for the current resoution. // bw must be >= 0 // c must be between BLACK and LIGHTGRAY (0-7). protected: panel *inner; int BWidth; public: bevel (int x, int y, int w, int h, int d=1, int bw=3, int c=7, int k=1); //Initializes a bevel. ~bevel(); // Destroys a bevel. void resize (int w, int h); // Changes a bevels height and width. void moveto (int x, int y); // Move the bevel. void show (); // Displays a bevel. }; class button : public panel { // This is a general push-button. It can contain either an IMAGE or // TEXT. If it is too small for the image or text, it will re-size itself. // // Parameters: x,y = The coordinate of the upper left corner of the top of the button. // w,h = Width and height of the button. If to small, they will be automatically scaled. // c = Color of the button part. // m = Mode. Either TEXT ot IMAGE. // strn = either the text to be displayed or the pathname of // the image to be displayed. // // Preconditions: The button must fit within the bounds of the screen in the current mode. // The color must be within BLACK and LIGHTGRAY (0 - 7) // Mode must be TEXT or IMAGE (0 - 1). // strn MUST point to a valid pathname if in IMAGE mode. // protected: int TxtClr, // The color of any text displayed in the button. HkHiClr, // The hotkey highlight color. Border, // Thickness of the border around the button. Mode; // What is inside (TEXT, or IMAGE) of the button. char *String; // Holds the string in TEXT mode. bitmap *Bgraphic; // The graphic image in the button. int Selected; // Tells whether the button is perssed or up. public: button (int x, int y, int w, int h, int d, int c=7, int b=0, int m=0, char* strn=" ", int k=1); //Initializes a button. ~button();// Destroys a button. void setextclr(int clr); // Changes the color of the text in TEXT mode. void sethkhiclr(int clr); // Sets the hotkey highlight color. void show(); // Displays a button void select(); // 'Presses' a button, and marks it as selected. int is_selected(); // Indicates wether or not a button is selected. void setborder(int b); // Changes the border width on the button. }; class graphic : public bitmap { // This object is a graphics image that can be captured from the current screen, // or loaded in from disk. it can then be displayed, and moved on the screen. // The parameters and preconditions are the same as for the graphic class. public: graphic(int x, int y, int k=1, int mode=0, char *fname=""); // Initializes a graphic image. ~graphic(); // Destroys a graphic. void save(char *fname); // Saves the graphic in the buffer to the file fname. void capture(int x, int y, int x1, int y1);// captures an area of the screen into the buffer. }; class gmouse { // This is the all-impoortant mouse interface. It MUST be included in // every application wether it is used or not. If it is not used, just do // not arm it. You must, however decare an instance, and init it. Please // declare the mouse class BEFORE the screen class. // You must ARM the mouse to display it, and you MUST balance your use // of SHOW and HIDE, otherwise you may get unpredictable results. // If you use your own event handler, please make sure that the routine // behave EXACTLY like an interrupt routine (save ALL the registers & flags) // except that the handler should end with a far return. int show_lvl, num_btns; public: gmouse() {init();}; // Starts the mouse cursor system. THIS MUST BE DONE! ~gmouse(); // Shuts down the mouse system. void init(); // completely resets the hardware and software of the system. void arm(); // Arms the cursor, so that it can be shown. void disarm(); // Disarms the mouse cursor. void show(); // Shows the cursor on the screen. void hide(); // Removes the cursor from the screen. int getmX(); // Returns the mouses X coordinate. int getmY(); // Returns the mouses Y coordinate. int getbutton(int btn); // Returns the status of a particular button, or buttons. int btnpressed(); // Returns true if any buttons are pressed. void moveptr(int X, int Y);// moves the pointer to the coordinates X,Y void setbounds(int left, int right, int top, int btm); // sets the horizontal and vertical bounds. void setexclarea(int left, int right, int top, int btm);// Sets up an exclusion area. void newpointer(int Type); // Changes the pointer to one of the predefined types. void custmpointer(int X, int Y, unsigned int *ptr); // Allows you to create your own custom pointer. int getrecentX(); // Returns the horiz. distance moved by the pointer since the last call. int getrecentY(); // Returns the vert. distance moved since the last call. void setevnthndlr( unsigned int mask, void far *pointer);// sets up a custom event handler. void setdefhndlr(); // Sets up the default event handler. int nextevent(int &X, int &Y, int &Btn); // returns the next event captured by the default handler. void setsens( unsigned int x, unsigned int y); //Sets the sensitivity of the mouse. }; class checkbox : public panel { // // This is a checkbox object. it allows the user to check and un-check the // box, and later, determine its state. // // Parameters: x,y - The location of the upper left corner of the box. // w,h - The width and height of the inside of the box. // d - The depth (in pixels) of the box. // c - The color of the inside of the box. // k - The keep track of the background flag. // // Preconditions: x,y,w,h,d MUST define a box that is within the bounds of the screen // as in the Panel class. // c must define a color between BLACK (0) and LIGHTGRAY (7). // k must be 0 (FALSE) or 1 (TRUE). protected: int Selected, // Wether or not the box is checked. LineWidth; // The width of the line. public: checkbox(int x, int y, int w=10, int h=10, int d=1, int c=7, int k=1); // Initializes a checkbox. ~checkbox(); // Destroyes a checkbox. void setline(int w); // Sets the check line width, as in the BGI routine setlinewidth() void setlineclr(int c); // changes the check lines color. void show(); // Displays a check box, and de-selects the box. void select(); // Selects (Checks) a box. int is_selected(); // Returns TRUE (1) if the box is checked. }; class rbutton : public gbase { // // The RBUTTON is similar to the check box, except that it is a round button. // Selected, a colored dot fills the button, an when cleared, the dot disappears. // // Parameters: x,y - Defines the location of the center of the button. // r - The radius of the button. // C - The color of the dot. The background is always light gray. // k - The Keep track of the background flag. // // Preconditions: The button must fit within the bounds of the screen. // The color can be ANY valid color. // The k flag must be 0 or 1. protected: int Radius, // The radius of the button. Color, // The color of the dot. Selected; // Selected flag. public: rbutton(int x, int y, int R=5, int C=0, int k=1); // Initializes a rbutton object. ~rbutton(); // Deletes an rbutton. void resize(int r); // Changes the radius of an rbutton. void moveto(int x, int y); // Moves the rbutton. void chgclr(int c); // Changes the dots color. void show(); // Displays an rbutton, and de-selects it. void select(); // Selects an rbutton. int is_selected(); // Returns TRUE (1) if selected. }; class icon : public bitmap { // An icon is a graphic image that can be used as a sort of a button. // When selected, the image is shown reversed. // // Parameters: x,y - The coordinates of the upper left corner. // fname- The pathname of a graphic to load. // k - The keep track of the background flag. // // Preconditions: The picture must be able to fit on the screen, // starting at (x,y). // fname must be the pathname of an existing file. // // protected: int Selected; // Selected flag. public: icon(int x, int y, int mode, char *fname="", int k=1); // Initializes an icon. ~icon(); // Destroys an icon. void show(); // Displays an icon, and de-selects it. void select(); // Selects an icon, and re-displays its inverse, int is_selected(); // Returns TRUE (1) if the icon is selected. }; class instrn : public panel { // This class allows the input of a line of text inthe graphics mode. // It exits its input when an up or down arrow, escape, or return key it depressed. // The key that caused termination of input can be checked with 'lastkey()' // // Parameters: x,y - The coordinate of the upper left corner. // w,h - The width and height of the box, in pixels. // d - The depth in pixels of the box. // c - The color of the background, the text defaults to white. // k - The keep track of the background flag. // // Preconditions: The preconditions are the same as those for Panel. // // protected: int TxtColor, // The color of the text. CsrColor, // The color of the text cursor CsrBlink, // The cursor blink flag. instmode, // Insert mode flag. MaxLen, // The maximum string length. Pointer, // The position of the text cursor. HiClr, // The color of the highlight; Hilight_Begin, Hilight_End, inkey; // The key pressed. char *Buffer; // The buffer that stores the text. public: instrn(int x, int y, int w=1, int h=1, int d=0, int c=7, int k=1); // Initializes an instrn. ~instrn(); // Destroys an instrn. void settxtclr(int clr); // Changes the text color. Can be ANY valid color. void setcsrclr(int clr); // Changes the cursor color. void sethiclr(int clr); // Set the highlight color; void setcsrblink(int blk); // Changes the cursor blink flag: 1 to blink, 0 to not blink. void show(); // Displays the instrn, and text in the buffer. char *getinput(int hilight = 0); // Gets input from buffer, and return a pointer to it. char lastkey(); // Retuirns the last key pressed. void clear(); // Clears the buffer. void preset (char *B); // Pre-loads the buffer with text. char *gettext(char *buf); // Returns a copy of the string. void hilight(int start, int end); // Highlights a block of text. }; class menubar : public panel { // This class is a general purpose menu bar. Menus are added with the // addmenu() function, and deleted with the delmenu() command. See the // example in the manual for programming tips. // // Parameters: x,y - The upper left corner of the bar. // w,h - The height and width of the bar. If it is too small, it // will re-adjust itself to fit. // c - The color of the bar. // tc - The color of the text in the menubar. // hc - The color of the highlight bar. // heading - A text string used as the name of a menu. // items - A string containing a comma seperated list of menu item names. // Key - The hotkey associated with that menu. It must be the 2nd number in an extended key. // // Preconditions: x,y,w,h - The same as for the panel class with d=1. // c - Must be between BLACK (0) and LIGHTGRAY (7). // hc,tc - Can be any valid color. // k - Must be 0 or 1 // no - Must be a valid menu number, starting at 1. // Key - Must represent the second number returned by getch() for an // extended keystroke. Please use the #defined numbers. // // protected: int TxtColor, // The color of the text. HiColor, // The color of the highlight bar. HkHiColor, // The color of the highlighted character in the heading. BX, // Temporary values used for the pulldown menu size. BY, BW, BH, MenuSelected, // The number of the selected menu. ItemSelected, // The number of the selected item of the selected menu. lastMenuSelected, // The number of the last menu to be selected. lastItemSelected, // The number of the last item to be selectd. PulledDown, // A flag that tells that a menu is pulled down. NumMenus, // The number of valid menus in the menubar. NumItems, // The number of items in the currently selected menu. MenuBkgHndl, // The EMS handle for the pulled down Bkg buffer, if using EMS. MenuBkgPages; // The number of EMS pages needed for the pulled down Bkg buffer. void far *MenuBackBuffer; // Stores the background for the pulled down menu. struct itemTYPE // The linked list of items in a menu. { char Item[40]; // The items name. int X, Y, Width, Height; // The area it takes up when pulled down. struct itemTYPE *NextItem; // The next item in the list. }; struct MenuTYPE // The linked list of menus. { char Heading[40]; // The name of the menu. int X, Y, Width, Height; // Its area in the bar. struct itemTYPE *Items; // A linked list of its items. struct MenuTYPE *NextMenu; // The next menu in the list. int hotkey; // The hotkey for this menu. }; struct MenuTYPE *Menus; // The head for the menus linked list. int find_char (char *str, char fnd, int begin); // finds a character in a string. char *menubar::mids (char *strn, int begin, int count); // Breaks up a string. public: menubar(int x, int y, int w, int h, int c=7, int tc=15,int hc=12, int k=1); ~menubar(); void addmenu(char *heading, char *items, int Key=0); // Adds a menu to the menubar. void delmenu(int no); // deletes a menu from the menubar. void setbkgclr(int c); // Changes the color of the bar. void settextclr(int c); // Changes the color of the text. void sethighclr(int c); // Changes the color of the highlight bar. void sethkhiclr(int C); // Sets the hotkey highlight color. void show(); // Displays the menubar. void pulldown(); // Pulls down the item list. void pushup(); // Pushes the item list back up. int menuhit(); // Returns the number of the menu the cursor is over. int pdhit(); // Returns true if the cursor is over the pull-down menu. int itemhit(); // returns the number of the item the cursor is over. int ishtkey(int keypd); // Returns the number of the menu that keypd is the hotkey for, or 0 if not a hotkey. int htkypressed(); // Checks to see if a hotkey was pressed. returns 0 if not, else the menu number. void menuselect(int no); // selects a menu. void itemselect(int no); // selects an item in the selected menu. void menuclear(); // de-selects a menu, and its items. void itemclear(); // de-selects the currently selected item only. int itemselected(); // returns the number of the currently selected item. int menuselected(); // returns the number of the currently selected menu. int lastevntitem(); // returns the number of the selected item in checkforevent(). int lastevntmenu(); // returns the number of the selected menu in checkforevent(). void checkforevent(); // polls the keyboard and mouse for a menubar event. // Allows the use of hotkeys, F-10, and arrow keys. // Also handles event if you manually select a menu. }; class vscroll : public panel { // This class is a vertical scroll bar. It is used as a selection device in scrolling // windows applications. It returns a percent, or a pixel offset of the handle from it top // most position. It can also be set with a percent or pixel offset. x,y,w,h define the size // of the scrollbar, as in the panel. The depth is 1. hdh sets the height of the handle, and // it's width is w-4, and it's depth is 1. bth defines the height of the up and down buttons. // Their width is w-4, and as with all buttons, it's height is 2. If the button is large enough, // an arrow will appear on the button. All components of the scroll bar can be operated manually, // or the getevent function can be used to automate the bar. button *Up, *Dn; panel *Hnd; int Min_Position, Max_Position, Curr_Position, Lines_Per_Page, HDH, BTH; public: vscroll(int x, int y, int w, int h, int hdh,int bht,int bc=7, int hc=7, int bkgc=7, int k=0); ~vscroll(); void show(void); // Shows a scrollbar. void hide(void); // Hides a scrollbar. void setpos(int p); // Sets the offset. int getpos(void); // Gets the offset. int uphit(void); // Up button hit. int dnhit(void); // Down button hit. int hndhit(void); // Handle hit. void uppres(void); // Press the up button. void dnpres(void); // Press the down button. void uprels(void); // Release the up button. void dnrels(void); // Release the down button. int getevent(void); // Poll the scrollbar and handle events. void resize (int w, int h); // Change the overall width & height of the bar. Does not change bht & hdh. void moveto (int x, int y); // Move the scrollbar. void setbkgclr(int c); // Set the scroll panel color. void setbtnclr(int c); // Set the button color. void sethdlclr(int c); // Set the handle color. void setarrclr(int c); // Set the arrow's color. void setrange(int min, int max); // Sets the range of the scroll bar. void setpagesize(int LPP); // Sets the number of lines per page. }; class hscroll : public panel { // This is a horizontal scroll bar. It is the same as the vertical scroll bar // except that the button width and handle width (instead of height) are defined, and // the offsets and % is for the x axis, and not the y. // button *Lf, *Rt; panel *Hnd; int Min_Position, Max_Position, Curr_Position, Lines_Per_Page, HDW, BTW; public: hscroll(int x, int y, int w, int h, int hdw,int bhw,int bc=7, int hc=7, int bkgc=7, int k=0); ~hscroll(); void show(void); void hide(void); void setpos(int p); int getpos(void); int lfhit(void); int rthit(void); int hndhit(void); void lfpres(void); void rtpres(void); void lfrels(void); void rtrels(void); int getevent(void); void resize (int w, int h); void moveto (int x, int y); void setbkgclr(int c); void setbtnclr(int c); void sethdlclr(int c); void setarrclr(int c); void setrange(int min, int max); // Sets the range of the scroll bar. void setpagesize(int LPP); }; // Miscellaneous Functions: // These functions are used to get input from the keyboard, if not using the // instrn class or the textplane class in the guicls file. You MUST use these // instead of getch() and kbhit(). Failure to do so can cause your program // to hang up in the menubar::getevent and menubar::htkypressed functions. // These functions handle extended keys differently than getch(). Instead of // returning 0 to indicate that the next key extracted is extended, if the high // byte is 1, then the low byte is an extended key. (normal keys: 0-255, extended // keys: 256-512). // // The function getkbflags() returns the following: bit meaning // --- ------- // 7 Insert is ON. // 6 Caps Lock ON. // 5 Num Lock ON. // 4 Scroll Lock is ON. // 3 Alt key is pressed. // 2 Ctrl Key is pressed. // 1 Left SHIFT is pressed. // 0 Right SHIFT is pressed. #define KBD_INS_ON 0x80 #define KBD_CAP_ON 0x40 #define KBD_NUM_ON 0x20 #define KBD_SCR_ON 0x10 #define KBD_ALT_PR 0x08 #define KBD_CTL_PR 0x04 #define KBD_LSH_PR 0x02 #define KBD_RSH_PR 0x01 int keyhit(); // Returns true if a key has been pressed, or one is in the buffer. int getkey(); // Returns the next key in the buffer. int getkbflags(); // Returns the status of the keyboard flags. int putbk(int keypb); // Pushes a key back to the buffer. #endif