WINDOW.CPP
资源名称:commutil.zip [点击查看]
上传用户:xr_qian
上传日期:2007-01-05
资源大小:443k
文件大小:14k
源码类别:
通讯/手机编程
开发平台:
DOS
- // ******************************************************************** //
- // //
- // WINDOW.CPP //
- // Copyright (c) 1993, Michael Holmes and Bob Flanders //
- // C++ Communication Utilities //
- // //
- // 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
- }
- }