***************************************************************************** * * * Graphics Unit For The Mouse * * by * * Jean-Laurent PRADEL * * * * Version 2.0 * * * ***************************************************************************** Introduction ____________ When I test the TP6 for the first time, my biggest disappointment was that it was always impossible to program the mouse in graphic mode ! After few weeks, I found a small book about this under TP5. Just the time for my blood to make a turn in my body and I make my first try... At this time, I had only an old 8088 ! (Yeah, really !!!). Here you will find the result of my thinking and some system handing up ! If you don't want to read immediatly all those details, you can try my demo program which could be programmed in a better way, but it is just here to show you what I did... 컴컴컴컴컴컴컴훟컴컴컴컴컴컴컴� Types and Constants In first, there is a type which is used to create the mouse pattern : Type MousePattern = Record InsertX : word; InsertY : word; Pattern : Array [0..15] of String [16]; End; The mouse cursor is a small pattern of 16*16 pixels. The variables InsertX and InsertY define the INSERTION POINT in this pattern; it is the point in the pattern which define the mouse position. The array contains the shape of the cursor. For exemple, the arrow is defined by : Const Arrow : MousePattern = (InsertX: 2; InsertY: 1; Pattern: (' 0 ', ' 020 ', ' 0220 ', ' 02220 ', ' 022220 ', ' 0222220 ', ' 02222220 ', ' 022222220 ', ' 0222222220 ', ' 02222222220 ', ' 0222222000 ', ' 02000220 ', ' 0 0220 ', ' 0220 ', ' 0220 ', ' 00 ')); With my method, there is in the same array the mask and the shape. For that you need 4 caracters : - ' ' (Space Caracter) : The background will be displayed. - '0' : A black point will be displayed (BkColor). - '1' : A white point will be displayed (really white). - '2' : The background will be displayed in the complementary colour. I know that it isn't so easy to see the difference between a 1 and a 2 in the middle of others 0, 1 and 2. But it is really easy to type on the keyboard and easier to read than a set of hexadecimal codes !... 컴컴훟컴컴� I thought that it was really boring to create a complete box manager when you get my unit. So I defined an objet : Box = Object MidX, MidY : Integer; Width, Height : Integer; COutLine, CInSide, CText : Integer; TypText : TextSettingsType; Text : String; Constructor Init (x,y,w,h : Integer; co,ci,ct : Integer); Procedure SetText (Ft, Dir, CSize : Integer; txt : String); Procedure Bill; Virtual; Procedure UnBill; Virtual; Procedure Wait (b : Integer); Procedure ChangeColor (co,ci,ct : Integer); Procedure Move (nx,ny : Integer); Procedure ChangeText (Ft, Dir, CSize : Integer; txt : String); Function TestButton (Button : Integer) : Boolean; Destructor Done; Virtual; End; You can define children of this type and change the procedures Bill, UnBill and Done (they are Virtual). The variables are used as follow : MidX and MidY : The coordinates of the middle of the box. Width : The width of the box (hehe!!). Height : The height of the box (hohoho!!). COutSide, CInSide and CText : The colors of the border, the inside and the text of the box. TypText : The text parameters (direction, font, ...). Text : The ... text in the box (Yaouhhh!!!). You can use this type as pointer if you don't forget the lows of the CONSTRUCTOR and the DESTRUCTOR (for this, call your knowledge...). 컴컴훟컴컴� After that, I have defined 7 constants for the codes of the buttons and 4 others for predefined cursors: Left, Middle, Right, LeftMiddle, MiddleRight, LeftRight, LeftMiddleRight Arrow, Target, Bomb and QuestionMark. KingOfMouse is a variable which is initialized by the function TestMouse. 컴컴컴컴컴컴컴훟컴컴컴컴컴컴컴� Procedures Procedure MouseState(Var dx,dy,button:integer); This procedure brings you back the position of the mouse and the state of the button (see constants). dx and dy are the real coordinates between 0 and 639. In CGA mode, the dx coordinate is gave in the range 0..639 (like in EGA or VGA mode). 컴컴훟컴컴� Procedure ChangeMouse(Drawing:MousePattern); This procedure changes the mouse cursor with the variable Drawing. The type MousePattern was explained just before. 컴컴훟컴컴� Procedure Show_Mouse; This procedure shows the mouse!!! You must be care, the same procedure exists in the Drivers unit of TurboVision, but it is called "ShowMouse" and not "Show_Mouse"!!! 컴컴훟컴컴� Procedure Hide_Mouse; This procedure hides the mouse (yeah, really!)!!! And...? You must be care because blablabla... blabla... blablabla... "HideMouse" blablabla... "Hide_Mouse"!!! Nevertheless, it is important to hide the mouse before drawing anything in the background, if you don't want to see some strange things on the screen. 컴컴훟컴컴� Procedure PutMouse(x,y:integer); This procedure moves the mouse to the point (x,y). You don't need to use Hide_Mouse before this procedure (and of course to use Show_Mouse after). 컴컴훟컴컴� Procedure WaitButton (Var a,b,button:integer); This procedure waits (!) the user clicks a button and gives you back the coordinates of the mouse at this moment and which button was used. 컴컴훟컴컴� Procedure MouseLimits (x1,y1,x2,y2:integer); This procedure defines a box (x1,y1),(x2,y2) out of which the mouse can't go. The upper left corner has (0,0) as coordinates... 컴컴훟컴컴� Procedure UnLimitMouse; This procedure deletes the limits made by the procedure MouseLimits. 컴컴훟컴컴� Procedure LastPress (Var x,y,number,button:integer); This procedure gives you back some informations about the button "button" : x : last position x of the mouse when "button" was pressed. y : - - y - - - - - - - . number : How many times the "button" has been pressed since the last call to this procedure. button : How are the buttons now... (see constants). 컴컴훟컴컴� Procedure LastRelease (Var x,y,button:integer); This procedure gives you back some informations about the button "button". This procedure works like the procedure LastPress. 컴컴훟컴컴� Procedure MouseRun (Var a,b:integer); This procedure gives you the moving of the mouse since the last call. Those values are in 1/200 inches (generally called 'mickey'). They are positives from left to right and from top to bottom. 컴컴훟컴컴� Procedure MouseSpeed (a,b:integer); This procedure is used to fixe the rate between mickeys and pixels. Those news values must be given in mickeys per 8 pixels (max. 32767). The horizontal default value is 8 and the vertical default value is 16. 컴컴훟컴컴� Procedure Box (x,y,l,h,ctour,cint,ctext:word;text:String); This procedure has nothing to do with the mouse, but I think that it is really usefull. It draws a box, centred on (x,y), with a length of l and a height of h. The color of the border is ctour, that of the inside is cint. You can put a text in with the colour ctext. 컴컴컴컴컴컴컴훟컴컴컴컴컴컴컴� Functions Function TestMouse:Boolean; This function is the first thing that you MUST do in your initialization procedure. This function tests the driver of the mouse. If there is no driver, the result is False. If there is a driver active, the result is True. More, this function initializes the variable KindOfMouse which gives you the number of buttons on the mouse. 컴컴훟컴컴� Function TestButton(x1,y1,x2,y2,button:integer):boolean; This function becames True if the mouse is in the box (x1,y1),(x2,y2) and the button "button" is pressed. In any other case, the function is False. 컴컴컴컴컴컴컴훟컴컴컴컴컴컴컴� Object BOX Constructor Box.Init (x,y,w,h : Integer; co,ci,ct : Integer); This procedure is the CONSTRUCTOR of the object, you MUST use it to initialize an object. This just initialize the variables MidX, MidY, Width, Height, COutSide, CInSide and CText. But it also creates the VMT... 컴컴훟컴컴� Procedure Box.SetText (Ft, Dir, CSize : Integer; txt : String); This procedure initialize the text of the box : font, direction, size and text. If the text it's too long to fit in the box, then the width and the height are adjusted. 컴컴훟컴컴� Procedure Box.Bill; Virtual; This procedure draws the box (...!!). It hides the mouse, draws the box with its colors, restores the currents colors (used by the rest of the program) and shows the mouse. 컴컴훟컴컴� Procedure Box.UnBill; Virtual; This procedure undraws the box (huhu!!). Like Box.Bill, this procedure hides the mouse, restores the currents colors and shows the mouse. 컴컴훟컴컴� Procedure Box.Wait (b : Integer); Waits that the user clicks in the box with the button 'b' (see constants) 컴컴훟컴컴� Procedure Box.ChangeColor (co,ci,ct : Integer); Changes the values of the variables COutSide, CInSide and CText with the news values co, ci, ct and draws the "new" box. 컴컴훟컴컴� Procedure Box.Move (nx,ny : Integer); Changes the values MidX and MidY only if the entire box it's always in the screen. 컴컴훟컴컴� Procedure Box.ChangeText (Ft, Dir, CSize : Integer; txt : String); Changes the text, tests that the box is big enough (adjust if useful) and draws the "new" box. 컴컴훟컴컴� Function Box.TestButton (Button : Integer) : Boolean; Returns 'True' if the 'Button' is pressed in the box. This function doesn't wait, but just make a test "in the run". Very useful to finish the loops Repeat .......... Until "the user click in box". (Really !!!) 컴컴훟컴컴� Destructor Box.Done; The DESTRUCTOR ! It just deletes the box and cleans the VMT. It's essential to use it if you make pointers with the type Box. 컴컴컴컴컴컴컴훟컴컴컴컴컴컴컴� That 's all !!! That 's all, but not at all!!! This unit is the first thing which lives Bob (Bob is my computer) and my house (euh... my appartment). And of course, it is possible to do better (with my program and with my english !). So, I will be very happy if you send me some echos of what happens with my unit. I already know a "problem"... : When you run Windows, this program changes something in your driver. After that, your driver only recognizes 2 buttons (even if you have a lovely mouse with 3 buttons), and my unit only sees a mouse with 2 buttons !!!. The bigger problem that I know is that my unit doesn't work in SVGA mode. I'm really disappointed by this !!! I don't know the solution (for the moment). If you (yes, YOU) have an idee or if you already program directly a graphic card (by using the interruption 10h), you could help me...! Until May 93: After May 93: Jean-Laurent PRADEL Jean-Laurent PRADEL Im Sohlgraben 1A Ch. Piegros Sud D-3550 MARBURG/CAPPEL Villa Le Sapin Bleu Germany 83170 BRIGNOLES France E-Mail : pidou@astro.chemie.uni-marburg.de Thank you and a lot of fun....................Danke und viele Spa�