⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video.cpp

📁 国外网站上的一些精典的C程序
💻 CPP
字号:
// Implements a simple text video control class// public domain// by David L. Nugent <davidn@unique.blaze.net.au>// 3:632/348@fidonet// Implementation for 16 & 32-bit - MSDOS & OS/2#include "video.hpp"#include <string.h>#if defined(__EMX__)#define __OS2__#endif#if defined(__OS2__)#define INCL_VIO#define INCL_KBD#include <os2.h>#else# include <dos.h># include <bios.h># if defined(__386__)   // Note: assumes DOS4GW#  define vbios(r) int386(0x10,(r),(r))#  undef far#  define farstatic unsigned short * screenPtr = (unsigned short *)0xb8000;# else#  define vbios(r) int86(0x10,(r),(r))static unsigned short far * screenPtr = (unsigned short far *)MK_FP(0xb800,0);# endif#endif#define NO_VAL  cell_t(0xffffu)video::video()  : maxx(NO_VAL), maxy(NO_VAL),    curx(NO_VAL), cury(NO_VAL),    attr(7), fill(' '){  maxxy(maxx, maxy);  wherexy(curx, cury);}video::~video(){  putcursor();}voidvideo::cls(){  scroll(0, 0, NO_VAL, NO_VAL, NO_VAL, 1);}voidvideo::scroll(cell_t left, cell_t top, cell_t right, cell_t bottom, cell_t lines, char dir){#if defined(__OS2__)  BYTE cell[2] = { (BYTE)fill, (BYTE)attr };  if (dir)    VioScrollUp(top, left, bottom, right, lines, cell, 0);  else    VioScrollDn(top, left, bottom, right, lines, cell, 0);#else  union REGS r;  r.h.ah = (unsigned char)(dir ? 6 : 7);  r.h.al = (unsigned char)((lines == NO_VAL) ? 0 : lines);  r.h.bh = (unsigned char)attr;  r.h.bl = (unsigned char)fill;  r.h.ch = (unsigned char)top;  r.h.cl = (unsigned char)left;  r.h.dh = (unsigned char)((bottom == NO_VAL) ? (maxy-1) : bottom);  r.h.dl = (unsigned char)((right == NO_VAL) ? (maxx-1) : right);  vbios(&r);#endif}voidvideo::gotoxy(cell_t x, cell_t y){  cury = y;  curx = x;}voidvideo::putcursor(){  if (cury > maxy)  {    cell_t toscroll = cell_t(cury - maxy + 1);    scroll(0, 0, maxx, maxy, toscroll);    cury -= toscroll;  }#if defined(__OS2__)  VioSetCurPos(cury, curx, 0);#else  union REGS r;  r.h.ah = 2;  r.h.bh = 0;  r.h.dh = (unsigned char)cury;  r.h.dl = (unsigned char)curx;  vbios(&r);#endif}voidvideo::maxxy(cell_t & cols, cell_t & rows){  if (maxx == NO_VAL && maxy)  {#if defined(__OS2__)    VIOMODEINFO vm;    vm.cb = sizeof(vm);    VioGetMode(&vm, 0);    maxx = vm.col;    maxy = vm.row;#else    union REGS r;    r.x.ax = 0x0f00;    vbios(&r);    maxx = r.h.ah;    if (r.h.al == 7 || r.h.al == 15)# if defined(__386__)      screenPtr = (unsigned short *)(0xB000 << 4);# else      screenPtr = (unsigned short far *)MK_FP(0xB000,0);# endif    unsigned char far * p = (unsigned char far *)0x484;    maxy = *p;    if (!maxy)      maxy = 25;    else      ++maxy;#endif  }  cols = maxx;  rows = maxy;}voidvideo::wherexy(cell_t & x, cell_t & y){  if (curx == NO_VAL && cury == NO_VAL)  { // Only need to check this the once#if defined(__OS2__)    VioGetCurPos(&cury, &curx, 0);#else    union REGS r;    r.h.ah = 3;    r.h.bh = 0;    vbios(&r);    cury = r.h.dh;    curx = r.h.dl;#endif  }  x = curx;  y = cury;}voidvideo::put(register int ch){  putcursor();#if defined(__OS2__)  BYTE tmp[2];  tmp[0] = BYTE(ch);  tmp[1] = BYTE(attr);  VioWrtCellStr((PCH)tmp, 2, cury, curx, 0);#else  unsigned short far * ptr = screenPtr + (cury * maxx) + curx;  *ptr++ = (unsigned short)((ch & 0xff) | (attr << 8));#endif  adjustcursor(1);}voidvideo::put(char const * s){  putcursor();#if defined(__OS2__)  USHORT l = USHORT(strlen(s) * 2);  BYTE * tmp = new BYTE[l];  for (USHORT i = 0 ; i < l ;)  {    tmp[i++] = *s++;    tmp[i++] = BYTE(attr);  }  VioWrtCellStr((PCH)tmp, l, cury, curx, 0);  delete[] tmp;  l /= 2;#else  unsigned short far * ptr = screenPtr + (cury * maxx) + curx;  unsigned short l = (unsigned short) strlen(s);  for (unsigned short i = 0 ; i < l ; ++i)    *ptr++ = (unsigned short)((*s++ & 0xff) | (attr << 8));#endif  adjustcursor(l);}voidvideo::adjustcursor(cell_t cols, cell_t rows){  curx += cols;  rows += (curx / maxx);  curx  = cell_t(curx % maxx);  cury += rows;  gotoxy(curx, cury);}voidvideo::repchr(int ch, int n){#if defined(__OS2__)  USHORT l = USHORT(n * 2);  BYTE * tmp = new BYTE[l];  for (USHORT i = 0 ; i < l ;)  {    tmp[i++] = char(ch);    tmp[i++] = BYTE(attr);  }  VioWrtCellStr((PCH)tmp, l, cury, curx, 0);  delete[] tmp;#else  unsigned short far * ptr = screenPtr + (cury * maxx) + curx;  for (unsigned short i = 0 ; i < (unsigned short)n ; ++i)    *ptr++ = (unsigned short)((ch & 0xff) | (attr << 8));#endif  adjustcursor(cell_t(n));}unsigned shortvideo::getkey(){  putcursor();#if defined(__OS2__)  KBDKEYINFO K;  KbdCharIn(&K, IO_WAIT, 0);  return (unsigned short)((K.chScan << 8) | K.chChar);#else  return _bios_keybrd(_KEYBRD_READ);#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -