首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

NCURSES 面板動態控制:鍵盤交互實現面板顯示/隱藏切換

     編輯:關於C

交互式面板控制核心邏輯

在上一篇基礎上,引入鍵盤事件循環,實現按鍵切換面板可見狀態。關鍵點:

  • 維護 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(底層)直接相鄰,中間空出區域顯示底層內容或背景。
隱藏面板1後效果

關鍵技術細節

  1. 面板隱藏不銷毀:hide_panel 僅從棧中移除,窗口內容保留,再次 show_panel 可恢復原位置與順序。
  2. 狀態數組同步:isshow 與面板實際可見性強綁定,避免邏輯與顯示不一致。
  3. 雙緩衝刷新機制:update_panels 計算虛擬屏幕,doupdate 物理輸出,分離邏輯與渲染,減少閃爍。
  4. 輸入非阻塞可選:示例使用阻塞 getch(),實時應用可用 nodelay(stdscr, TRUE) + napms() 實現非阻塞輪詢。

擴展思路

  • 綁定用戶數據(set_panel_userptr)實現面板級上下文菜單、表單數據隔離。
  • 結合 move_panel 實現窗口拖拽、最小化/最大化動畫。
  • 集成鼠標事件(mousemask + getmouse)支持點擊標題欄切換、調整大小。

動態面板控制是構建豐富 TUI 交互的基石,掌握顯示/隱藏、移動、層級管理,即可開發類桌面窗口管理器、多標籤編輯器、儀表盤等複雜終端應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved