簡體   English   中英

C ++中的圖形菜單

[英]Graphics Menu in c++

我正在做一個項目,我想制作一個圖形菜單。 我面臨的問題是,在它顯示在我放入 switch 的函數中寫入的任何文本之后。 它返回到主菜單。 我想做一個保留在新功能上的功能,一旦它指向新功能,它就不再與主菜單有關。 直到再次調用該函數。

我希望它是一個簡單的菜單功能,指導我運行。 沒有其他的。

你的幫助意味着分配! 提前致謝。

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<iomanip>
#include<fstream>
#include<windows.h>

using namespace std;


int main() {

    system("cls");
    string Menu[3] = { "                Admin", "               Customer", "                Exit" };
    int pointer = 0;
    bool flag=true;

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

        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
        cout << "Main Menu\n\n";

        for (int i = 0; i < 3; ++i)
        {
            if (i == pointer)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
                cout << Menu[i] << endl;
            }
            else
            {
                SetConsoleTextAttribute ( GetStdHandle ( STD_OUTPUT_HANDLE), 15);
                cout << Menu[i] << endl;
            }
        }

        while (true)
        {
            if (GetAsyncKeyState(VK_UP) != 0)
            {
                pointer =pointer-1;
                if (pointer == -1)
                {
                    pointer = 2;
                }
                break;
            }
            else if (GetAsyncKeyState(VK_DOWN) != 0)
            {
                pointer += 1;
                if (pointer == 3)
                {
                    pointer = 0;
                }
                break;
            }
            else if (GetAsyncKeyState(VK_RETURN) != 0)
            {

                switch (pointer)
                {
                case 0:
                {
                    admin_login();
                    Sleep(500);
                    break;
                }
                case 1:
                {
                    customer_sign();
                    Sleep(500);
                    break;
                }
                case 2:
                {
                    thank_you();
                    Sleep(800);
                    break;
                }
                default:
                    {
                        cout<<"Invalid Input! ";
                    }

                }

            }
        }

        Sleep(150);
    }

    return 0;
    }

您的“標志”布爾值需要作為兩個 while 循環的條件進行檢查,而不僅僅是第一個。 當您在菜單選擇上按 Enter 鍵時,您還需要清除控制台。

在檢測到按鍵按下后,在開關盒內,在每種情況下,您都需要將標志布爾值設置為 false,以便停止繪制主菜單,而是開始繪制子菜單。 我無權訪問您的其他功能,因此這里有一個解決方案,以簡化且可重現的概念證明來模擬該行為:

#include<windows.h>
#include <iostream>

using namespace std;

int main() 
{
    system("cls");
    string Menu[3] = { "                Admin", "               Customer", "                Exit" };
    int pointer = 0;
    bool bMainMenu = true;

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

        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
        cout << "Main Menu\n\n";

        for (int i = 0; i < 3; ++i)
        {
            if (i == pointer)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
                cout << Menu[i] << endl;
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
                cout << Menu[i] << endl;
            }
        }

        while (bMainMenu)
        {
            if (GetAsyncKeyState(VK_UP)&1)
            {
                pointer = pointer - 1;
                if (pointer == -1)
                {
                    pointer = 2;
                }
                break;
            }
            else if (GetAsyncKeyState(VK_DOWN)&1)
            {
                pointer += 1;
                if (pointer == 3)
                {
                    pointer = 0;
                }
                break;
            }
            else if (GetAsyncKeyState(VK_RETURN)&1)
            {
                switch (pointer)
                {
                case 0:
                {
                    //admin_login();
                    system("cls");
                    std::cout << "admin selected\n";
                    Sleep(1000);
                    bMainMenu = false;
                    break;
                }
                case 1:
                {
                    //customer_sign();
                    system("cls");
                    std::cout << "customer selected\n";
                    Sleep(1000);
                    bMainMenu = false;
                    break;
                }
                case 2:
                {
                    //thank_you();
                    system("cls");
                    std::cout << "thank you selected\n";
                    Sleep(1000);
                    bMainMenu = false;
                    break;
                }
                default:
                {
                    cout << "Invalid Input! ";
                }
                }
            }
        }
        Sleep(150);
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM