B
Ich habe die Menüklasse mal erweitert. Man kann nun den Menüpunkten einen Zeiger auf eine Funktion vom Typ
void (*p)()
mitgeben. Wenn man das tut, wird bei Auswahl des entsprechenden Menüpunktes nicht zurückgekehrt, sondern diese Funktion ausgeführt und danach wieder das Menü dargestellt.
Auf diesem Weg kann man zum Beispiel relativ leicht Untermenüs erstellen:
#ifndef MENUE_H
#define MENUE_H
#include <windows.h>
#include <string>
#include <vector>
typedef void (*VerarbFunkPtr)();
class menue
{
public:
void addToMenue(std::string text, int x, int y, VerarbFunkPtr fPtr = 0);
int startMenue();
private:
struct menueEintrag
{
std::string text;
int xPos;
int yPos;
VerarbFunkPtr func;
menueEintrag(std::string t, int x, int y, VerarbFunkPtr ptr = 0) :
text(t), xPos(x), yPos(y), func(ptr){}
};
int loopMenue();
void printMenue();
std::vector<menueEintrag> m;
int aktPos;
};
#endif
#include <conio.h>
#include "menue.h"
#include "consoleFunctions.h"
void menue::addToMenue(std::string text, int x, int y, VerarbFunkPtr fPtr)
{
m.push_back(menueEintrag(text, x, y, fPtr));
}
int menue::startMenue()
{
if(!m.size())
return -1; //Keine Menueeinträge
aktPos = 0;
printMenue();
return loopMenue();
}
int menue::loopMenue()
{
char taste = getch();
while(true)
{
if(taste == 80)
{
invertText(m[aktPos].xPos, m[aktPos].yPos, m[aktPos].text.size());
++aktPos;
if(aktPos > m.size() - 1)
aktPos = 0;
invertText(m[aktPos].xPos, m[aktPos].yPos, m[aktPos].text.size());
}
if(taste == 72)
{
invertText(m[aktPos].xPos, m[aktPos].yPos, m[aktPos].text.size());
--aktPos;
if(aktPos < 0)
aktPos = m.size() - 1;
invertText(m[aktPos].xPos, m[aktPos].yPos, m[aktPos].text.size());
}
if(taste == 13)
{
if(m[aktPos].func)
{
m[aktPos].func();
printMenue();
}
else
{
return aktPos;
}
}
taste = getch();
}
}
void menue::printMenue()
{
clearScreen();
COORD pos = {0, 0};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
for(int i = 0; i < m.size(); ++i)
druckText(m[i].text, m[i].xPos, m[i].yPos);
invertText(m[aktPos].xPos, m[aktPos].yPos, m[aktPos].text.size());
}
Ein Testprogramm:
#include <iostream>
#include <conio.h>
#include "menue.h"
#include "consoleFunctions.h"
void verarbMen3()
{
menue men;
men.addToMenue("Untermenuepunkt Eins", 12, 7);
men.addToMenue("Untermenuepunkt Zwei", 12, 11);
int gewaehlt = men.startMenue();
clearScreen();
std::cout << "im Untermenue wurde Punkt" << gewaehlt << " ausgewaehlt\n";
getch();
}
int main()
{
menue men;
men.addToMenue("Menuepunkt 1", 12, 5);
men.addToMenue("Menuepunkt 2", 12, 7);
men.addToMenue("Menuepunkt 3", 12, 9, verarbMen3);
men.addToMenue("Menuepunkt 4", 12, 11);
int gewaehlt = men.startMenue();
clearScreen();
std::cout << "Gewaehlt wurde Menuepunkt " << gewaehlt;
}