Tạo một menu trực quan, sinh động bằng C/C++

Bạn đã chán với kiểu nhập sô để chọn Menu
menu
menu


Bài viết sẽ giúp bạn tạo một Menu một cách bắt mắt, dễ nhìn, sinh động hơn.
menu
menu
Hoạt động: Ta thao tác chọn menu bằng cách nhấn các phím di chuyển ↑, ↓, ←, →; nhấn Enter để chọn menu; ESC để thoát.
Mình sẽ giải thích dần đần đoạn code trên(ai biết rồi thì thôi nhé :D)
Đầu tiên, lệnh nhảy tọa độ màn hình:
1
gotoxy(a,b);
Cái này search google ra một lố rồi. Nên nhớ: a – hoành độ, b – tung độ, cần có thư viện windows.h nữa.
Tiếp, hàm move() tự động bắt sự kiện được gõ từ bàn phím rồi trả về giá trị của kí tự vừa được gõ. Khi ta nhấn một phím bất kì thì kí tự đó sẽ được nạp vào mà không cần nhấn Enter.
Đọc thêm: Đọc kí tự từ bàn phím không cần nhấn enter
Tiếp, class Menu để lưu các Item trong menu. Ở đây, mình tạo mặc định menu đơn giản của một trò chơi, từ khung đó bạn có thể tạo thêm các menu khác theo ý mình.
Trong main, có một lệnh cần chú ý:
1
kbhit();// <conio.h>
Lệnh kbhit() có trả về kiểu bool trả lời câu hỏi “Có kí tự bất kì nào được nhập từ bàn phím không?”.
Khi có kí tự bất kì nhập vào từ bàn phím, kí tự đó sẽ được ghi vào bộ nhớ đệm, câu lệnh
1
x = move();
Cho phép lấy kí tự đó từ bộ nhớ đệm (nhờ lệnh getch() )rồi trả về giá trị cho x.

Tạo một menu như vậy thật thú vị phải không! Bạn hãy tạo thử một menu cho riêng mình nhé!
đây là link mã nguồn:






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

using namespace std;

void gotoxy(int column, int line)

{

COORD coord;

coord.X = column;

coord.Y = line;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

int move() {

char c = getch();

if ((int) c == -32) c = getch();

switch ((int) c) {

case 80:
return 1; //cout << "Xuong";

case 72:
return 2; //cout << "Len";

case 77:
return 3; //cout << "Phai";

case 75:
return 4; //cout << "Trai";

case 27:
return 8; //Nut ESC thoat

case 13:
return 5; //Nut Enter

default:
return 0; //cout << "Sai";

}

}

class Menu {

public:

Menu();

~Menu() {}

void printMenu();

void deleteMenu(); //Xóa menu khi kết thúc chương trình bằng cách viết đè kí tự trắng

int numberOfItem() {
return _numberOfItem;
}

string * getItem() {
return item;
}

private:

string * item; //Mảng lưu tên của các menu

int _numberOfItem; //Số lượng menu

};

Menu::Menu() {

item = new string[100];

_numberOfItem = 4;

item[0] = "CHOI";

item[1] = "DIEM CAO";

item[2] = "HUONG DAN";

item[3] = "THOAT";

}

void Menu::printMenu() {

for (int i = 0; i < _numberOfItem; i++) {

gotoxy(3, i);

cout << item[i];

Sleep(100); //Tạm dừng 100ms

}

}

void Menu::deleteMenu() {

for (int i = 0; i < _numberOfItem; i++) {

Sleep(100);

gotoxy(0, i);

for (int j = 0; j < item[i].size() + 3; j++) {

cout << " "; //Xóa bằng cách ghi đè kí tự trắng

}

}

}

int main()

{

Menu menu;

int x;

int line = 0; //Vị trí dòng của menu

bool thoat = false;

menu.printMenu();

gotoxy(0, line);
cout << (char) 1; //Vẽ con trỏ trỏ tới menu

while (!thoat) {

if (kbhit()) {

x = move();

gotoxy(0, line);
cout << " "; //Xóa con trỏ ở vị trí cũ

switch (x) {

case 1:

case 3:
{

line++;

if (line >= menu.numberOfItem()) line = 0;

break;

}

case 2:

case 4:
{

line--;

if (line < 0) line = menu.numberOfItem() - 1;

break;

}

case 5:
{

gotoxy(0, 10);
cout << " ";

gotoxy(0, 10);
cout << "Ban chon " << menu.getItem()[line];

break;

}

case 8:

thoat = true;

}

gotoxy(0, line);
cout << (char) 1;

}

}

menu.deleteMenu();

return 0;

}


Nhận xét