在上一篇基礎上,引入鍵盤事件循環,實現按鍵切換面板可見狀態。關鍵點:
isshow[3] 狀態數組,記錄每個面板顯示(1)/隱藏(0)狀態。getch() 讀取按鍵,'1'/'2'/'3' 對應面板 0/1/2,'q' 退出。(++isshow[i]) % 2 實現 0↔1 翻轉,調用 show_panel() 或 hide_panel()。update_panels() + doupdate() 刷新顯示。#include\ \ int main() {\ WINDOW *my_wins[3];\ PANEL *my_panels[3];\ int lines = 10, cols = 40, y = 2, x = 4, i;\ int ch;\ int isshow[3] = {1, 1, 1}; // 初始全顯示\ \ initscr();\ cbreak();\ noecho();\ \ for (i = 0; i < 3; ++i) {\ my_wins[i] = newwin(lines, cols, y + i, x + i * 5);\ box(my_wins[i], 0, 0);\ }\ \ for (i = 0; i < 3; ++i) {\ my_panels[i] = new_panel(my_wins[i]);\ }\ \ update_panels();\ doupdate();\ \ while ((ch = getch()) != 'q') {\ switch (ch) {\ case '1':\ if ((++isshow[0]) % 2) show_panel(my_panels[0]);\ else hide_panel(my_panels[0]);\ break;\ case '2':\ if ((++isshow[1]) % 2) show_panel(my_panels[1]);\ else hide_panel(my_panels[1]);\ break;\ case '3':\ if ((++isshow[2]) % 2) show_panel(my_panels[2]);\ else hide_panel(my_panels[2]);\ break;\ }\ update_panels();\ doupdate();\ }\ \ endwin();\ return 0;\ }
啟動後顯示三個重疊窗口。按下 '2' 隱藏面板 1(中間層),面板 2(頂層)與面板 0(底層)直接相鄰,中間空出區域顯示底層內容或背景。

hide_panel 僅從棧中移除,窗口內容保留,再次 show_panel 可恢復原位置與順序。isshow 與面板實際可見性強綁定,避免邏輯與顯示不一致。update_panels 計算虛擬屏幕,doupdate 物理輸出,分離邏輯與渲染,減少閃爍。getch(),實時應用可用 nodelay(stdscr, TRUE) + napms() 實現非阻塞輪詢。set_panel_userptr)實現面板級上下文菜單、表單數據隔離。move_panel 實現窗口拖拽、最小化/最大化動畫。mousemask + getmouse)支持點擊標題欄切換、調整大小。動態面板控制是構建豐富 TUI 交互的基石,掌握顯示/隱藏、移動、層級管理,即可開發類桌面窗口管理器、多標籤編輯器、儀表盤等複雜終端應用。