home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 26
/
CD_ASCQ_26_1295.iso
/
vrac
/
user_int.zip
/
WINDOW.CPP
< prev
Wrap
C/C++ Source or Header
|
1995-07-30
|
7KB
|
378 lines
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <bios.h>
int video_mode(void);
void goto_xy(int x, int y);
void set_v_ptr();
void write_char(int x, int y, char ch, int attrib);
void write_string(int x, int y, char *p, int attrib);
const enum clr { black, blue, green, cyan, red, magenta,
brown, lightgray, darkgray, lightblue,
lightgreen, lightcyan, lightred,
lightmagenta, yellow, white, blink=128 };
int vmode;
char far *vid_mem;
class wintype {
int leftx;
int upy;
int rightx;
int downy;
int border;
int active;
char *title;
int curx, cury;
char *buf;
char color;
void save_screen();
void restore_screen();
void draw_border();
void display_title();
public:
wintype(int lx, int uy,
int rx, int ly,
int b = 1,
char *mess = ""
);
~wintype() {winremove(); delete buf;};
void winput();
void winremove();
int winputs(char *s);
int winxy(int x, int y);
void wincls();
void wincleol();
void line_border();
int getx();
int gety();
void movex();
void resetxy();
void wcout(int x, int y, char *string);
void setcolor(char c) {color = c;}
char getcolor() {return color;}
void setbkcolor(char c) {color = color | (c<<4);}
char getbkcolor() {return (color>>4) & 127;}
friend wintype &operator<<(wintype &o, char *s);
};
wintype::wintype(int lx, int uy,
int rx, int ly,
int b,
char *mess
)
{
if(lx<0) lx = 0;
if(rx>79) rx = 79;
if(uy<0) uy = 0;
if(ly>24) ly = 24;
leftx = lx; upy = uy;
rightx = rx; downy = ly;
border = b;
title = mess;
active = 0;
curx = cury = 0;
buf = new char[2*(rightx-leftx+1)*(downy-upy+1)];
if(!buf) {
clrscr();
_setcursortype(_NORMALCURSOR);
printf("Memory Allocation error\n");
exit(1);
}
color = white;
}
void wintype::winput()
{
if(!active) {
save_screen();
active = 1;
}
else return;
if(border) draw_border();
display_title();
goto_xy(leftx + curx + 1, upy + cury + 1);
}
void wintype::winremove()
{
if(!active) return;
restore_screen();
active = 0;
}
void wintype::draw_border()
{
register int i;
char far *v, far *t;
v = vid_mem;
t = v;
for(i=leftx+1; i<rightx; i++) {
v += (upy*160) + i*2;
*v++ = 255;
*v = color;
v = t;
v += (downy*160) + i*2;
*v++ = 255;
*v = color;
v = t;
}
for(i=upy+1; i<downy; i++) {
v += (i*160) + leftx*2;
*v++ = 255;
*v = color;
v = t;
v += (i*160) + rightx*2;
*v++ = 255;
*v = color;
v = t;
}
write_char(leftx, upy, 255, color);
write_char(leftx, downy, 255, color);
write_char(rightx, upy, 255, color);
write_char(rightx, downy, 255, color);
write_char(rightx, upy+1, 255, color);
write_char(rightx, downy-1, 255, color);
}
void wintype::display_title()
{
register int x, len;
x = leftx;
len = strlen(title);
len = (rightx - x - len) / 2;
if(len<0) return;
x = x + len + 1;
write_string(x, upy, title, color);
}
void wintype::save_screen()
{
register int i, j;
char *buf_ptr;
char far *v, far *t;
buf_ptr = buf;
v = vid_mem;
for(i=upy; i<downy+1; i++)
for(j=leftx; j<rightx+1; j++) {
t = (v + (i*160) + j*2);
*buf_ptr++ = *t++;
*buf_ptr++ = *t;
*(t-1) = ' ';
}
}
void wintype::restore_screen()
{
register int i, j;
char far *v, far *t;
char *buf_ptr;
buf_ptr = buf;
v = vid_mem;
t = v;
for(i=upy; i<downy+1; i++)
for(j=leftx; j<rightx+1; j++) {
v = t;
v += (i*160) + j*2;
*v++ = *buf_ptr++;
*v = *buf_ptr++;
}
}
int wintype::winputs(char *s)
{
register int x, y;
char far *v;
if(!active) return 0;
x = curx + leftx + 1;
y = cury + upy + 1;
v = vid_mem;
v += (y*160) + x*2;
for( ; *s; s++) {
if(y >= downy) {
return 1;
}
if(x >= rightx) {
return 1;
}
if(*s=='\n') {
y++;
x = leftx+1;
v = vid_mem;
v += (y*160) + x*2;
cury++;
curx = 0;
}
else {
curx++;
x++;
*v++ = *s;
*v++ = color;
}
winxy(curx, cury);
}
return 1;
}
void wintype::line_border()
{
register int i;
char far *v, far *t;
v = vid_mem;
t = v;
for(i=leftx+1; i<rightx; i++) {
v += (upy*160) + i*2;
*v++ = 196;
*v = color;
v = t;
v += (downy*160) + i*2;
*v++ = 196;
*v = color;
v = t;
}
for(i=upy+1; i<downy; i++) {
v += (i*160) + leftx*2;
*v++ = 179;
*v = color;
v = t;
v += (i*160) + rightx*2;
*v++ = 179;
*v = color;
v = t;
}
write_char(leftx, upy, 218, color);
write_char(leftx, downy, 192, color);
write_char(rightx, upy, 191, color);
write_char(rightx, downy, 217, color);
}
int wintype::winxy(int x, int y)
{
if(x<0 || x+leftx >= rightx-1)
return 0;
if(y<0 || y+upy >= downy-1)
return 0;
curx = x;
cury = y;
goto_xy(leftx+x+1, upy+y+1);
return 1;
}
int wintype::getx()
{
return curx;
}
int wintype::gety()
{
return cury;
}
void wintype::movex()
{
curx++;
}
void wintype::resetxy()
{
winxy(curx=leftx, cury+1);
}
void wintype::wcout(int x, int y, char *string)
{
write_string(leftx-1+x,upy-1+y,string,color);
}
void wintype::wincls()
{
register int i, j;
char far *v, far *t;
v = vid_mem;
t = v;
for(i=upy+1; i<downy; i++)
for(j=leftx+1; j<rightx; j++) {
v = t;
v += (i*160) + j*2;
*v++ = ' ';
*v = color;
}
curx = 0;
cury = 0;
}
void wintype:: wincleol()
{
register int i, x, y;
x = curx;
y = cury;
winxy(curx, cury);
for(i=curx; i<rightx-1; i++)
winputs(" ");
winxy(x, y);
}
wintype &operator<<(wintype &o, char *s)
{
o.winputs(s);
return o;
}
void set_v_ptr()
{
vmode = video_mode();
if((vmode!=2) && (vmode!=3) && (vmode!=7)) {
printf("video must be in 80 column text mode");
exit(1);
}
if(vmode==7)
{ vid_mem = (char far *) 0xB0000000;
}
else
{ vid_mem = (char far *) 0xB8000000;
}
}
video_mode(void)
{
union REGS r;
r.h.ah = 15;
return int86(0x10, &r, &r) & 255;
}
void write_char(int x, int y, char ch, int attrib)
{
char far *v;
v = vid_mem;
v += (y*160) + x*2;
*v++ = ch;
*v = attrib;
}
void goto_xy(int x, int y)
{
union REGS r;
r.h.ah = 2;
r.h.dl = x;
r.h.dh = y;
r.h.bh = 0;
int86(0x10, &r, &r);
}
void write_string(int x, int y, char *p, int attrib)
{
register int i;
char far *v;
v = vid_mem;
v += (y*160) + x*2;
for(i=y; *p; i++) {
*v++ = *p++;
*v++ = attrib;
}
}