📄 window.cpp
字号:
// ******************************************************************** //
// //
// WINDOW.CPP //
// Copyright (c) 1993, Michael Holmes and Bob Flanders //
// C++ Communication Utilities //
// //
// Chapter 7: Receiving a FAX //
// Last changed in chapter 2 //
// //
// This file contains the definition and interface for //
// the window class. //
// //
// ******************************************************************** //
extern
int _wscroll; // screen scrolling flag
enum boxes // line drawing box types
{
none = -1, // no box
single_line, // single line box
double_line // double line box
};
struct box_characters // box drawing characters
{
char ul_char, // upper left corner
ur_char, // upper right corner
ll_char, // lower left corner
lr_char, // lower right corner
top_char, // horizontal line
side_char; // vertical line
} box_chars[2] =
{
{ '\xda', '\xbf', '\xc0', '\xd9', // single line box
'\xc4', '\xb3'},
{ '\xc9', '\xbb', '\xc8', '\xbc', // double line box
'\xcd', '\xba'}
};
class Window
{
public:
Window(char ul_c, char ul_r, // define window, upper left
char lr_c, char lr_r, // lower right,
char cn, char cr); // normal & reverse colors
void Open(boxes box = none), // open window
AtSay(int c, int r, char *s), // display string at position
AtSayReverse(int c, int r, // display string at position
char *s), // in reverse video
Display(char), // display a character
Display(char *s), // display a string
DisplayReverse(char *s), // display string in rev video
Clear(void), // clear window
GotoXY(int c, int r), // goto xy location
MakeCurrent(void), // make window current
Close(void); // close window
~Window(); // destructor
private:
char ul_col, ul_row, // window upper left
lr_col, lr_row, // ..and lower right
cursor_col, cursor_row, // cursor column and row
cn_color, cr_color, // norm and reverse colors
*old_data, // overlaid data
open_flag, // window open/close flag
scroll_flag; // scrolling enabled flag
boxes border_flag; // border type
};
//
// Globals
//
int max_lines = 25; // max lines on screen
Window *last_window; // last window pointer
/* ******************************************************************** *
*
* Window -- define window instance
*
* ******************************************************************** */
Window::Window(char ul_c, char ul_r, // upper left corner
char lr_c, char lr_r, // lower right corner
char cn, char cr) // normal and reverse colors
{
ul_col = ul_c; // save window coordinates
ul_row = ul_r; // ..row and column
lr_col = lr_c; // ..for upper left
lr_row = lr_r; // ..and lower right
cn_color = cn; // save user colors
cr_color = cr; // ..for later
cursor_col = cursor_row = 1; // init cursor column and row
open_flag = 0; // clear open flags
old_data = new char[(((lr_c - ul_c) + 1) // get work buffer
* ((lr_r - ul_r) + 1)) * 2]; // ..for old screen image
}
/* ******************************************************************** *
*
* Open -- open a window
*
* ******************************************************************** */
void Window::Open(boxes box) // border flag
{
int i; // loop control
struct box_characters *b; // box characters
if (open_flag) // q. window already opened?
return; // a. yes .. just return
border_flag = box; // set border flag
open_flag = 1; // show window opened
gettext(ul_col, ul_row, lr_col, lr_row, // capture old screen data
old_data); // ..to temp buffer
window(ul_col, ul_row, lr_col, lr_row); // make window active
textcolor(FG(cn_color)); // set up foreground
textbackground(BG(cn_color)); // ..and background colors
clrscr(); // clear window
scroll_flag = _wscroll; // ..and save scroll setting
if (box != none) // q. border requested?
{ // a. yes .. draw the box
b = &box_chars[box]; // get line drawing group
_wscroll = 0; // disable scrolling
gotoxy(1, 1); // goto upper left corner
cprintf("%c", b->ul_char); // put out first corner
for (i = 1; i < (lr_col - ul_col); i++) // build top of box..
cprintf("%c", b->top_char); // ..with horizontals
cprintf("%c", b->ur_char); // ..and upper right corner
gotoxy(1, (lr_row - ul_row) + 1); // goto lower left corner
cprintf("%c", b->ll_char); // put out bottom corner
for (i = 1; i < (lr_col - ul_col); i++) // build bottom of box
cprintf("%c", b->top_char); // ..with horizontals
cprintf("%c", b->lr_char); // ..and lower right corner
for (i = 2; i <= (lr_row - ul_row); i++)// put the sides on the box
{
gotoxy(1, i); // jump to left side of box
cprintf("%c", b->side_char); // ..and draw a chunk
gotoxy((lr_col - ul_col) + 1, i); // ..then jump to right side
cprintf("%c", b->side_char); // ..of the box and draw
}
_wscroll = scroll_flag; // restore scrolling mode
}
}
/* ******************************************************************** *
*
* AtSay -- display string at position
*
* ******************************************************************** */
void Window::AtSay(int c, int r, // column and row to
char *s) // display string
{
GotoXY(c, r); // set up at the right place
cprintf("%s", s); // display string in window
cursor_col = wherex(); // save cursor column..
cursor_row = wherey(); // ..and cursor row
}
/* ******************************************************************** *
*
* AtSayReverse -- display string at position in reverse video
*
* ******************************************************************** */
void Window::AtSayReverse(int c, int r, // column and row to
char *s) // display string
{
GotoXY(c, r); // set up at the right place
textcolor(FG(cr_color)); // set up foreground
textbackground(BG(cr_color)); // ..and background colors
cprintf("%s", s); // display string in window
cursor_col = wherex(); // save cursor column..
cursor_row = wherey(); // ..and cursor row
textcolor(FG(cn_color)); // then set colors back to
textbackground(BG(cn_color)); // ..their normal settings
}
/* ******************************************************************** *
*
* Display -- display a character in a window
*
* ******************************************************************** */
void Window::Display(char c) // character to display
{
MakeCurrent(); // make this window current
cprintf("%c", c); // display string in window
cursor_col = wherex(); // save cursor column..
cursor_row = wherey(); // ..and cursor row
}
/* ******************************************************************** *
*
* Display -- display string in window
*
* ******************************************************************** */
void Window::Display(char *s) // string to display
{
MakeCurrent(); // make this window current
cprintf("%s", s); // display string in window
cursor_col = wherex(); // save cursor column..
cursor_row = wherey(); // ..and cursor row
}
/* ******************************************************************** *
*
* DisplayReverse -- display string in reverse video
*
* ******************************************************************** */
void Window::DisplayReverse(char *s) // string to display
{
MakeCurrent(); // make this window current
textcolor(FG(cr_color)); // set up foreground
textbackground(BG(cr_color)); // ..and background colors
cprintf("%s", s); // display string in window
cursor_col = wherex(); // save cursor column..
cursor_row = wherey(); // ..and cursor row
textcolor(FG(cn_color)); // then set colors back to
textbackground(BG(cn_color)); // ..their normal settings
}
/* ******************************************************************** *
*
* Clear -- clear current window
*
* ******************************************************************** */
void Window::Clear(void)
{
MakeCurrent(); // make this window current
clrscr(); // ..then clear it
cursor_col = wherex(); // save cursor column..
cursor_row = wherey(); // ..and cursor row
}
/* ******************************************************************** *
*
* GotoXY -- position cursor in window
*
* ******************************************************************** */
void Window::GotoXY(int c, int r) // column and row
{
MakeCurrent(); // make this window current
gotoxy(c, r); // goto requested location
cursor_col = wherex(); // save cursor column..
cursor_row = wherey(); // ..and cursor row
}
/* ******************************************************************** *
*
* Close -- close window and restore screen
*
* ******************************************************************** */
void Window::Close(void)
{
if (NOT open_flag) // q. window already closed?
return; // a. yes .. just return
open_flag = 0; // clear opened flag
puttext(ul_col, ul_row, lr_col, lr_row, // restore old screen data
old_data); // ..from temp buffer
}
/* ******************************************************************** *
*
* ~Window -- destructor
*
* ******************************************************************** */
Window::~Window()
{
if (open_flag) // q. window still open?
Close(); // a. yes .. close window
last_window = 0; // clear window pointer
delete old_data; // de-allocate screen buffer
window(1, 1, 80, max_lines); // set whole screen as window
}
/* ******************************************************************** *
*
* MakeCurrent -- make this window current
*
* ******************************************************************** */
void Window::MakeCurrent(void)
{
if (last_window != this) // q. same window?
{
last_window = this; // a. no .. use this window
_wscroll = scroll_flag; // ..and set up scroll flag
if (border_flag == none) // q. any border?
window(ul_col, ul_row, // a. no .. set up window
lr_col, lr_row); // ..using entire area
else
window(ul_col + 1, ul_row + 1, // else .. set up the window
lr_col - 1, lr_row - 1); // ..allowing for the border
gotoxy(cursor_col, cursor_row); // ..and re-place cursor
textcolor(FG(cn_color)); // ..and set up foreground
textbackground(BG(cn_color)); // ..and background colors
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -