本文匯總了 C 語言中以字母 I 開頭的常用圖形、硬體存取、中斷處理及字串轉換函數,涵蓋 Borland Graphics Interface (BGI)、DOS 系統呼叫、硬體埠操作等領域,附完整語法、參數說明與實戰範例,供開發者快速查閱與學習。
功能:回傳儲存指定矩形區域位圖影像所需的位元組數,常搭配 getimage 與 malloc 實現影像快取與動畫。
原型:
unsigned far imagesize(int left, int top, int right, int bottom);
參數:left, top, right, bottom 定義矩形區域的左上與右下座標。
範例:繪製箭頭並以 XOR 模式移動製造動畫效果。
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define ARROW_SIZE 10
void draw_arrow(int x, int y);
int main(void) {
int gdriver = DETECT, gmode, errorcode;
void *arrow;
int x, y, maxx;
unsigned int size;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk) {
printf("Graphics error: %s\n", grapherrormsg(errorcode));
getch();
exit(1);
}
maxx = getmaxx();
x = 0;
y = getmaxy() / 2;
draw_arrow(x, y);
size = imagesize(x, y - ARROW_SIZE, x + 4 * ARROW_SIZE, y + ARROW_SIZE);
arrow = malloc(size);
getimage(x, y - ARROW_SIZE, x + 4 * ARROW_SIZE, y + ARROW_SIZE, arrow);
while (!kbhit()) {
putimage(x, y - ARROW_SIZE, arrow, XOR_PUT);
x += ARROW_SIZE;
if (x >= maxx) x = 0;
putimage(x, y - ARROW_SIZE, arrow, XOR_PUT);
}
free(arrow);
closegraph();
return 0;
}
void draw_arrow(int x, int y) {
moveto(x, y);
linerel(4 * ARROW_SIZE, 0);
linerel(-2 * ARROW_SIZE, -1 * ARROW_SIZE);
linerel(0, 2 * ARROW_SIZE);
linerel(2 * ARROW_SIZE, -1 * ARROW_SIZE);
}
功能:偵測或指定顯示卡驅動程式與模式,啟動 BGI 圖形環境。
原型:
void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver);
關鍵點:graphdriver 設為 DETECT 可自動偵測;pathtodriver 為驅動程式路徑(空字串表當前目錄)。初始化後必須檢查 graphresult() 確認是否成功。
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk) { /* 錯誤處理 */ }
line(0, 0, getmaxx(), getmaxy()); // 畫對角線測試
closegraph();
功能:從指定 I/O 埠讀取一字(16 位元)或一位元組(8 位元),用於底層硬體控制。
原型:
int inport(int portid); // 讀取字
int inp(int portid); // 讀取位元組
#include <dos.h>
#include <stdio.h>
int main(void) {
int port = 0x3F8; // COM1 資料埠
int val = inport(port);
printf("Port 0x%X = 0x%X\n", port, val);
return 0;
}
功能:在游標位置插入一空白行,原本該行及以下內容下移,最底行捲出視窗。
void insline(void);
#include <conio.h>
int main(void) {
clrscr();
cprintf("Line 1\r\nLine 2\r\nLine 3\r\n");
gotoxy(1, 2);
getch();
insline(); // 第 2 行變空白,原本第 2、3 行下移
getch();
return 0;
}
功能:將第三方或自行開發的 BGI 驅動程式加入驅動表,支援非標準顯示卡。
int far installuserdriver(char far *name, int (*detect)(void));
detect 函式回傳建議模式號或 grError。註冊後仍需呼叫 initgraph 初始化。
功能:安裝未內建於 BGI 的向量字型,供 settextstyle 使用。
int far installuserfont(char far *name);
int font = installuserfont("USER.CHR");
settextstyle(font, HORIZ_DIR, 4);
outtextxy(100, 100, "Custom Font");
功能:觸發指定中斷向量,傳入/傳出通用暫存器結構 REGS;int86x 額外支援段暫存器 SREGS(跨段呼叫)。
int int86(int intr_num, union REGS *in, union REGS *out);
int int86x(int intr_num, union REGS *in, union REGS *out, struct SREGS *seg);
範例:int86(0x10, ®s, ®s) 呼叫 BIOS 影片服務設定游標位置。
功能:直接呼叫 DOS 服務,intdosx 支援段暫存器,適合遠端指標檔案操作。
int intdos(union REGS *in, union REGS *out);
int intdosx(union REGS *in, union REGS *out, struct SREGS *seg);
範例:刪除檔案 (AH=0x41)。
功能:使用 REGPACK 結構完整存取所有暫存器與旗標,彈性最高。
void intr(int intr_num, struct REGPACK *preg);
功能:對開啟的裝置代碼發出控制指令,如查詢磁碟是否可移除。
int ioctl(int handle, int cmd, int *argdx, int argcx);
// 查詢預設磁碟機是否為可移除裝置
stat = ioctl(0, 8, 0, 0); // handle=0 (stdin), cmd=8
功能:檢查檔案代碼是否對應字元裝置 (如螢幕、印表機),而非區塊裝置 (磁碟檔)。
int isatty(int handle);
功能:將整數依指定基數 (2, 8, 10, 16…) 轉為以 null 結尾的字串。
char *itoa(int value, char *string, int radix);
char buf[20];
itoa(12345, buf, 16); // buf = "3039"
提示:上述函數多屬 Borland Turbo C / Borland C++ 專用擴充,現代跨平台開發建議改用標準 C 函式庫或平台獨立圖形庫 (SDL, OpenGL 等)。