滚动菜单在c ++中不起作用

时间:2018-04-14 07:36:39

标签: c++ winapi vector

这是我的滚动菜单的代码,它根据3个向量显示不同的值,welcomeMenuVector,menuOptionsVector和menuActionVector:

  

welcomeMenuVector - 保存标题功能

     

menuOptionsVector - 保存滚动菜单的菜单选项

     

menuActionsVector - 保存选择菜单选项后要执行的功能

vector<string> menuOptionsVector;
vector<function<void()>> menuActionsVector;
vector<function<void()>> welcomeMenuVector;

void scrollingMenu(){
    ShowConsoleCursor(false);

    int pointer = 0;

    while (true){
        system("cls");

        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);

        welcomeMenuVector[0]();

        for (unsigned int i = 0; i < menuOptionsVector.size(); ++i){
            if (i == pointer){
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14); 
                cout << center("> " + menuOptionsVector[i] + " <" ,getWindowWidth()) <<endl;
            }
            else{
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
                cout << center("  " + menuOptionsVector[i] + "  ", getWindowWidth()) << endl;
            }
        }

        while (true){
            if (GetAsyncKeyState(VK_UP) != 0){
                pointer -= 1;

                if (pointer == -1){
                    pointer = menuOptionsVector.size() - 1;
                }
                break;
            }
            else if (GetAsyncKeyState(VK_DOWN) != 0){
                pointer += 1;

                if (pointer == menuOptionsVector.size()){
                    pointer = 0;
                }
                break;
            }
            else if (GetAsyncKeyState(VK_RETURN) != 0){ //when enter key is pressed
                menuActionsVector[pointer]();
            }
        }
        Sleep(100);
    }
}

在我需要调用 scrollingMenu()之前,我需要在向量中输入菜单标题,菜单选项和菜单功能。因此,在将值输入到向量之前,我必须清除所有3个向量,因为内部会有值,因为它可能会被更早的其他菜单使用。

这是我的主页面,用户页面和添加用户页面:

void mainPage(){
    clearMenuVectors();

    welcomeMenuVector = { [](){mainPageWelcome(); } };

    menuOptionsVector = { "Login", "Exit" };

    menuActionsVector = {
        [](){ userPage(); },
        [](){ exit(0); }
    };

    scrollingMenu();
}

void userPage(){
    clearMenuVectors();

    welcomeMenuVector = { [](){userPageWelcome(); } };

    menuOptionsVector = { "Add User", "Update User", "Delete User", "Exit" };

    menuActionsVector = {
        [](){ addUsers(); },
        [](){ updateUsers(); },
        [](){ deleteUsers(); },
        [](){ exit(0); }
    };

    scrollingMenu();
}

void addUsers(){

    clearMenuVectors();

    welcomeMenuVector = { [](){cout << center("Which type of user would you like to add?", getWindowWidth()) << endl;; } };

    menuOptionsVector = { "Add Admin", "Add Scheduler", "Add Professional", "Exit" };

    menuActionsVector = {
        [](){ /*addUser();*/ },
        [](){ /*updateUsers();*/ },
        [](){ /*deleteUsers();*/ },
        [](){ exit(0); }
    };
}

我的主页首先工作正常,我能够向上移动在点击进入登录菜单选项后,它会转到用户页面,但是当我在 userPage <时出现问题/ strong>,我仍然可以看到 userPage 的菜单选项,但是当我向上/向下移动时,它会改变 addUsers 的菜单选项(我还没有#39) ;甚至点击输入),即使我没有向上/向下移动我点击添加用户选项,没有任何反应,我不知道这里有什么问题。

1 个答案:

答案 0 :(得分:1)

如果你改变了

 [](){ /*addUser();*/ },

要      {cout&lt;&lt; “添加用户选项1”&lt;&lt; ENDL; },

然后连续写入,然后按下键。

GetAsyncKeyState

  

密钥当前是上升还是下降。如果最重要的一点   设置,键是关闭,如果设置了最低有效位,则   在上一次调用GetAsyncKeyState之后按下了键。

所以你需要检查最低有效位。在这种情况下

if (GetAsyncKeyState(VK_RETURN) != 0)

应该是

if (GetAsyncKeyState(VK_RETURN) & 0x1)