home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Supreme Volume 6 #1
/
swsii.zip
/
swsii
/
215
/
DDJ11A92.ZIP
/
CPROG.ASC
< prev
next >
Wrap
Text File
|
1992-10-29
|
11KB
|
366 lines
_C PROGRAMMING COLUMN_
by Al Stevens
[LISTING ONE]
// ---------- desktop.h
#ifndef DESKTOP_H
#define DESKTOP_H
#include "screen.h"
#include "cursor.h"
#include "keyboard.h"
#include "mouse.h"
#include "speaker.h"
#include "clock.h"
class DFWindow;
class DeskTop {
DFWindow *apwnd; // application window
DFWindow *infocus; // current window with the focus
DFWindow *firstcapture; // first window to capture the focus
DFWindow *focuscapture; // current window with captured focus
// ------- the desktop devices
Screen sysscreen; // the system screen
Mouse sysmouse; // the system mouse
Keyboard syskeyboard; // the system keyboard
Cursor syscursor; // the system cursor
Clock sysclock; // the system clock
Speaker sysspeaker; // the system speaker
public:
DeskTop();
~DeskTop();
DFWindow *ApplWnd() { return apwnd; }
void SetApplication(DFWindow *ApWnd) { apwnd = ApWnd; }
Bool DispatchEvents();
DFWindow *InFocus() { return infocus; }
DFWindow *FocusCapture() { return focuscapture; }
DFWindow *FirstCapture() { return firstcapture; }
void SetFocus(DFWindow *wnd) { infocus = wnd; }
void SetFocusCapture(DFWindow *wnd) { focuscapture = wnd; }
void SetFirstCapture(DFWindow *wnd) { firstcapture = wnd; }
// ------- the desktop devices
Mouse& mouse() { return sysmouse; }
Screen& screen() { return sysscreen; }
Keyboard& keyboard() { return syskeyboard; }
Cursor& cursor() { return syscursor; }
Clock& clock() { return sysclock; }
Speaker& speaker() { return sysspeaker; }
};
extern DeskTop desktop;
#endif
[LISTING TWO]
// ----------- screen.h
#ifndef SCREEN_H
#define SCREEN_H
#include <dos.h>
#include "dflatdef.h"
#include "rectangl.h"
class Screen {
unsigned address;
unsigned mode;
unsigned page;
unsigned height;
unsigned width;
union REGS regs;
// ---- compute video offset address
unsigned vad(int x, int y) { return y * (width*2) + x*2; }
public:
Screen();
unsigned Height() { return height; }
unsigned Width() { return width; }
unsigned Page() { return page; }
Bool isEGA();
Bool isVGA();
Bool isMono() { return (Bool) (mode == 7); }
Bool isText() { return (Bool) (mode < 4); }
void Scroll(Rect &rc, int d, int fg, int bg);
unsigned int GetVideoChar(int x, int y);
void PutVideoChar(int x, int y, unsigned int c);
void WriteVideoString(char *s,int x,int y,int fg,int bg);
void SwapBuffer(Rect &rc, char *bf,
Bool Hiding, Bool HasShadow, Bool isFrame);
void GetBuffer(Rect &rc, char *bf);
void PutBuffer(Rect &rc, char *bf);
};
const int VIDEO = 0x10;
inline int clr(int fg, int bg)
{
return fg | (bg << 4);
}
#endif
[LISTING THREE]
// ---------- mouse.h
#ifndef MOUSE_H
#define MOUSE_H
#include <dos.h>
#include "dfwindow.h"
#include "timer.h"
class Mouse {
Bool installed; // True = mouse is installed
char *statebuffer; // mouse state buffer
Timer doubletimer; // mouse double-click timer
Timer delaytimer; // mouse typematic click timer
int prevx; // previous mouse x coordinate
int prevy; // previous mouse y coordinate
int clickx; // click x position
int clicky; // click y position
int releasex; // release x position
int releasey; // release y position
union REGS regs;
DFWindow *MouseWindow(int mx, int my);
void CallMouse(int m1,int m2=0,int m3=0,int m4=0,unsigned es=0);
void DispatchRelease();
void DispatchMove();
void DispatchLeftButton();
public:
Mouse();
~Mouse();
Bool Installed() { return installed; }
void GetPosition(int &x, int &y); // get mouse position
void SetPosition(int x, int y); // set mouse position
Bool Moved(); // True if mouse has moved
void Show(); // show the mouse cursor
void Hide(); // hide the mouse cursor
Bool LeftButton(); // True if left button is pressed
Bool ButtonReleased(); // True if button was released
void SetTravel(int minx, int maxx, int miny, int maxy);
void DispatchEvent();
};
const int MOUSE = 0x33; // mouse interrupt vector
// -------- mouse commands
const int RESETMOUSE = 0;
const int SHOWMOUSE = 1;
const int HIDEMOUSE = 2;
const int READMOUSE = 3;
const int SETPOSITION = 4;
const int BUTTONRELEASED = 6;
const int XLIMIT = 7;
const int YLIMIT = 8;
const int BUFFSIZE = 21;
const int SAVESTATE = 22;
const int RESTORESTATE = 23;
// -------- timer delays for mouse repeat, double clicks
const int DELAYTICKS = 1;
const int FIRSTDELAY = 7;
const int DOUBLETICKS = 5;
#endif
[LISTING FOUR]
// ------------- cursor.h
#ifndef CURSOR_H
#define CURSOR_H
// ------- video BIOS (0x10) functions
const int SETCURSORTYPE = 1;
const int SETCURSOR = 2;
const int READCURSOR = 3;
const int HIDECURSOR = 0x20;
const int MAXSAVES = 50; // depth of cursor save/restore stack
class Cursor {
// --- cursor save/restore stack
int cursorpos[MAXSAVES];
int cursorshape[MAXSAVES];
int cs; // count of cursor saves in effect
union REGS regs;
void Cursor::GetCursor();
public:
Cursor();
~Cursor();
void SetPosition(int x, int y);
void GetPosition(int &x, int &y);
void SetType(unsigned t);
void normalcursor() { SetType(0x0607); }
void Hide();
void Show();
void Save();
void Restore();
void SwapStack();
};
inline void swap(int a, int b)
{
int x = a;
a = b;
b = x;
}
#endif
[LISTING FIVE]
// ------------ keyboard.h
#ifndef KEYBOARD_H
#define KEYBOARD_H
#include <dos.h>
#include "dflatdef.h"
class Keyboard {
union REGS regs;
int shift;
public:
Keyboard() { shift = GetShift(); }
Bool ShiftChanged();
int ShiftState() { return shift = GetShift(); }
int AltConvert(int);
int GetKey();
int GetShift();
Bool KeyHit();
void clearBIOSbuffer();
void DispatchEvent();
};
const int KEYBOARDVECT = 9;
const int KEYBOARDPORT = 0x60;
inline void Keyboard::clearBIOSbuffer()
{
*(int far *)(MK_FP(0x40,0x1a)) =
*(int far *)(MK_FP(0x40,0x1c));
}
// ----- keyboard BIOS (0x16) functions
const int KEYBRD = 0x16;
const int READKB = 0;
const int KBSTAT = 1;
const int ZEROFLAG = 0x40;
const int OFFSET = 0x1000;
const int RUBOUT = 8;
const int BELL = 7;
const int ESC = 27;
const unsigned F1 = (187+OFFSET);
const unsigned F8 = (194+OFFSET);
const unsigned SHIFT_F8 = (219+OFFSET);
const unsigned F10 = (196+OFFSET);
const unsigned HOME = (199+OFFSET);
const unsigned UP = (200+OFFSET);
const unsigned PGUP = (201+OFFSET);
const unsigned BS = (203+OFFSET);
const unsigned FWD = (205+OFFSET);
const unsigned END = (207+OFFSET);
const unsigned DN = (208+OFFSET);
const unsigned PGDN = (209+OFFSET);
const unsigned INS = (210+OFFSET);
const unsigned DEL = (211+OFFSET);
const unsigned CTRL_HOME = (247+OFFSET);
const unsigned CTRL_PGUP = (132+OFFSET);
const unsigned CTRL_BS = (243+OFFSET);
const unsigned CTRL_FIVE = (143+OFFSET);
const unsigned CTRL_FWD = (244+OFFSET);
const unsigned CTRL_END = (245+OFFSET);
const unsigned CTRL_PGDN = (246+OFFSET);
const unsigned SHIFT_HT = (143+OFFSET);
const unsigned ALT_A = (158+OFFSET);
const unsigned ALT_B = (176+OFFSET);
const unsigned ALT_C = (174+OFFSET);
const unsigned ALT_D = (160+OFFSET);
const unsigned ALT_E = (146+OFFSET);
const unsigned ALT_F = (161+OFFSET);
const unsigned ALT_G = (162+OFFSET);
const unsigned ALT_H = (163+OFFSET);
const unsigned ALT_I = (151+OFFSET);
const unsigned ALT_J = (164+OFFSET);
const unsigned ALT_K = (165+OFFSET);
const unsigned ALT_L = (166+OFFSET);
const unsigned ALT_M = (178+OFFSET);
const unsigned ALT_N = (177+OFFSET);
const unsigned ALT_O = (152+OFFSET);
const unsigned ALT_P = (153+OFFSET);
const unsigned ALT_Q = (144+OFFSET);
const unsigned ALT_R = (147+OFFSET);
const unsigned ALT_S = (159+OFFSET);
const unsigned ALT_T = (148+OFFSET);
const unsigned ALT_U = (150+OFFSET);
const unsigned ALT_V = (175+OFFSET);
const unsigned ALT_W = (145+OFFSET);
const unsigned ALT_X = (173+OFFSET);
const unsigned ALT_Y = (149+OFFSET);
const unsigned ALT_Z = (172+OFFSET);
const unsigned ALT_1 = (0xf8+OFFSET);
const unsigned ALT_2 = (0xf9+OFFSET);
const unsigned ALT_3 = (0xfa+OFFSET);
const unsigned ALT_4 = (0xfb+OFFSET);
const unsigned ALT_5 = (0xfc+OFFSET);
const unsigned ALT_6 = (0xfd+OFFSET);
const unsigned ALT_7 = (0xfe+OFFSET);
const unsigned ALT_8 = (0xff+OFFSET);
const unsigned ALT_9 = (0x80+OFFSET);
const unsigned ALT_0 = (0x81+OFFSET);
const unsigned ALT_HYPHEN = (130+OFFSET);
const unsigned CTRL_F4 = (225+OFFSET);
const unsigned ALT_F4 = (235+OFFSET);
const unsigned ALT_F6 = (237+OFFSET);
enum {CTRL_A=1,CTRL_B,CTRL_C,CTRL_D,CTRL_E,CTRL_F,CTRL_G,CTRL_H,
CTRL_I,CTRL_J,CTRL_K,CTRL_L,CTRL_M,CTRL_N,CTRL_O,CTRL_P,
CTRL_Q,CTRL_R,CTRL_S,CTRL_T,CTRL_U,CTRL_V,CTRL_W,CTRL_X,
CTRL_Y,CTRL_Z };
// ------- BIOS shift key mask values
const int RIGHTSHIFT = 0x01;
const int LEFTSHIFT = 0x02;
const int CTRLKEY = 0x04;
const int ALTKEY = 0x08;
const int SCROLLLOCK = 0x10;
const int NUMLOCK = 0x20;
const int CAPSLOCK = 0x40;
const int INSERTKEY = 0x80;
#endif
[LISTING SIX]
// --------- speaker.h
#ifndef SPEAKER_H
#define SPEAKER_H
class Speaker {
void Wait(int n);
public:
void Beep();
};
const int FREQUENCY = 100;
const long COUNT = 1193280L / FREQUENCY;
#endif
[LISTING SEVEN]
// --------- clock.h
#ifndef CLOCK_H
#define CLOCK_H
#include "timer.h"
class Clock {
Timer clocktimer;
public:
Clock();
void DispatchEvent();
};
#endif