Jeg har ikke en compiler med ncurses for tiden, men jeg har lavet et eksemel med windows funktioner.
#include <iostream>
#include <windows.h>
void GotoXY(int x, int y)
{
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD c;
c.X = (short )x;
c.Y = (short )y;
SetConsoleCursorPosition(StdOut, c);
}
WORD GetChar()
{
DWORD NumEventsRead;
INPUT_RECORD InputRecord;
HANDLE StdIn = GetStdHandle(STD_INPUT_HANDLE);
while(1)
{
if(!ReadConsoleInput(StdIn, &InputRecord, 1, &NumEventsRead))
return 0;
if(InputRecord.EventType & KEY_EVENT && InputRecord.Event.KeyEvent.bKeyDown)
{
if(InputRecord.Event.KeyEvent.wVirtualKeyCode != VK_CONTROL &&
InputRecord.Event.KeyEvent.wVirtualKeyCode != VK_MENU &&
InputRecord.Event.KeyEvent.wVirtualKeyCode != VK_SHIFT)
{
return InputRecord.Event.KeyEvent.wVirtualKeyCode;
}
}
}
}
void ClearScreen()
{
short i;
HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
GetConsoleScreenBufferInfo(StdOut, &ConsoleScreenBufferInfo);
SMALL_RECT Pos = ConsoleScreenBufferInfo.srWindow;
DWORD D;
for(i = Pos.Top; i <= Pos.Bottom; i++)
{
COORD C;
C.X = Pos.Left;
C.Y = i;
FillConsoleOutputCharacter(StdOut, ' ', Pos.Right - Pos.Left, C, &D);
FillConsoleOutputAttribute(StdOut, 0, Pos.Right - Pos.Left, C, &D);
}
GotoXY(0, 0);
}
struct MenuStruct
{
const char *Title;
const char *Program;
bool On;
};
#define NUM_MENU 3
MenuStruct Menu[NUM_MENU] =
{
{"Prog1", "Prog1.exe", true},
{"Prog2", "Prog2.exe", true},
{"Prog3", "Prog3.exe", true}
};
int main()
{
int Key;
do
{
ClearScreen();
GotoXY(0, 0);
for(int i = 0; i < NUM_MENU; i++)
{
std::cout << (i + 1) << " " << Menu[i].Title;
if(Menu[i].On)
std::cout << "(x)";
else
std::cout << "( )";
std::cout << std::endl;
}
std::cout << "Hit 1 - " << NUM_MENU << " to toggle, Enter to continue";
std::cout.flush();
Key = GetChar();
int t = Key - '1';
if(t >= 0 && t < NUM_MENU)
Menu[t].On ^= true;
}
while(Key != VK_RETURN);
std::cout << std::endl;
for(int k = 0; k < NUM_MENU; k++)
if(Menu[k].On)
std::cout << "Selected: " << Menu[k].Program << std::endl;
}
Du skal erstatte GotoXY, GetChar og ClearScreen med ncurses versioner.
Du kan måske få en idé til hvordan ved at kikke på:
http://home20.inet.tele.dk/midgaard/snip/cmenu.html