C++控制台应用菜单选项选中状态实时显示功能实现问询
以下是可直接运行的实现代码,完全匹配你需要的功能:
#include <iostream> #include <Windows.h> int main() { // 存储各选项状态,false=OFF,true=ON bool appStatus = false; bool optionStates[8] = {false}; // 对应NUMPAD1到NUMPAD8的8个选项 while (true) { // 清屏,准备重绘菜单 system("cls"); // 绘制菜单布局 std::cout << "--------------------------------------------------\n"; std::cout << " Console Menu \n"; std::cout << " Subtitle for Menu \n"; std::cout << "--------------------------------------------------\n"; std::cout << "\nAuthor: John Doe\n"; // 动态输出状态 std::cout << "APP STATUS:\t\t\t->" << (appStatus ? "ON" : "OFF") << "<-\n"; std::cout << "[NUMPAD1] Option 1\t\t->" << (optionStates[0] ? "ON" : "OFF") << "<-\n"; std::cout << "[NUMPAD2] Option 2\t\t->" << (optionStates[1] ? "ON" : "OFF") << "<-\n"; std::cout << "[NUMPAD3] Option 3\t\t->" << (optionStates[2] ? "ON" : "OFF") << "<-\n"; std::cout << "[NUMPAD4] Option 4\t\t->" << (optionStates[3] ? "ON" : "OFF") << "<-\n"; std::cout << "[NUMPAD5] Option 5\t\t->" << (optionStates[4] ? "ON" : "OFF") << "<-\n"; std::cout << "[NUMPAD6] Option 6\t\t->" << (optionStates[5] ? "ON" : "OFF") << "<-\n"; std::cout << "[NUMPAD7] Option 7\t\t->" << (optionStates[6] ? "ON" : "OFF") << "<-\n"; std::cout << "[NUMPAD8] Option 8\t\t->" << (optionStates[7] ? "ON" : "OFF") << "<-\n"; std::cout << "[INSERT] Exit\n"; std::cout << "--------------------------------------------------\n"; // 按键检测逻辑 // 小键盘1到8对应切换选项1到8 if (GetAsyncKeyState(VK_NUMPAD1) & 0x8000) { optionStates[0] = !optionStates[0]; Sleep(200); // 防抖,避免单次按压触发多次切换 } if (GetAsyncKeyState(VK_NUMPAD2) & 0x8000) { optionStates[1] = !optionStates[1]; Sleep(200); } if (GetAsyncKeyState(VK_NUMPAD3) & 0x8000) { optionStates[2] = !optionStates[2]; Sleep(200); } if (GetAsyncKeyState(VK_NUMPAD4) & 0x8000) { optionStates[3] = !optionStates[3]; Sleep(200); } if (GetAsyncKeyState(VK_NUMPAD5) & 0x8000) { optionStates[4] = !optionStates[4]; Sleep(200); } if (GetAsyncKeyState(VK_NUMPAD6) & 0x8000) { optionStates[5] = !optionStates[5]; Sleep(200); } if (GetAsyncKeyState(VK_NUMPAD7) & 0x8000) { optionStates[6] = !optionStates[6]; Sleep(200); } if (GetAsyncKeyState(VK_NUMPAD8) & 0x8000) { optionStates[7] = !optionStates[7]; Sleep(200); } // 按INSERT退出 if (GetAsyncKeyState(VK_INSERT) & 0x8000) { break; } // 降低循环占用,不用一直满速跑 Sleep(10); } return 0; }
实现说明
- 状态存储:用bool类型变量存储APP总状态,bool数组存储8个功能选项的开关状态,初始默认都为OFF
- 动态渲染:采用「清屏+重绘」的逻辑,每次循环先清空当前控制台内容,再根据最新的状态值重新绘制完整菜单,通过三目运算符
条件 ? 真值 : 假值动态切换ON/OFF显示 - 按键监听:使用Windows原生API
GetAsyncKeyState异步检测按键状态,返回值和0x8000做与运算为真时表示对应按键处于按下状态,此时翻转对应状态变量即可 - 防抖处理:每次检测到按键触发后调用
Sleep(200),避免单次按键被识别为多次触发;循环末尾加10ms延迟降低CPU占用 - 注意:本实现仅适用于Windows平台,依赖Windows.h提供的虚拟键码定义和API接口
内容的提问来源于stack exchange,提问作者Ryan Medrano
相关产品推荐
相关产品推荐

