diff options
author | crupest <crupest@outlook.com> | 2019-03-31 17:14:47 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2019-03-31 17:14:47 +0800 |
commit | fbfd90255731954fb80483f4ba7188d3611fafec (patch) | |
tree | 8e3283c911d7aec76130d6a1dc7f5d8a85512b59 /include/cru/platform/win | |
parent | 877f65e2e2c40eecc7cfeb194dc9d391af60711b (diff) | |
download | cru-fbfd90255731954fb80483f4ba7188d3611fafec.tar.gz cru-fbfd90255731954fb80483f4ba7188d3611fafec.tar.bz2 cru-fbfd90255731954fb80483f4ba7188d3611fafec.zip |
...
Diffstat (limited to 'include/cru/platform/win')
-rw-r--r-- | include/cru/platform/win/exception.hpp | 49 | ||||
-rw-r--r-- | include/cru/platform/win/god_window.hpp | 33 | ||||
-rw-r--r-- | include/cru/platform/win/win_application.hpp | 53 | ||||
-rw-r--r-- | include/cru/platform/win/win_pre_config.hpp | 6 | ||||
-rw-r--r-- | include/cru/platform/win/window_class.hpp | 26 |
5 files changed, 167 insertions, 0 deletions
diff --git a/include/cru/platform/win/exception.hpp b/include/cru/platform/win/exception.hpp new file mode 100644 index 00000000..01b139b4 --- /dev/null +++ b/include/cru/platform/win/exception.hpp @@ -0,0 +1,49 @@ +#pragma once +#include "win_pre_config.hpp" + +#include <stdexcept> +#include <string_view> + +namespace cru::platform::win { +class HResultError : public std::runtime_error { + public: + explicit HResultError(HRESULT h_result); + explicit HResultError(HRESULT h_result, + const std::string_view& additional_message); + HResultError(const HResultError& other) = default; + HResultError(HResultError&& other) = default; + HResultError& operator=(const HResultError& other) = default; + HResultError& operator=(HResultError&& other) = default; + ~HResultError() override = default; + + HRESULT GetHResult() const { return h_result_; } + + private: + HRESULT h_result_; +}; + +inline void ThrowIfFailed(const HRESULT h_result) { + if (FAILED(h_result)) throw HResultError(h_result); +} + +inline void ThrowIfFailed(const HRESULT h_result, + const std::string_view& message) { + if (FAILED(h_result)) throw HResultError(h_result, message); +} + +class Win32Error : public std::runtime_error { + public: + explicit Win32Error(DWORD error_code); + Win32Error(DWORD error_code, const std::string_view& additional_message); + Win32Error(const Win32Error& other) = default; + Win32Error(Win32Error&& other) = default; + Win32Error& operator=(const Win32Error& other) = default; + Win32Error& operator=(Win32Error&& other) = default; + ~Win32Error() override = default; + + HRESULT GetErrorCode() const { return error_code_; } + + private: + DWORD error_code_; +}; +} // namespace cru::platform::win diff --git a/include/cru/platform/win/god_window.hpp b/include/cru/platform/win/god_window.hpp new file mode 100644 index 00000000..534dfedb --- /dev/null +++ b/include/cru/platform/win/god_window.hpp @@ -0,0 +1,33 @@ +#pragma once +#include "win_pre_config.hpp" + +#include <memory> +#include <optional> + +#include "cru/common/base.hpp" + +namespace cru::platform::win { +class WinApplication; +class WindowClass; + +class GodWindow : public Object { + public: + explicit GodWindow(WinApplication* application); + GodWindow(const GodWindow& other) = delete; + GodWindow(GodWindow&& other) = delete; + GodWindow& operator=(const GodWindow& other) = delete; + GodWindow& operator=(GodWindow&& other) = delete; + ~GodWindow() override; + + HWND GetHandle() const { return hwnd_; } + + std::optional<LRESULT> HandleGodWindowMessage(HWND hwnd, int msg, + WPARAM w_param, LPARAM l_param); + + private: + WinApplication* application_; + + std::shared_ptr<WindowClass> god_window_class_; + HWND hwnd_; +}; +} // namespace cru::platform::win
\ No newline at end of file diff --git a/include/cru/platform/win/win_application.hpp b/include/cru/platform/win/win_application.hpp new file mode 100644 index 00000000..363ae170 --- /dev/null +++ b/include/cru/platform/win/win_application.hpp @@ -0,0 +1,53 @@ +#pragma once +#include "win_pre_config.hpp" + +#include "../ui_applicaition.hpp" +#include "cru/common/base.hpp" + +#include <memory> + +namespace cru::platform::win { +class GodWindow; +class TimerManager; + +class WinApplication : public Object, public virtual UiApplication { + public: + static WinApplication* GetInstance(); + + private: + static WinApplication* instance_; + + private: + explicit WinApplication(HINSTANCE h_instance); + + public: + WinApplication(const WinApplication&) = delete; + WinApplication(WinApplication&&) = delete; + WinApplication& operator=(const WinApplication&) = delete; + WinApplication& operator=(WinApplication&&) = delete; + ~WinApplication() override; + + public: + int Run() override; + void Quit(int quit_code) override; + + void InvokeLater(const std::function<void()>& action) override; + unsigned long SetTimeout(std::chrono::milliseconds milliseconds, + const std::function<void()>& action) override; + unsigned long SetInterval(std::chrono::milliseconds milliseconds, + const std::function<void()>& action) override; + void CancelTimer(unsigned long id) override; + + HINSTANCE GetInstanceHandle() const { return h_instance_; } + + GodWindow* GetGodWindow() const { return god_window_.get(); } + + TimerManager* GetTimerManager() const; + + private: + HINSTANCE h_instance_; + + std::shared_ptr<GodWindow> god_window_; + std::shared_ptr<TimerManager> timer_manager_; +}; +} // namespace cru::platform::win diff --git a/include/cru/platform/win/win_pre_config.hpp b/include/cru/platform/win/win_pre_config.hpp new file mode 100644 index 00000000..2e8bb80e --- /dev/null +++ b/include/cru/platform/win/win_pre_config.hpp @@ -0,0 +1,6 @@ +#include "cru/common/pre_config.hpp" + +#define NOMINMAX +#define WIN32_LEAN_AND_MEAN +#include <Windows.h> +#undef CreateWindow diff --git a/include/cru/platform/win/window_class.hpp b/include/cru/platform/win/window_class.hpp new file mode 100644 index 00000000..be79af13 --- /dev/null +++ b/include/cru/platform/win/window_class.hpp @@ -0,0 +1,26 @@ +#pragma once +#include "win_pre_config.hpp" + +#include "cru/common/base.hpp" + +#include <string> + +namespace cru::platform::win { +class WindowClass : public Object { + public: + WindowClass(const std::wstring& name, WNDPROC window_proc, HINSTANCE h_instance); + WindowClass(const WindowClass& other) = delete; + WindowClass(WindowClass&& other) = delete; + WindowClass& operator=(const WindowClass& other) = delete; + WindowClass& operator=(WindowClass&& other) = delete; + ~WindowClass() override = default; + + const wchar_t* GetName() const { return name_.c_str(); } + + ATOM GetAtom() const { return atom_; } + + private: + std::wstring name_; + ATOM atom_; +}; +} // namespace cru::ui |