From f2d0f6f7439b3cc76544c2fad67a5f5ff06791f8 Mon Sep 17 00:00:00 2001 From: CyB3RC0nN0R Date: Thu, 19 Dec 2019 14:51:51 +0100 Subject: [PATCH] Added existing project --- .gitignore | 5 ++ MenuLib.cpp | 10 +++ MenuLib.sln | 31 ++++++++ MenuLib.vcxproj | 167 ++++++++++++++++++++++++++++++++++++++++ MenuLib.vcxproj.filters | 39 ++++++++++ MenuLib.vcxproj.user | 4 + framework.h | 3 + menu.c | 119 ++++++++++++++++++++++++++++ menu.h | 18 +++++ pch.cpp | 5 ++ pch.h | 21 +++++ 11 files changed, 422 insertions(+) create mode 100644 .gitignore create mode 100644 MenuLib.cpp create mode 100644 MenuLib.sln create mode 100644 MenuLib.vcxproj create mode 100644 MenuLib.vcxproj.filters create mode 100644 MenuLib.vcxproj.user create mode 100644 framework.h create mode 100644 menu.c create mode 100644 menu.h create mode 100644 pch.cpp create mode 100644 pch.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c31b73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +################################################################################ +# Diese .gitignore-Datei wurde von Microsoft(R) Visual Studio automatisch erstellt. +################################################################################ + +/.vs diff --git a/MenuLib.cpp b/MenuLib.cpp new file mode 100644 index 0000000..9546ae6 --- /dev/null +++ b/MenuLib.cpp @@ -0,0 +1,10 @@ +// MenuLib.cpp : Hiermit werden die Funktionen für die statische Bibliothek definiert. +// + +#include "pch.h" +#include "framework.h" + +// TODO: Dies ist ein Beispiel für eine Bibliotheksfunktion. +void fnMenuLib() +{ +} diff --git a/MenuLib.sln b/MenuLib.sln new file mode 100644 index 0000000..4ea7b2b --- /dev/null +++ b/MenuLib.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MenuLib", "MenuLib.vcxproj", "{5ADA9F67-F267-4FF6-AB61-E73C21F6EE36}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5ADA9F67-F267-4FF6-AB61-E73C21F6EE36}.Debug|x64.ActiveCfg = Debug|x64 + {5ADA9F67-F267-4FF6-AB61-E73C21F6EE36}.Debug|x64.Build.0 = Debug|x64 + {5ADA9F67-F267-4FF6-AB61-E73C21F6EE36}.Debug|x86.ActiveCfg = Debug|Win32 + {5ADA9F67-F267-4FF6-AB61-E73C21F6EE36}.Debug|x86.Build.0 = Debug|Win32 + {5ADA9F67-F267-4FF6-AB61-E73C21F6EE36}.Release|x64.ActiveCfg = Release|x64 + {5ADA9F67-F267-4FF6-AB61-E73C21F6EE36}.Release|x64.Build.0 = Release|x64 + {5ADA9F67-F267-4FF6-AB61-E73C21F6EE36}.Release|x86.ActiveCfg = Release|Win32 + {5ADA9F67-F267-4FF6-AB61-E73C21F6EE36}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FCB19F7F-D5E2-44E3-8B33-C2797FF62817} + EndGlobalSection +EndGlobal diff --git a/MenuLib.vcxproj b/MenuLib.vcxproj new file mode 100644 index 0000000..e933243 --- /dev/null +++ b/MenuLib.vcxproj @@ -0,0 +1,167 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {5ADA9F67-F267-4FF6-AB61-E73C21F6EE36} + Win32Proj + MenuLib + 10.0 + + + + StaticLibrary + true + v142 + Unicode + + + StaticLibrary + false + v142 + true + Unicode + + + StaticLibrary + true + v142 + Unicode + + + StaticLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + true + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + + + + + Use + Level3 + true + _DEBUG;_LIB;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + + + + + Use + Level3 + true + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + true + true + + + + + Use + Level3 + true + true + true + NDEBUG;_LIB;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + true + true + + + + + + + + + + + + Create + Create + Create + Create + + + + + + \ No newline at end of file diff --git a/MenuLib.vcxproj.filters b/MenuLib.vcxproj.filters new file mode 100644 index 0000000..14b86da --- /dev/null +++ b/MenuLib.vcxproj.filters @@ -0,0 +1,39 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + \ No newline at end of file diff --git a/MenuLib.vcxproj.user b/MenuLib.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/MenuLib.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/framework.h b/framework.h new file mode 100644 index 0000000..862e2c2 --- /dev/null +++ b/framework.h @@ -0,0 +1,3 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // Selten verwendete Komponenten aus Windows-Headern ausschließen diff --git a/menu.c b/menu.c new file mode 100644 index 0000000..f88fa2e --- /dev/null +++ b/menu.c @@ -0,0 +1,119 @@ +#include "pch.h" +#include "menu.h" + +// Checks if a line index should display a menu item +bool is_item_line(const int line, const int itemc, int* item_index) +{ + if (line >= 2 && line % 2 == 0) + { + // Lines 2, 4, ... + *item_index = (line - 2) / 2; + return *item_index < itemc; + } + return false; +} + +// Acquires the dimensions (width and height) of the console window +void get_console_dimensions(int* width, int* height) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); + *width = csbi.srWindow.Right - csbi.srWindow.Left + 1; + *height = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; +} + +void show_menu(const int itemc, struct MenuItem itemv[], const char title[], bool loopback, bool pause) +{ + unsigned width, height, item_index; + char key; + bool action_performed; + + // Clear the console window + system("cls"); + + // Get the width and height of the console window + get_console_dimensions(&width, &height); + + // Print frame with title + for (unsigned i = 0; i < height - 1; ++i) + { + // Top line with title + if (i == 0) + { + for (unsigned j = 0; j < width - strlen(title) + 1; ++j) + { + if (j == (width - strlen(title)) / 2) + { + fputs(title, stdout); + } + else + { + putchar('*'); + } + } + } + // Line with menu item + else if (is_item_line(i, itemc, &item_index)) + { + // Print item text + printf("*\t%c) %s", itemv[item_index].key, itemv[item_index].text); + + // Print right side of frame + for (unsigned j = 0; j < width - strlen(itemv[item_index].text) - 12; ++j) + { + putchar(' '); + } + putchar('*'); + } + // Line above bottom line + else if (i == height - 2) + { + for (unsigned j = 0; j < width; ++j) + { + putchar('*'); + } + } + // Blank line + else + { + putchar('*'); + for (unsigned j = 0; j < width - 2; ++j) + { + putchar(' '); + } + putchar('*'); + } + putchar('\n'); + } + + // Wait for user selection + putchar('> '); + action_performed = false; + do { + key = _getch(); + for (int i = 0; i < itemc; ++i) + { + if (itemv[i].key == key) + { + // Perform action + system("cls"); + itemv[i].action(); + action_performed = true; + + // Pause if requested + if (pause) + { + putchar('\n'); + system("pause"); + } + } + } + } while (!action_performed); + + // Show menu again if requested + if (loopback) + { + show_menu(itemc, itemv, title, loopback, pause); + } +} \ No newline at end of file diff --git a/menu.h b/menu.h new file mode 100644 index 0000000..bdb7fe1 --- /dev/null +++ b/menu.h @@ -0,0 +1,18 @@ +#pragma once + +#include "pch.h" + +/// Represents one menu item in a menu. +struct MenuItem { + char* text; + char key; + void* (*action)(void); +}; + +/// Displaces a CUI menu to the user and lets them choose an option, then calls the corresponding function. +/// The length of the array itemv of menu items. +/// An array of all menu items to display in the menu. +/// The title of the menu. +/// If this parameter is set to true, the menu will be displayed again after an action is executed. +/// If this parameter is set to true, a pausecommand will be run after an action is executed. +void show_menu(const int itemc, struct MenuItem itemv[], const char title[], bool loopback, bool pause); \ No newline at end of file diff --git a/pch.cpp b/pch.cpp new file mode 100644 index 0000000..1fcbac0 --- /dev/null +++ b/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: Quelldatei, die dem vorkompilierten Header entspricht + +#include "pch.h" + +// Bei der Verwendung vorkompilierter Header ist diese Quelldatei für eine erfolgreiche Kompilierung erforderlich. diff --git a/pch.h b/pch.h new file mode 100644 index 0000000..e0e6e72 --- /dev/null +++ b/pch.h @@ -0,0 +1,21 @@ +// pch.h: Dies ist eine vorkompilierte Headerdatei. +// Die unten aufgeführten Dateien werden nur einmal kompiliert, um die Buildleistung für zukünftige Builds zu verbessern. +// Dies wirkt sich auch auf die IntelliSense-Leistung aus, Codevervollständigung und viele Features zum Durchsuchen von Code eingeschlossen. +// Die hier aufgeführten Dateien werden jedoch ALLE neu kompiliert, wenn mindestens eine davon zwischen den Builds aktualisiert wird. +// Fügen Sie hier keine Dateien hinzu, die häufig aktualisiert werden sollen, da sich so der Leistungsvorteil ins Gegenteil verkehrt. + +#ifndef PCH_H +#define PCH_H + +// Fügen Sie hier Header hinzu, die vorkompiliert werden sollen. +#include "framework.h" + +#include +#include +#include +#include + +#include +#include + +#endif //PCH_H