diff --git a/Main.cpp b/Main.cpp index bb75c8e..6fecc34 100644 --- a/Main.cpp +++ b/Main.cpp @@ -16,10 +16,10 @@ int main(int, char**) #include #include +#include // Main code // I moved the DirectX9 code into the test/directx9_test.cpp file, -// The code above is disabled with a preprocessor. #ifdef _DIRECTX9 #include "test/directx9_test.h" @@ -29,8 +29,96 @@ int main(int, char**) #include "test/opengl_test.h" #endif //_OPENGL +// New +#include + + +// https://stackoverflow.com/questions/14954876/how-to-create-a-message-box-with-user-defined-buttons-in-c +/* + * MessageBox() Flags + * These could be useful. + */ + +//#define MB_OK 0x00000000L +//#define MB_OKCANCEL 0x00000001L +//#define MB_ABORTRETRYIGNORE 0x00000002L +//#define MB_YESNOCANCEL 0x00000003L +//#define MB_YESNO 0x00000004L +//#define MB_RETRYCANCEL 0x00000005L +//#if(WINVER >= 0x0500) +//#define MB_CANCELTRYCONTINUE 0x00000006L +//#endif /* WINVER >= 0x0500 */ + +// Needed for the dll, what exactly does this do? +typedef VOID(*DLLPROC) (LPTSTR); + int main(int, char**) { +#define _TEST1 + // Load a test dll + // Get path to the dll, use current path + // https://stackoverflow.com/questions/61382829/dynamically-use-a-dll-from-a-console-application + + // https://www.tutorialspoint.com/dll/dll_writing.htm + // This seems to inject but I don't see the message box pop up + +#ifdef _TEST1 +#ifdef _DIRECTX9 + HINSTANCE hinstDLL; + DLLPROC HelloWorld; + BOOL fFreeDLL; + hinstDLL = LoadLibrary("KCNet-TestDll.dll"); + const std::string url = "https://git.internal.kelsoncraft.net/"; + + if (!hinstDLL) + { + // Well this seems to work well for an error message. + // TODO Add clickable links in this. + //Link is here: https://git.internal.kelsoncraft.net/" + //MessageBox(NULL, TEXT("You need the KCNet-TestDll.dll for this to work.\n Would you like to visit the link?: "), + // TEXT("Dll not found!"), MB_YESNO); + + // https://stackoverflow.com/questions/12578642/how-to-detect-which-yes-no-cancel-button-was-clicked-in-a-messagebox + const int result = MessageBox(NULL, TEXT("You need the KCNet-TestDll.dll for this to work.\n Would you like to visit the link?: "), + TEXT("Dll not found!"), MB_YESNO); + + switch (result) + { + case IDYES: + // https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c + //ShellExecute(0, 0, TEXT(url), 0, 0, SW_SHOW); + // I was able to remove the char* from the above by using c_str() on url. + ShellExecute(0, 0, url.c_str(), 0, 0, SW_SHOW); + break; + case IDNO: + break; + } + + std::cout << "Could not find the dynamic library." << std::endl; + return EXIT_FAILURE; + + // Continue with program if dll is found + } + else + { + std::cout << "Dynamic library loaded." << std::endl; + HelloWorld = (DLLPROC)GetProcAddress(hinstDLL, "HelloWorld"); + + // Run the message box prompt if it exists. + if (HelloWorld != NULL) + (HelloWorld); + + // Unload the dll + fFreeDLL = FreeLibrary(hinstDLL); + } + +#endif //_DIRECTX9 +#endif //_TEST1 + + + + + #ifdef _DIRECTX9 DirectX9Test::directX9Test(); #endif //_DIRECTX9 @@ -38,6 +126,14 @@ int main(int, char**) #ifdef _OPENGL OpenGLTest::openGLTest(); #endif //_OPENGL + +// TODO Add these sometime +#ifdef _DIRECTX11 + +#endif //_DIRECTX11 + +#ifdef _DIRECTX12 +#endif //_DIRECTX11 //std::cout << "Hello World"; } diff --git a/menus/main_menu.cpp b/menus/main_menu.cpp index 92ac321..54099e2 100644 --- a/menus/main_menu.cpp +++ b/menus/main_menu.cpp @@ -23,19 +23,21 @@ // Test macros #define LIMIT 5 -// This file is inactive, not in use yet. - // Boolean values -bool DirectX9Test::show_demo_window = true; +bool DirectX9Test::show_demo_window = false; bool DirectX9Test::button1_clicked = false; bool DirectX9Test::show_app_main_menu_bar = false; bool DirectX9Test::toggle_text = false; -bool DirectX9Test::dark_mode = false; +bool DirectX9Test::dark_mode = true; // I have dark mode enabled, I'll leave this to true. bool DirectX9Test::define_test = false; bool DirectX9Test::list_values = false; // +// TODO Setup test for storing an array of pointers + +// TODO Try to play around with PS3 homebrew or Nintendo Switch homebrew. + void MainMenu::MainMenuTest() { ImGuiIO& io = ImGui::GetIO(); (void)io; @@ -58,6 +60,13 @@ void MainMenu::MainMenuTest() { ImGui::BulletText("Hello, this should show up."); ImGui::Separator(); + // This works + if (ImGui::Button("Windows Msg Box")) + { + MessageBox(NULL, TEXT("Hello From ImGui, a MessageBox"), + TEXT("KCNet-ImGuiTest"), MB_OK); + } + // Menu toggle button if (ImGui::Button("Menu toggle")) { @@ -114,14 +123,35 @@ void MainMenu::MainMenuTest() { // This below works for a dark mode toggle. // 5-16-2024 @ 9:14PM + ///////////// + // Dark mode toggle + ///////////// + #ifndef _TEST #define _TEST #endif #ifdef _TEST - // Well the checkbox is inverted lol, oh well I'll fix it later. - // If it is checked it turns off dark mode, I guess its because I have dark mode as the default theme. + if (ImGui::Checkbox("Dark Mode", &DirectX9Test::dark_mode)) + { + if (DirectX9Test::dark_mode) + { + + ImGui::StyleColorsDark(); + ImGui::BulletText("On"); + } + else + { + ImGui::StyleColorsLight(); + ImGui::BulletText("Off"); + } + } + ImGui::SameLine(); + // Added some spacing to this + ImGui::Text(" Enabled by default for KCNet-ImGui"); + +#else if (!ImGui::Checkbox("Dark Mode", &DirectX9Test::dark_mode)) { if (!DirectX9Test::dark_mode) @@ -134,27 +164,13 @@ void MainMenu::MainMenuTest() { { ImGui::StyleColorsLight(); ImGui::BulletText("Off"); - } - } - -#else - ImGui::Checkbox("Dark Mode", &dark_mode); - if (dark_mode) - { - ImGui::StyleColorsLight(); - ImGui::BulletText("Off"); - } - else - { - ImGui::StyleColorsDark(); - - ImGui::BulletText("On"); + } } #endif //_TEST // Disable preprocessor #undef _TEST - // This works for toggling the demo window on and off + // This works for toggling the demo window on and off ImGui::Checkbox("Demo window", &DirectX9Test::show_demo_window); // Possibly implement feature to read from a text file and write it to some output box. @@ -182,22 +198,13 @@ void MainMenu::MainMenuTest() { else ImGui::Text("Mouse pos: "); - //if (ImGui::Checkbox("Show Text", &toggle_text)) - //{ - // ImGui::BulletText("Hello"); - //} - //else - //{ - // ImGui::BulletText("Hola"); - //} - - // How do I update this text in code? // Like if a button is pressed. //ImGui::Separator(); //ImGui::BulletText("Test"); // I'm quite sure this will only work on Windows, will need tested on Linux once I get opengl working. + // Yeah this uses WinUser.h which is windows specific #ifdef _WIN32 static bool test = false; @@ -240,28 +247,32 @@ void MainMenu::MainMenuTest() { //for (int i =0; i< keyboard_chars_enum) // This one didn't work - //for (int i = 0; i < input; i++) { - // if (GetKeyState(i) & 0x8000) - // ImGui::Text(i + " key was pressed"); - //} - +#ifdef _TEST + for (int i = 0; i < input; i++) { + if (GetKeyState(i) & 0x8000) + ImGui::Text(i + " key was pressed"); + } +#else // This works - //if (GetKeyState('A') & 0x8000) - //{ - // ImGui::Text("A Key pressed"); - //} + if (GetKeyState('A') & 0x8000) + { + ImGui::Text("A Key pressed"); + } + + if (GetKeyState(VK_SHIFT) & 0x8000) + { + ImGui::Text("Shift Key pressed"); + } +#endif //_TEST + - //if (GetKeyState(VK_SHIFT) & 0x8000) - //{ - // ImGui::Text("Shift Key pressed"); - //} // } - else - { - ImGui::Text("Goodbye"); - } + //else + //{ + // ImGui::Text("Goodbye"); + //} #endif //_WIN32 @@ -288,7 +299,7 @@ void MainMenu::MainMenuTest() { //Sleep(2000); // This spams the console too much. - KeyStates::test(); + //KeyStates::test(); } else { @@ -296,6 +307,8 @@ void MainMenu::MainMenuTest() { } } + ImGui::Separator(); + // This works for a column, having multiple items on the same row. ImGui::Columns(2); ImGui::Text("Hello"); diff --git a/menus/pch.h b/menus/pch.h new file mode 100644 index 0000000..7a64ca7 --- /dev/null +++ b/menus/pch.h @@ -0,0 +1,21 @@ +#pragma once + +// Possibly switch over to using pre compiled headers for this project. + +/* +#include "imgui.h" +#include "imgui_impl_dx9.h" + +#if _WIN32 +#include "imgui_impl_win32.h" +#include +#include "../util/keystates.h" +#endif + +#include +#include + +#include +#include +#include +*/ \ No newline at end of file diff --git a/menus/text_menu.cpp b/menus/text_menu.cpp new file mode 100644 index 0000000..8a250e3 --- /dev/null +++ b/menus/text_menu.cpp @@ -0,0 +1,45 @@ +#include "imgui.h" +#include "imgui_impl_dx9.h" + +#if _WIN32 +#include "imgui_impl_win32.h" +#include +#include "../util/keystates.h" +#endif + +#include +#include + +#include +#include +#include + +#include "../util/text_file_functions.h" +#include "../test/directx9_test.h" +#include "text_menu.h" + +bool show_text = false; + +void TextMenu::TextMainMenu() { + ImGui::BulletText("I will add reading files, writing and more to this."); + ImGui::Separator(); + + // I almost got this working 5-17-2024 @ 3:14PM + // It doesn't print out all of the lines from the return value. + + ImGui::Checkbox("Test", &show_text); + + if(show_text) + { + TextFileFunctions::printTextOutput("test.txt"); + //ImGui::Text(TextFileFunctions::printTextOutput("test.txt")); + + } + + + //if (ImGui::Button("Test")) + //{ + // TextFileFunctions::printTextOutput("test.txt"); + // //std::cout << TextFileFunctions::printTextOutput("test.txt") << std::endl; + //} +} \ No newline at end of file diff --git a/menus/text_menu.h b/menus/text_menu.h new file mode 100644 index 0000000..32ede01 --- /dev/null +++ b/menus/text_menu.h @@ -0,0 +1,7 @@ +#pragma once +class TextMenu +{ +public: + void TextMainMenu(); +}; + diff --git a/test/directx9_test.cpp b/test/directx9_test.cpp index 4104ba0..e05efe0 100644 --- a/test/directx9_test.cpp +++ b/test/directx9_test.cpp @@ -23,8 +23,7 @@ // - Documentation https://dearimgui.com/docs (same as your local docs/ folder). // - Introduction, links and more at the top of imgui.cpp - - +// ImGui #include "imgui.h" #include "imgui_impl_dx9.h" @@ -33,6 +32,7 @@ #include #include "../util/keystates.h" #endif +// #include #include @@ -41,9 +41,14 @@ #include #include +// Util #include "../util/text_file_functions.h" #include "../util/text_functions.h" +// +// Menus #include "../menus/main_menu.h" +#include "../menus/text_menu.h" +// // https://www.geeksforgeeks.org/macros-and-its-types-in-c-cpp/ // Test macros @@ -148,6 +153,9 @@ static void ShowWindow(bool* p_open) void DirectX9Test::directX9Test() { + // Define custom booleans and features. + TextMenu *textMenu = new TextMenu(); + #ifdef _TEST //std::cout << testString1(); #endif @@ -258,19 +266,12 @@ void DirectX9Test::directX9Test() MainMenu::MainMenuTest(); + + // Text file functions test menu if (ImGui::CollapsingHeader("Text File Functions")) { - ImGui::BulletText("I will add reading files, writing and more to this."); - ImGui::Separator(); - - // I almost got this working 5-17-2024 @ 3:14PM - // It doesn't print out all of the lines from the return value. - if (ImGui::Button("Test")) - { - TextFileFunctions::printTextOutput("test.txt"); - //std::cout << TextFileFunctions::printTextOutput("test.txt") << std::endl; - } + textMenu->TextMainMenu(); } // End Text file functions test menu diff --git a/util/text_file_functions.cpp b/util/text_file_functions.cpp index f6d1f2f..6f2ca88 100644 --- a/util/text_file_functions.cpp +++ b/util/text_file_functions.cpp @@ -60,9 +60,12 @@ void TextFileFunctions::readTextFile(std::string file) #ifdef _TEST void TextFileFunctions::printTextOutput(std::string file) { + //std::string line; + //std::string line[1000]; std::string line; std::ifstream myfile(file); + if (TextFileFunctions::fileExistCheck(file)) { if (myfile.is_open())