核心概念
- 窗口:屏幕上可獨立操作的矩形區域,可重疊、可嵌套子窗口
- 標準屏幕:
stdscr,佔據整個終端的默認窗口
- 虛擬屏幕:內存中的顯示緩衝區,
wnoutrefresh 寫入,doupdate 刷新到物理屏幕
3.1 窗口創建與銷毀
| 函數 | 原型 | 關鍵參數 | 說明 |
newwin | WINDOW* newwin(int lines, int cols, int begin_y, int begin_x) | 行數、列數、左上角座標 | 創建主窗口,0 表示最大可用尺寸 |
delwin | int delwin(WINDOW* win) | 窗口指針 | 刪除窗口並釋放內存,必須先刪子窗口 |
subwin | WINDOW* subwin(WINDOW* win, int lines, int cols, int begin_y, int begin_x) | 父窗口、尺寸、相對標準屏幕座標 | 創建子窗口,共享父窗口內存區域 |
derwin | WINDOW* derwin(WINDOW* win, int lines, int cols, int begin_y, int begin_x) | 父窗口、尺寸、相對父窗口座標 | 創建派生窗口,邏輯上屬於父窗口 |
清屏 vs 釋放:werase()/wclear() 僅清內容,delwin() 才釋放內存。
3.2 窗口輸入輸出操作
光標與字符輸出
| 函數 | 功能 | 合併版 |
wmove | 移動光標到窗口相對座標 | - |
waddch | 當前位置輸出單字符 | mvwaddch(win, y, x, ch) |
waddstr | 當前位置輸出字符串 | mvwaddstr(win, y, x, str) |
wprintw | 格式化輸出 | - |
輸入操作
| 函數 | 功能 | 合併版 |
wgetch | 獲取單字符輸入 | mvwgetch(win, y, x) |
wgetstr | 獲取字符串輸入 | mvwgetstr(win, y, x, str) |
wscanw | 格式化掃描輸入 | mvwscanw(win, y, x, fmt, ...) |
編輯操作
| 函數 | 功能 |
winsch/mvwinsch | 插入字符 |
winsertln | 插入一行 |
wdelch/mvwdelch | 刪除字符 |
wdeleteln | 刪除一行 |
清屏與屬性
| 函數 | 功能 |
wclear | 清窗口並移動光標到 (0,0) |
werase | 清窗口內容,光標不動 |
wclrtoeol | 清除到行尾 |
wclrtobot | 清除到窗口底部 |
wstandout/wstandend | 高亮開/關 |
wattrset/wattroff/wattron | 屬性設置/關閉/開啟 |
窗口間復制
| 函數 | 特性 | 空字符處理 |
overlay | 非破壞性 | 不復制空字符,目標原字符保留 |
overwrite | 破壞性 | 復制所有內容含空字符 |
copywin | 區域復制 | 可控制是否破壞性 |
3.3 窗口刷新機制
// 雙緩衝刷新:高性能、無閃爍
wnoutrefresh(win1); // 將窗口1寫入虛擬屏幕
wnoutrefresh(win2); // 將窗口2寫入虛擬屏幕
doupdate(); // 統一刷新到物理屏幕
// 等價單步
wrefresh(win); // wnoutrefresh + doupdate
// 重繪
redrawwin(win); // 重繪整個窗口
wredrawln(win, beg, num); // 重繪指定行範圍
3.4 窗口屬性與裝飾
| 函數 | 功能 |
mvwin | 移動窗口位置(需後續 wrefresh) |
touchwin | 激活窗口獲取焦點(重疊時) |
box | 繪製簡易邊框(ACS_VLINE, ACS_HLINE) |
border | 繪製完整邊框(8 個方向字符可控) |
hline/whline | 繪製橫線 |
vline/wvline | 繪製豎線 |
leaveok/scrollok/clearok | 設置窗口標誌位 |
3.5 屏幕轉存/恢復
| 函數 | 功能 |
putwin | 窗口數據寫入 FILE* |
getwin | 從 FILE* 恢復窗口 |
scr_dump | 標準屏幕存檔 |
scr_restore | 標準屏幕恢復 |
本文整理自「暗日」博客,原文地址:https://darksun.blog.51cto.com/3874064/1297283