Window Procedure work and Alt-Enter fullscreen toggle

This commit is contained in:
Grayson Riffe (Desktop) 2021-08-14 19:56:23 -05:00
parent 5777478858
commit 8e4ed26755
8 changed files with 71 additions and 101 deletions

View File

@ -1,60 +0,0 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@ -166,12 +166,6 @@
<ItemGroup> <ItemGroup>
<ClCompile Include="src\Game.cpp" /> <ClCompile Include="src\Game.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClInclude Include="resource.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Game.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>

View File

@ -19,14 +19,4 @@
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClInclude Include="resource.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Game.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
</Project> </Project>

View File

@ -1,14 +0,0 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Game.rc
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -4,11 +4,15 @@ using namespace nf;
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
//TODO: Argument parser
Config conf = { 1280, 720, false, "Test"}; Config conf = { 1280, 720, false, "Test"};
Application app(conf); Application app(conf);
//app.setWindowIcon(...);
// app.setWindowCursor(...);
//Create game states, load some assets, launch loop that continually updates and renders the current state and switches states when appropriate. //Create game states, load some assets, launch loop that continually updates and renders the current state and switches states when appropriate.
//Show window app.showWindow(true);
app.startLoop();
return 0; return 0;
} }

View File

@ -1,14 +1,13 @@
#include "Application.h" #include "Application.h"
#include "Utility.h" #include "Utility.h"
#include <iostream>
//TODO: delete this
namespace nf { namespace nf {
DEBUGINIT; DEBUGINIT;
Application::Application(Config& config) : Application::Application(Config& config) :
m_currentConfig(config), m_currentConfig(config),
m_wndPlacement{ sizeof(m_wndPlacement) } m_wndPlacement{ sizeof(m_wndPlacement) },
m_running(false)
{ {
Log("Creating NF application"); Log("Creating NF application");
Log("Width: " + std::to_string(m_currentConfig.width) + ", Height: " + std::to_string(m_currentConfig.height) + ", Fullscreen: " + std::to_string(m_currentConfig.fullscreen) + ", Title: " + m_currentConfig.title); Log("Width: " + std::to_string(m_currentConfig.width) + ", Height: " + std::to_string(m_currentConfig.height) + ", Fullscreen: " + std::to_string(m_currentConfig.fullscreen) + ", Title: " + m_currentConfig.title);
@ -18,12 +17,32 @@ namespace nf {
RECT windowSize = getWindowRect(); RECT windowSize = getWindowRect();
m_window = CreateWindowEx(NULL, m_wclassName, toWide(m_currentConfig.title), WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 1280, windowSize.bottom, NULL, NULL, m_hInst, NULL); m_window = CreateWindowEx(NULL, m_wclassName, toWide(m_currentConfig.title), WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 1280, windowSize.bottom, NULL, NULL, m_hInst, NULL);
SetProp(m_window, L"App", this);
if(m_currentConfig.fullscreen) toggleFullscreen(); if(m_currentConfig.fullscreen) toggleFullscreen();
showWindow(true);
} }
Config& Application::getConfig() { void Application::setWindowIcon(HANDLE hIcon) {
return m_currentConfig; SendMessage(m_window, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
SendMessage(m_window, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
}
void Application::setWindowCursor(HCURSOR hCursor) {
SetClassLongPtr(m_window, GCLP_HCURSOR, (LONG_PTR)hCursor);
}
void Application::startLoop() {
m_running = true;
MSG msg = { };
while (m_running) {
//TODO: FPS and delta timing
while (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_QUIT)
m_running = false;
}
//TODO: Update and render current state
}
} }
void Application::showWindow(bool show) { void Application::showWindow(bool show) {
@ -33,11 +52,16 @@ namespace nf {
ShowWindow(m_window, SW_HIDE); ShowWindow(m_window, SW_HIDE);
} }
Config& Application::getConfig() {
return m_currentConfig;
}
void Application::registerWindowClass() { void Application::registerWindowClass() {
m_wclassName = L"NFClass"; m_wclassName = L"NFClass";
WNDCLASS wclass = { }; WNDCLASS wclass = { };
wclass.lpszClassName = m_wclassName; wclass.lpszClassName = m_wclassName;
//TODO: Add custom cursor and window icon at request of frontend using future resource format wclass.hCursor = NULL;
wclass.hIcon = NULL;
wclass.hInstance = m_hInst; wclass.hInstance = m_hInst;
wclass.lpfnWndProc = Application::WindowProc; wclass.lpfnWndProc = Application::WindowProc;
RegisterClass(&wclass); RegisterClass(&wclass);
@ -72,8 +96,32 @@ namespace nf {
} }
LRESULT CALLBACK Application::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT CALLBACK Application::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
Application* app = (Application*)GetProp(hWnd, L"App");
switch (uMsg) { switch (uMsg) {
case WM_CREATE: {
return 0;
}
case WM_SYSKEYDOWN: {
if (GetKeyState(VK_RETURN) & 0x8000) {
app->toggleFullscreen();
return 0;
}
break;
}
case WM_MENUCHAR: {
return MNC_CLOSE << 16;
}
case WM_CLOSE: {
//State onExit() in order
//unload anything else
DestroyWindow(hWnd);
return 0;
}
case WM_DESTROY: {
PostQuitMessage(0);
return 0;
}
} }
return DefWindowProc(hWnd, uMsg, wParam, lParam);//TODO: Fill out events return DefWindowProc(hWnd, uMsg, wParam, lParam);//TODO: Fill out events
} }

View File

@ -9,8 +9,11 @@ namespace nf {
Application() = delete; Application() = delete;
Application(Application& other) = delete; Application(Application& other) = delete;
Config& getConfig(); void setWindowIcon(HANDLE hIcon);
void setWindowCursor(HCURSOR hCursor);
void startLoop();
void showWindow(bool show); void showWindow(bool show);
Config& getConfig();
~Application(); ~Application();
private: private:
@ -21,6 +24,7 @@ namespace nf {
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
Config m_currentConfig; Config m_currentConfig;
bool m_running;
HINSTANCE m_hInst; HINSTANCE m_hInst;
LPCWSTR m_wclassName; LPCWSTR m_wclassName;
HWND m_window; HWND m_window;

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <chrono> #include <chrono>
#include <thread>
#include <iostream> #include <iostream>
#include <string> #include <string>
@ -7,9 +8,12 @@ namespace nf {
#ifdef _DEBUG #ifdef _DEBUG
#define __FILENAME__ strrchr(__FILE__, '\\') + 1 #define __FILENAME__ strrchr(__FILE__, '\\') + 1
#define DEBUGINIT std::chrono::steady_clock::time_point Debug::m_initTime = std::chrono::high_resolution_clock::now(); #define DEBUGINIT std::chrono::steady_clock::time_point Debug::m_initTime = std::chrono::high_resolution_clock::now();
#define SleepS(x) std::this_thread::sleep_for(std::chrono::seconds(x))
#define SleepMS(x) std::this_thread::sleep_for(std::chrono::milliseconds(x))
#define Log(x) Debug::LogImp(x) #define Log(x) Debug::LogImp(x)
#define Error(x) Debug::ErrorImp(x,__FILENAME__, __LINE__);\ #define Error(x) Debug::ErrorImp(x,__FILENAME__, __LINE__);\
DebugBreak(); DebugBreak();
class Debug { class Debug {
private: private:
static std::chrono::steady_clock::time_point m_initTime; static std::chrono::steady_clock::time_point m_initTime;