可惜的是,現在的WIN系統不能用這種方法了
http://140.117.11.2/txtVersion/treasure/asciiart/M.855729367.D/M.1006196873.A/M.1006196926.B.html
發信人: ufo (碼賽克之王) 看板:asciiart
日期: Mon Apr 22 17:00:29 1996
標題: 轉貼ANSI制做
ANSI 的使用方法
一.首先要先把 ANSI.SYS 裝置到 CONFIG.SYS
例.
A>TYPE CONFIG.SYS
DEVICE = ?:\WINDOWS\system32\ANSI.SYS
└──────>? 為磁碟機路徑
二.ANSI 的指令
I.游標控制
┌──────┬──────────────────────────────┐
│控 制 碼 │ 說 明 │
├──────┼──────────────────────────────┤
│[X;Yf │ 將游標移至第 X 列(line),第 Y 行(Column)的位置 │
│[X;YH │ │
├──────┼──────────────────────────────┤
│[nA │ 游標上移 n 列(line),<已至螢幕頂端則無效> │
├──────┼──────────────────────────────┤
│[nB │ 游標下移 n 列(line),<已至螢幕底端則無效> │
├──────┼──────────────────────────────┤
│[nC │ 游標向右移 n 列(line),<已至螢幕最右則無效> │
├──────┼──────────────────────────────┤
│[nD │ 游標向左移 n 列(line),<已至螢幕最左則無效> │
├──────┼──────────────────────────────┤
│[6n │ 報告游標位置 │
├──────┼──────────────────────────────┤
│[s │ 保存目前游標位置 │
├──────┼──────────────────────────────┤
│[u │ 取出保存的游標位置來使用 │
└──────┴──────────────────────────────┘
II.螢幕控制
┌──────┬──────────────────────────────┐
│控 制 碼 │ 說 明 │
├──────┼──────────────────────────────┤
│[2J │ 清除螢幕<功能和 DOS 的 CLS 命令相同> │
├──────┼──────────────────────────────┤
│[K │ 將游標位置開始至本列結束的所有字元清除 │
└──────┴──────────────────────────────┘
III.顯示字元屬性控制
┌──────┬──────────────────────────────┐
│控 制 碼 │ [n1;n2;.......m │
├──────┼──────────────────────────────┤
│說 明 │ 1)設定顯示字元的屬性狀態 │
│ │ 2)若有兩個以上的屬性狀態要設定則以分號將代碼 │
│ │ 即( n1; n2; .......)隔開 │
│ │ 3)除非重新設定,否則原設定之屬性會一直被保留 │
└──────┴──────────────────────────────┘
┌──────┬──────────────────────────────┐
│代 碼 │ 意 義 │
├──────┼──────────────────────────────┤
│ 0 │ 所有屬性 OFF , 即返回正常顯示模式 (Normal) │
│ 1 │ 高亮度顯示 (Bright) │
│ 4 │ 加上底線 (Underline) │
│ 5 │ 閃爍顯示 (Flach) │
│ 7 │ 反白顯示 (Inverse) │
│ 8 │ 不可見 (Invisable) │
└──────┴──────────────────────────────┘
┌─────────────────────────────────────┐
│ < 底下之代碼僅適用於彩色顯示的系統 > │
│ 30 40 黑色 │
│ 31 41 紅色 │
│ 32 42 綠色 │
│ 33 43 黃色 │
│ 34 44 藍色 │
│ 35 45 紫紅色 │
│ 36 46 青藍色 │
│ 37 47 白色 │
│ │
│ < 30 - 37 為前景顏色, 40 - 47 為背景顏色 > │
└─────────────────────────────────────┘
IV.重訂鍵盤
┌──────┬──────────────────────────────┐
│ 控 制 碼 │ 說 明 │
├──────┼──────────────────────────────┤
│[n;mp │ 將 ASCII 碼為 n的鍵改為 ASCII 碼 m │
│[n;'字串';mp│ 將 ASCII 碼為 n的鍵改為字串加上 ASCII 碼 m之字元 │
│ │ (通常 m為控制字元之 ASCII 碼) │
└──────┴──────────────────────────────┘
〔1989,01,24 by TULAMAN Sysop : Tome Tsaur〕 取自於 雜誌
-------------------------------------------------------------------------
使 用 ANSI 命 令 來 控 制 螢 幕
-------------------------------------------------------------------------
認 識 ANSI.....
ANSI.SYS 是 一 種 被 稱 為 " 可 以 安 裝 的 驅 動 程 式 "
在 任 何 系 統 下 均 可 用 來 控 制 螢 幕.在 程 式 中 使 用
ANSI.SYS 連 續 命 令 所 產 生 的 輸 出,就 如 同 在 任 何 系 統 之
下 實 際 所 產 生 的 一 樣 理 想 ( 至 少 在 每 個 系 統 下, ANSI.SYS
均 應 被 安 裝 ).
當 然,有 些 人 認 為 ANSI.SYS 執 行 得 太 慢;它 不 能 你 所 稱 的
視 窗 系 統 (windowing systems) 相 提 並 論.但 是 不 管 你 是 否 喜
歡,ANSI.SYS 是 程 式 撰 寫 員 的 一 個 工 具,ANSI.SYS 可 能 不 是 一
個 期 盼 中 最 偉 大 的 工 具,但 它 卻 是 一 個 最 基 本 的 使 用 工
具.
大 致 來 說,使 用 ANSI.SYS 是 非 常 容 易 的.當 安 裝 好 之 後
( 從 CONFIG.SYS 檔 案 中 設 "DEVICE=ANSI.SYS" ),它 會 去 搜 尋 一
組 特 殊 的 字 元,這 組 字 元 就 如 同 一 個 信 號,告 之 後 面 的 字
元 或 字 元 組 此 為 一 個 命 令,然 後 它 會 將 這 組 特 輸 字 元 加
以 取 代,加 入 一 些 適 當 的 命 令 字 元,將 其 放 在 螢 幕 適 當 的
位 置.在 ANSI.SYS 驅 動 程 式 中,僅 僅 包 括 了 一 個 MS-DOS 的 信
號,即 是 " ESC " (XIB) 及 "[" 的 組 合.當 這 組 字 元 被 依 序 送 到
標 準 輸 出 系 統 時,ANSI.SYS 就 會 知 道 有 些 事 情 將 會 發 生 .
-----------------------------------------------------------------------
ANSI 提供下列的服務 :
┌────────────────────┐
∣ ★ 游標移動 (上 /下 /前 /後) ∣
∣ ∣
∣ ★ 任意移動游標位置 ∣
∣ ∣
∣ ★ 報告游標位置 ∣
∣ ∣
∣ ★ 儲存及取出游標位置 ∣
∣ ∣
∣ ★ 清除螢幕或一行文字 ∣
∣ ∣
∣ ★ 顯示模組的控制 ∣
└────────────────────┘
表一: ANSI.SYS 命令表
-----------------------------------------------------------------------
| 名稱 | 功 能 | 命 令 | 說 明 |
-----------------------------------------------------------------------
| CUP | 設定游標位置 | #1;#2H | |
-----------------------------------------------------------------------
| HVP | 水平與垂直位置 | #1;#2f | #1 表示行 ; #2 表示列 |
-----------------------------------------------------------------------
| CUU | 游標上移 | #A | |
-----------------------------------------------------------------------
| CUD | 游標下移 | #B | |
-----------------------------------------------------------------------
| CUF | 游標前移 | #C | |
-----------------------------------------------------------------------
| CUB | 游標後移 | #D | # 多少個位置(前後左右)要移動 |
-----------------------------------------------------------------------
| DSR | 狀態報告 | 6n | 在鍵盤緩衝區中會有一個如下格式 |
| | | | 的字串ESC[##;##R以及一個CR符號 |
| | | | , 可以用getch() 來取得它 |
-----------------------------------------------------------------------
| SCP | 儲存游標位置 | S | |
-----------------------------------------------------------------------
| RCP | 恢復游標位置 | u | (唯有游標先被儲存,才可以恢復游 |
| | | | 標.連續的儲存游標,後儲存的游 |
| | | | 標位置將蓋掉先儲存的游標位置) |
-----------------------------------------------------------------------
| ED | 清除螢幕 | 2J | 清除螢幕;移動游標到左上角 |
-----------------------------------------------------------------------
| EL | 清除一行文字 | K | 將剩餘一行的文字變成空白;游標 |
| | | | 移動 |
-----------------------------------------------------------------------
| SGR | 設定繪圖解說 | #;,,,l#m| 可接受多個數字參數.設定現在螢幕 | |
| | | | 顏色的屬性 (請參閱例題) |
-----------------------------------------------------------------------
| SM | 設定模組 | =#h | |
-----------------------------------------------------------------------
| RM | 重新設定模組 | =#l | #表示顯示模組(0~6).在SM中使用 |
| | | | 模組7 表示字的捲回是允許的.在 |
| | | | RM中使用模組7表示字的捲回是不 |
| | | | 允許的 |
-----------------------------------------------------------------------
命 令 與 格 式 <-----------
▔▔▔▔▔▔▔
這 些 命 令 是 憑 藉 著 "escape sequences" 發 送 出 來
的 , 其 格 式 如 " <ESC>[<參數><命令字元> ". 舉 個 例 子
, 要 將 游 標 移 動 到 某 一 特 定 的 行 與 列 ,所 使 用 的 命 令 字
元 為 "H" , 因 此 ANSI.SYS 要 將 游 標 移 動 到 螢 幕 上 第 16 行 ,
第 10 列 位 置 的 命 令 是 "ESC[16;10H" (後 面 可 以 放 置 你 所 要
印 出 的 字 串 或 字 元) . 若 是 沒 有 參 數 , 其 格 式 也 是 一 樣
的.例 如 要 清 除 現 在 游 標 所 佔 的 那 一 行 , 你 可 以 使 用 命
令 字 元 "K" 如 下 : " ESC[K " . ( 有 幫 助 的 暗 示:ANSI.SYS 對
大 寫 英 文 字 及 小 寫 英 文 字 有 不 同 的 反 應 , 因 此 命 令 字
元 "H" 與 "h" 是 完 全 不 同 的 !)
表 一 所 顯 示 的 是 全 部 的 ANSI.SYS 命 令 ( 請 注 意 , " EXC[ "
組 合 字 元 要 放 在 每 一 個 命 令 的 前 面 ).
所 有 ANSI.SYS 命 令 , 都 可 以 放 在 C 的 巨 集 指 令 內,而 這 些
巨 集 指 令 可 以 放 在 一 個 include 檔 案 內.例 1. (ANSI.H) 顯 示 這
些 巨 集 指 令 如 何 被 完 成.它 們 是 從 Augie Hansen 的 Proficient C
這 本 書 中 所 摘 錄 下 來 的.
功 能 程 式 應 用 <----------
▔▔▔▔▔▔▔▔▔
以 下 提 供 兩 個 有 用 的 功 能 程 式 在 "例 2." (ANSISTUF.C) 中 ,
get_cur_pos() 程 式 會 將 現 在 游 標 的 位 置 傳 遞 給 呼 叫 程 式
以 及 如 何 去 使 用 ANSI_DSR 的 巨 集 指 令; ansi_installed() 程 式
會 測 試 ANSI.SYS 是 否 已 經 安 裝 好 了.
你 可 能 已 經 注 意 到 即 定 (default) 的 ANSI.SYS 顏 色 號 碼 和
IBM的 標 準 顏 色 號 碼 有 所 不 同 , 不 用 擔 心 , 當 你 使 用 ANSI.SYS
命 令 時 , ANSI.H 中 的 顏 色 號 碼 將 會 產 生 你 所 期 望 的 顏 色 .
你 可 以 在 ANSI.SGR 程 式 中 選 擇 顯 示"字"的 顏 色 屬 性.
例一 :
▔▔▔
/* ANSI.H */
/*
Description : Macro definitions for terminal control using ANSI.SYS.
Includes both cursor positioning and color control.
Author : Augie Hansen (From "Proficient C", Microsoft Press)
Application : IBM PC or compitable with turbo C
Published in : TUG Line - Turbo User Group. Box 1510, Poulsbo, WA 98370
*/
/* cursor position */
#define ANSI_CUP(r, c) printf("\x1b[%d;%dH", r, c)
#define ANSI_HVP(r, c) printf("\x1B[%d;%df", r, c)
/* cursor up, down, forward, back */
#define ANSI_CUU(n) printf("\x1B[%dA", n)
#define ANSI_CUD(n) printf("\x1B[%dB", n)
#define ANSI_CUF(n) printf("\x1B[%dC", n)
#define ANSI_CUB(n) printf("\x1B[%dD", n)
/* device status report (puts pos'n data in stdin buffer) */
#define ANSI_DSR printf("\x1B[6n")
/* save and restore cursor position */
#define ANSI_SCP printf("\x1B[6s")
#define ANSI_RSP printf("\x1B[6u")
/* erase display and line */
#define ANSI_ED printf("\x1B[2J")
#define ANSI_EL printf("\x1B[K")
/* set graphic rendition */
#define ANSI_SGR(a) printf("\x1B[%dm",a)
/* set and reset modes */
#define ANSI_SM(m) printf("\x1B[=%dh",m)
#define ANSI_RM(m) printf("\x1B[=%dl",m)
/* ANSI color codes */
/* special settings */
#define NORMAL 0
#define BRIGHT 1
#define BLINK 5
#define REVERSE 7
#define INVISIBLE 8
/* basic colors */
#define BLACK 0
#define RED 1
#define GREEN 2
#define BROWN 3
#define BLUE 4
#define MAGENTA 5
#define CYAN 6
#define WHITE 7
/* shift values */
#define FOREGROUND 30
#define BACKGROUND 40
/* video modes for SM and RM */
#define MONO40 0
#define COLOR40 1
#define MONO80 2
#define COLOR80 3
#define MRESCOLOR 4
#define MRESMONO 5
#define MRESMONO 6
#define WORDWRAP 7
----------------------------------------------------------------------
例二 :
▔▔▔
/* ANSISTUF.C */
/*
Description : Routines to return the cursor position as an integer
to the keyboard buffer, and to determine if the ANSI.SYS
driver has been installed. Uses the macros defined in
ANSI.H.
Author : Tim Gentry
Date : 2/2/88
Application : IBM PC or compatible with Turbo C
Published in : TUG Lines - Turbo User Group. Box 1510, Poulsbo, WA 98370
*/
void get_cur_pos (row, col)
int *row. *col;
{
/* ANSI_DSR puts the current cursor position into */
/* the keyboard buffer (stoin) in the format */
/* <esc>[##;##R<cr> */
/* we therefore need to screen out the characters */
/* <esc>, [, ;, R, and <cr>. */
ANSI_DSR; /* request cursor info */
getch(); /* trash the <esc> */
getch(); /* trash the [ */
*row = 10 * (getch() - '0');
*row = *row + (getch() - '0');
getch(); /* trash the ; */
*col = 10 * (getch() - '0');
*col = *col + (getch() - '0');
getch(); /* trash the R */
getch(); /* trash the <cr> */
return;
}
int ansi_installed()
{
#define TROW 10
#define TCOL 79
/* determines if ANSI.SYS is installed by calling */
/* ANSI_CUP to position cursor at row 10, col 79, */
/* then using the bios video services (hex 10)to get */
/* the current video position. If it's equal to 10, */
/* 79 then ANSI.SYS is installed, else it's not. */
/* returns 1 if installed, 0 if not. */
union REGS inregs, outregs;
ANSI_CUP(TROW, TCOL);
inregs.h.ah = 15; /* get video state */
int86(0x10, &inregs, &outregs); /* do the interrupt */
inregs.h.ah = 3; /* 3 = get cur pos */
inregs.h.ah = outregs.h.bh /* video page number */
int86(0x10, &inregs, &outregs); /* do the interrupt */
if (outregs.h.dl !=TCOL - 1
|| outregs.h.dh !=TROW - 1) /* do the interrupt */
return (0);
else
return (1);
}
-----------------------------------------------------------------
....................over..................
如有錯誤,請多指教.... \\///
o[O-O]o
_
沒有留言:
張貼留言