This commit is contained in:
Nomango 2019-08-14 21:52:49 +08:00
parent 671719fb34
commit f172f10d36
50 changed files with 606 additions and 85 deletions

View File

@ -48,7 +48,7 @@
<ClInclude Include="..\src\kiwano\base\EventListener.h" />
<ClInclude Include="..\src\kiwano\base\Input.h" />
<ClInclude Include="..\src\kiwano\base\keys.hpp" />
<ClInclude Include="..\src\kiwano\base\logs.h" />
<ClInclude Include="..\src\kiwano\base\Logger.h" />
<ClInclude Include="..\src\kiwano\base\Object.h" />
<ClInclude Include="..\src\kiwano\base\RefCounter.hpp" />
<ClInclude Include="..\src\kiwano\base\Resource.h" />
@ -56,7 +56,7 @@
<ClInclude Include="..\src\kiwano\base\Timer.h" />
<ClInclude Include="..\src\kiwano\base\TimerManager.h" />
<ClInclude Include="..\src\kiwano\base\time.h" />
<ClInclude Include="..\src\kiwano\base\window.h" />
<ClInclude Include="..\src\kiwano\base\Window.h" />
<ClInclude Include="..\src\kiwano\math\constants.hpp" />
<ClInclude Include="..\src\kiwano\math\ease.hpp" />
<ClInclude Include="..\src\kiwano\math\helper.h" />
@ -76,7 +76,7 @@
<ClInclude Include="..\src\kiwano\renderer\helper.hpp" />
<ClInclude Include="..\src\kiwano\renderer\Image.h" />
<ClInclude Include="..\src\kiwano\renderer\ImageCache.h" />
<ClInclude Include="..\src\kiwano\renderer\render.h" />
<ClInclude Include="..\src\kiwano\renderer\Renderer.h" />
<ClInclude Include="..\src\kiwano\renderer\TextRenderer.h" />
<ClInclude Include="..\src\kiwano\third-party\StackWalker\StackWalker.h" />
<ClInclude Include="..\src\kiwano\third-party\tinyxml2\tinyxml2.h" />
@ -112,14 +112,14 @@
<ClCompile Include="..\src\kiwano\base\EventDispatcher.cpp" />
<ClCompile Include="..\src\kiwano\base\EventListener.cpp" />
<ClCompile Include="..\src\kiwano\base\Input.cpp" />
<ClCompile Include="..\src\kiwano\base\logs.cpp" />
<ClCompile Include="..\src\kiwano\base\Logger.cpp" />
<ClCompile Include="..\src\kiwano\base\Object.cpp" />
<ClCompile Include="..\src\kiwano\base\Resource.cpp" />
<ClCompile Include="..\src\kiwano\base\Director.cpp" />
<ClCompile Include="..\src\kiwano\base\Timer.cpp" />
<ClCompile Include="..\src\kiwano\base\TimerManager.cpp" />
<ClCompile Include="..\src\kiwano\base\time.cpp" />
<ClCompile Include="..\src\kiwano\base\window.cpp" />
<ClCompile Include="..\src\kiwano\base\Window.cpp" />
<ClCompile Include="..\src\kiwano\platform\Application.cpp" />
<ClCompile Include="..\src\kiwano\platform\modules.cpp" />
<ClCompile Include="..\src\kiwano\renderer\D2DDeviceResources.cpp" />
@ -129,7 +129,7 @@
<ClCompile Include="..\src\kiwano\renderer\GifImage.cpp" />
<ClCompile Include="..\src\kiwano\renderer\Image.cpp" />
<ClCompile Include="..\src\kiwano\renderer\ImageCache.cpp" />
<ClCompile Include="..\src\kiwano\renderer\render.cpp" />
<ClCompile Include="..\src\kiwano\renderer\Renderer.cpp" />
<ClCompile Include="..\src\kiwano\renderer\TextRenderer.cpp" />
<ClCompile Include="..\src\kiwano\third-party\StackWalker\StackWalker.cpp" />
<ClCompile Include="..\src\kiwano\third-party\tinyxml2\tinyxml2.cpp" />

View File

@ -90,9 +90,6 @@
<ClInclude Include="..\src\kiwano\base\keys.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\src\kiwano\base\logs.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\src\kiwano\base\RefCounter.hpp">
<Filter>base</Filter>
</ClInclude>
@ -114,9 +111,6 @@
<ClInclude Include="..\src\kiwano\renderer\helper.hpp">
<Filter>renderer</Filter>
</ClInclude>
<ClInclude Include="..\src\kiwano\renderer\render.h">
<Filter>renderer</Filter>
</ClInclude>
<ClInclude Include="..\src\kiwano\renderer\TextRenderer.h">
<Filter>renderer</Filter>
</ClInclude>
@ -158,9 +152,6 @@
<ClInclude Include="..\src\kiwano\base\Input.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\src\kiwano\base\window.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\src\kiwano\base\SmartPtr.hpp">
<Filter>base</Filter>
</ClInclude>
@ -288,6 +279,15 @@
<ClInclude Include="..\src\kiwano\2d\action\ActionWalk.h">
<Filter>2d\action</Filter>
</ClInclude>
<ClInclude Include="..\src\kiwano\base\Logger.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\src\kiwano\base\Window.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\src\kiwano\renderer\Renderer.h">
<Filter>renderer</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\kiwano\ui\Button.cpp">
@ -320,9 +320,6 @@
<ClCompile Include="..\src\kiwano\base\EventListener.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\src\kiwano\base\logs.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\src\kiwano\base\Resource.cpp">
<Filter>base</Filter>
</ClCompile>
@ -338,9 +335,6 @@
<ClCompile Include="..\src\kiwano\renderer\D3D11DeviceResources.cpp">
<Filter>renderer</Filter>
</ClCompile>
<ClCompile Include="..\src\kiwano\renderer\render.cpp">
<Filter>renderer</Filter>
</ClCompile>
<ClCompile Include="..\src\kiwano\renderer\TextRenderer.cpp">
<Filter>renderer</Filter>
</ClCompile>
@ -356,9 +350,6 @@
<ClCompile Include="..\src\kiwano\base\Input.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\src\kiwano\base\window.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\src\kiwano\base\Object.cpp">
<Filter>base</Filter>
</ClCompile>
@ -443,5 +434,14 @@
<ClCompile Include="..\src\kiwano\2d\action\ActionWalk.cpp">
<Filter>2d\action</Filter>
</ClCompile>
<ClCompile Include="..\src\kiwano\base\Logger.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\src\kiwano\base\Window.cpp">
<Filter>base</Filter>
</ClCompile>
<ClCompile Include="..\src\kiwano\renderer\Renderer.cpp">
<Filter>renderer</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -18,7 +18,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <kiwano/base/logs.h>
#include <kiwano/base/Logger.h>
#include <kiwano/utils/FileUtil.h>
#include "Sound.h"
#include "audio.h"

View File

@ -26,7 +26,7 @@
#include <kiwano/core/string.hpp>
#include <kiwano/base/ComPtr.hpp>
#include <kiwano/base/Resource.h>
#include <kiwano/base/logs.h>
#include <kiwano/base/Logger.h>
#include <kiwano/platform/modules.h>
#include "audio-modules.h"
#include "Transcoder.h"

View File

@ -18,7 +18,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <kiwano/base/logs.h>
#include <kiwano/base/Logger.h>
#include "audio-modules.h"
namespace kiwano

View File

@ -18,7 +18,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <kiwano/base/logs.h>
#include <kiwano/base/Logger.h>
#include "audio-modules.h"
#include "audio.h"

View File

@ -5,7 +5,7 @@
#include <kiwano/core/intrusive_ptr.hpp>
#include <kiwano/base/Window.h>
#include <kiwano/base/Input.h>
#include <kiwano/renderer/render.h>
#include <kiwano/renderer/Renderer.h>
#include "ImGuiModule.h"
#include "imgui_impl.h"

View File

@ -1,6 +1,6 @@
// dear imgui: Renderer for Kiwano (DirectX11)
#include <kiwano/base/logs.h>
#include <kiwano/base/Logger.h>
#include "imgui_impl_dx11.h"
// DirectX

View File

@ -18,7 +18,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <kiwano/base/logs.h>
#include <kiwano/base/Logger.h>
#include <kiwano/platform/Application.h>
#include "helper.h"
#include "HttpRequest.hpp"

View File

@ -20,8 +20,8 @@
#include "Actor.h"
#include "Stage.h"
#include "../base/logs.h"
#include "../renderer/render.h"
#include "../base/Logger.h"
#include "../renderer/Renderer.h"
namespace kiwano
{

View File

@ -19,8 +19,8 @@
// THE SOFTWARE.
#include "Canvas.h"
#include "../base/logs.h"
#include "../renderer/render.h"
#include "../base/Logger.h"
#include "../renderer/Renderer.h"
namespace kiwano
{

View File

@ -20,7 +20,7 @@
#include "DebugActor.h"
#include "Text.h"
#include "../renderer/render.h"
#include "../renderer/Renderer.h"
#include <sstream>
#include <psapi.h>

View File

@ -20,7 +20,7 @@
#include "FrameSequence.h"
#include "Frame.h"
#include "../base/logs.h"
#include "../base/Logger.h"
namespace kiwano
{

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "GifSprite.h"
#include "../base/logs.h"
#include "../base/Logger.h"
#include "../platform/modules.h"
namespace kiwano

View File

@ -21,7 +21,7 @@
#pragma once
#include "Actor.h"
#include "../base/Resource.h"
#include "../renderer/render.h"
#include "../renderer/Renderer.h"
#include "../renderer/GifImage.h"
namespace kiwano

View File

@ -20,7 +20,7 @@
#pragma once
#include "Layer.h"
#include "../renderer/render.h"
#include "../renderer/Renderer.h"
namespace kiwano
{

View File

@ -19,8 +19,8 @@
// THE SOFTWARE.
#include "ShapeActor.h"
#include "../base/logs.h"
#include "../renderer/render.h"
#include "../base/Logger.h"
#include "../renderer/Renderer.h"
namespace kiwano
{

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "Sprite.h"
#include "../renderer/render.h"
#include "../renderer/Renderer.h"
namespace kiwano
{

View File

@ -19,8 +19,8 @@
// THE SOFTWARE.
#include "Stage.h"
#include "../base/logs.h"
#include "../renderer/render.h"
#include "../base/Logger.h"
#include "../renderer/Renderer.h"
namespace kiwano
{

View File

@ -19,8 +19,8 @@
// THE SOFTWARE.
#include "Text.h"
#include "../base/logs.h"
#include "../renderer/render.h"
#include "../base/Logger.h"
#include "../renderer/Renderer.h"
namespace kiwano
{

View File

@ -21,9 +21,9 @@
#include "Transition.h"
#include "Actor.h"
#include "Stage.h"
#include "../base/window.h"
#include "../base/logs.h"
#include "../renderer/render.h"
#include "../base/Window.h"
#include "../base/Logger.h"
#include "../renderer/Renderer.h"
namespace kiwano
{

View File

@ -20,7 +20,7 @@
#include "ActionGroup.h"
#include "../Actor.h"
#include "../../base/logs.h"
#include "../../base/Logger.h"
namespace kiwano
{

View File

@ -20,7 +20,7 @@
#include "ActionManager.h"
#include "../Actor.h"
#include "../../base/logs.h"
#include "../../base/Logger.h"
namespace kiwano
{

View File

@ -20,7 +20,7 @@
#pragma once
#include "Action.h"
#include "../../base/logs.h"
#include "../../base/Logger.h"
namespace kiwano
{

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "EventDispatcher.h"
#include "../base/logs.h"
#include "../base/Logger.h"
namespace kiwano
{

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "input.h"
#include "logs.h"
#include "Logger.h"
#include <windowsx.h> // GET_X_LPARAM, GET_Y_LPARAM
namespace kiwano

View File

@ -18,7 +18,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include "logs.h"
#include "Logger.h"
#include <iostream>
#include <fstream>

View File

@ -27,18 +27,26 @@
#ifndef KGE_LOG
# ifdef KGE_DEBUG
# define KGE_LOG(FORMAT, ...) kiwano::Logger::GetInstance()->Messagef((FORMAT ## "\n"), __VA_ARGS__)
# define KGE_LOG(FORMAT, ...) ::kiwano::Logger::GetInstance()->Messagef((FORMAT ## "\n"), __VA_ARGS__)
# else
# define KGE_LOG __noop
# endif
#endif
#ifndef KGE_WARNING_LOG
# define KGE_WARNING_LOG(FORMAT, ...) kiwano::Logger::GetInstance()->Warningf((FORMAT ## "\n"), __VA_ARGS__)
# define KGE_WARNING_LOG(FORMAT, ...) ::kiwano::Logger::GetInstance()->Warningf((FORMAT ## "\n"), __VA_ARGS__)
#endif
#ifndef KGE_ERROR_LOG
# define KGE_ERROR_LOG(FORMAT, ...) kiwano::Logger::GetInstance()->Errorf((FORMAT ## "\n"), __VA_ARGS__)
# define KGE_ERROR_LOG(FORMAT, ...) ::kiwano::Logger::GetInstance()->Errorf((FORMAT ## "\n"), __VA_ARGS__)
#endif
#ifndef KGE_PRINT
# define KGE_PRINT(...) ::kiwano::Logger::GetInstance()->Println(__VA_ARGS__)
#endif
#ifndef KGE_PRINTF
# define KGE_PRINTF(FORMAT, ...) ::kiwano::Logger::GetInstance()->Printf((FORMAT), __VA_ARGS__)
#endif
namespace kiwano

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "Object.h"
#include "logs.h"
#include "Logger.h"
#include <typeinfo>
namespace kiwano

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "Resource.h"
#include "../base/logs.h"
#include "../base/Logger.h"
namespace kiwano
{

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "TimerManager.h"
#include "../base/logs.h"
#include "../base/Logger.h"
namespace kiwano
{

418
src/kiwano/base/Window.cpp Normal file
View File

@ -0,0 +1,418 @@
// Copyright (c) 2016-2018 Kiwano - Nomango
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include "Window.h"
#include "Logger.h"
#define WINDOW_STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
#define WINDOW_FULLSCREEN_STYLE WS_CLIPCHILDREN | WS_POPUP
#define KGE_WND_CLASS_NAME L"KiwanoAppWnd"
namespace kiwano
{
namespace
{
MONITORINFOEX GetMoniterInfoEx(HWND hwnd);
void AdjustWindow(UINT width, UINT height, DWORD style, UINT* win_width, UINT* win_height);
void ChangeFullScreenResolution(int width, int height, WCHAR* device_name);
void RestoreResolution(WCHAR* device_name);
}
Window::Window()
: handle_(nullptr)
, width_(0)
, height_(0)
, device_name_(nullptr)
, is_fullscreen_(false)
, mouse_cursor_(MouseCursor(-1))
{
}
Window::~Window()
{
if (is_fullscreen_)
RestoreResolution(device_name_);
if (device_name_)
{
delete[] device_name_;
device_name_ = nullptr;
}
if (handle_)
{
::DestroyWindow(handle_);
handle_ = nullptr;
}
}
HRESULT Window::Create(String const& title, int width, int height, LPCWSTR icon, bool fullscreen, WNDPROC proc)
{
HINSTANCE hinst = GetModuleHandleW(nullptr);
WNDCLASSEX wcex = { 0 };
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.lpszClassName = KGE_WND_CLASS_NAME;
wcex.style = CS_HREDRAW | CS_VREDRAW /* | CS_DBLCLKS */;
wcex.lpfnWndProc = proc;
wcex.hIcon = nullptr;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = sizeof(LONG_PTR);
wcex.hInstance = hinst;
wcex.hbrBackground = nullptr;
wcex.lpszMenuName = nullptr;
wcex.hCursor = nullptr;
if (icon)
{
wcex.hIcon = (HICON)::LoadImageW(hinst, icon, IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
}
::RegisterClassExW(&wcex);
// Get the nearest monitor to this window
HMONITOR monitor = ::MonitorFromPoint(POINT{ 0, 0 }, MONITOR_DEFAULTTOPRIMARY);
// Get the target monitor info
MONITORINFOEX monitor_info_ex;
memset(&monitor_info_ex, 0, sizeof(MONITORINFOEX));
monitor_info_ex.cbSize = sizeof(MONITORINFOEX);
::GetMonitorInfoW(monitor, &monitor_info_ex);
// Save the device name
int len = lstrlenW(monitor_info_ex.szDevice);
device_name_ = new WCHAR[len + 1];
lstrcpyW(device_name_, monitor_info_ex.szDevice);
int left = -1;
int top = -1;
is_fullscreen_ = fullscreen;
if (is_fullscreen_)
{
top = monitor_info_ex.rcMonitor.top;
left = monitor_info_ex.rcMonitor.left;
if (width > monitor_info_ex.rcWork.right - left)
width = monitor_info_ex.rcWork.right - left;
if (height > monitor_info_ex.rcWork.bottom - top)
height = monitor_info_ex.rcWork.bottom - top;
}
else
{
UINT screenw = monitor_info_ex.rcWork.right - monitor_info_ex.rcWork.left;
UINT screenh = monitor_info_ex.rcWork.bottom - monitor_info_ex.rcWork.top;
UINT win_width, win_height;
AdjustWindow(
width,
height,
GetWindowStyle(),
&win_width,
&win_height
);
left = monitor_info_ex.rcWork.left + (screenw - win_width) / 2;
top = monitor_info_ex.rcWork.top + (screenh - win_height) / 2;
width = win_width;
height = win_height;
}
handle_ = ::CreateWindowExW(
is_fullscreen_ ? WS_EX_TOPMOST : 0,
KGE_WND_CLASS_NAME,
title.c_str(),
GetWindowStyle(),
left,
top,
width,
height,
nullptr,
nullptr,
hinst,
nullptr
);
if (handle_ == nullptr)
{
::UnregisterClass(KGE_WND_CLASS_NAME, hinst);
return HRESULT_FROM_WIN32(GetLastError());
}
RECT rc;
GetClientRect(handle_, &rc);
width_ = rc.right - rc.left;
height_ = rc.bottom - rc.top;
SetMouseCursor(MouseCursor::Arrow);
return S_OK;
}
void Window::Prepare()
{
::ShowWindow(handle_, SW_SHOWNORMAL);
::UpdateWindow(handle_);
if (is_fullscreen_)
{
ChangeFullScreenResolution(width_, height_, device_name_);
}
}
String Window::GetTitle() const
{
if (handle_)
{
wchar_t title[256];
::GetWindowTextW(handle_, title, 256);
return title;
}
return String();
}
void Window::SetTitle(String const& title)
{
if (handle_)
::SetWindowTextW(handle_, title.c_str());
}
Size Window::GetSize() const
{
return Size{
static_cast<float>(width_),
static_cast<float>(height_)
};
}
float Window::GetWidth() const
{
return static_cast<float>(width_);
}
float Window::GetHeight() const
{
return static_cast<float>(height_);
}
void Window::SetIcon(LPCWSTR icon_resource)
{
if (handle_)
{
HINSTANCE hinstance = GetModuleHandle(nullptr);
HICON icon = (HICON)::LoadImage(
hinstance,
icon_resource,
IMAGE_ICON,
0,
0,
LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE
);
::SendMessage(handle_, WM_SETICON, ICON_BIG, (LPARAM)icon);
::SendMessage(handle_, WM_SETICON, ICON_SMALL, (LPARAM)icon);
}
}
void Window::Resize(int width, int height)
{
if (handle_ && !is_fullscreen_)
{
RECT rc = { 0, 0, int(width), int(height) };
::AdjustWindowRect(&rc, GetWindowStyle(), false);
width = rc.right - rc.left;
height = rc.bottom - rc.top;
::SetWindowPos(handle_, 0, 0, 0, width, height, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
}
}
void Window::SetFullscreen(bool fullscreen, int width, int height)
{
if (is_fullscreen_ != fullscreen || width != width_ || height != height_)
{
is_fullscreen_ = fullscreen;
if (is_fullscreen_)
{
// move window to (0, 0) before display switch
::SetWindowPos(handle_, HWND_TOPMOST, 0, 0, width_, height_, SWP_NOACTIVATE);
ChangeFullScreenResolution(width, height, device_name_);
MONITORINFOEX info = GetMoniterInfoEx(handle_);
::SetWindowLongPtr(handle_, GWL_STYLE, GetWindowStyle());
::SetWindowPos(handle_, HWND_TOPMOST, info.rcMonitor.top, info.rcMonitor.left, width, height, SWP_NOACTIVATE);
width_ = width;
height_ = height;
}
else
{
RestoreResolution(device_name_);
MONITORINFOEX info = GetMoniterInfoEx(handle_);
UINT screenw = info.rcWork.right - info.rcWork.left;
UINT screenh = info.rcWork.bottom - info.rcWork.top;
UINT win_width, win_height;
AdjustWindow(width, height, GetWindowStyle(), &win_width, &win_height);
int left = screenw > win_width ? ((screenw - win_width) / 2) : 0;
int top = screenh > win_height ? ((screenh - win_height) / 2) : 0;
::SetWindowLongPtr(handle_, GWL_STYLE, GetWindowStyle());
::SetWindowPos(handle_, HWND_NOTOPMOST, left, top, win_width, win_height, SWP_DRAWFRAME | SWP_FRAMECHANGED);
UpdateWindowRect();
}
::ShowWindow(handle_, SW_SHOWNORMAL);
}
}
void Window::SetMouseCursor(MouseCursor cursor)
{
if (mouse_cursor_ != cursor)
{
mouse_cursor_ = cursor;
LPTSTR win32_cursor = IDC_ARROW;
switch (cursor)
{
case MouseCursor::Arrow: win32_cursor = IDC_ARROW; break;
case MouseCursor::TextInput: win32_cursor = IDC_IBEAM; break;
case MouseCursor::SizeAll: win32_cursor = IDC_SIZEALL; break;
case MouseCursor::SizeWE: win32_cursor = IDC_SIZEWE; break;
case MouseCursor::SizeNS: win32_cursor = IDC_SIZENS; break;
case MouseCursor::SizeNESW: win32_cursor = IDC_SIZENESW; break;
case MouseCursor::SizeNWSE: win32_cursor = IDC_SIZENWSE; break;
case MouseCursor::Hand: win32_cursor = IDC_HAND; break;
}
::SetCursor(::LoadCursorW(nullptr, win32_cursor));
}
}
HWND Window::GetHandle() const
{
return handle_;
}
DWORD Window::GetWindowStyle() const
{
return is_fullscreen_ ? (WINDOW_FULLSCREEN_STYLE) : (WINDOW_STYLE);
}
void Window::UpdateWindowRect()
{
if (!handle_)
return;
RECT rc;
::GetClientRect(handle_, &rc);
width_ = rc.right - rc.left;
height_ = rc.bottom - rc.top;
}
void Window::SetActive(bool actived)
{
if (!handle_)
return;
if (is_fullscreen_)
{
if (actived)
{
ChangeFullScreenResolution(width_, height_, device_name_);
MONITORINFOEX info = GetMoniterInfoEx(handle_);
::SetWindowPos(handle_, HWND_TOPMOST, info.rcMonitor.top, info.rcMonitor.left, width_, height_, SWP_NOACTIVATE);
}
else
{
RestoreResolution(device_name_);
::SetWindowPos(handle_, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
::ShowWindow(handle_, SW_MINIMIZE);
}
}
}
namespace
{
MONITORINFOEX GetMoniterInfoEx(HWND hwnd)
{
HMONITOR monitor = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
MONITORINFOEX monitor_info;
memset(&monitor_info, 0, sizeof(MONITORINFOEX));
monitor_info.cbSize = sizeof(MONITORINFOEX);
::GetMonitorInfoW(monitor, &monitor_info);
return monitor_info;
}
void AdjustWindow(UINT width, UINT height, DWORD style, UINT* win_width, UINT* win_height)
{
RECT rc;
::SetRect(&rc, 0, 0, (int)width, (int)height);
::AdjustWindowRect(&rc, style, false);
*win_width = rc.right - rc.left;
*win_height = rc.bottom - rc.top;
MONITORINFOEX info = GetMoniterInfoEx(NULL);
UINT screenw = info.rcWork.right - info.rcWork.left;
UINT screenh = info.rcWork.bottom - info.rcWork.top;
if (*win_width > screenw)
*win_width = screenw;
if (*win_height > screenh)
*win_height = screenh;
}
void ChangeFullScreenResolution(int width, int height, WCHAR* device_name)
{
DEVMODE mode;
memset(&mode, 0, sizeof(mode));
mode.dmSize = sizeof(DEVMODE);
mode.dmBitsPerPel = ::GetDeviceCaps(::GetDC(0), BITSPIXEL);;
mode.dmPelsWidth = width;
mode.dmPelsHeight = height;
mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
if (::ChangeDisplaySettingsExW(device_name, &mode, NULL, CDS_FULLSCREEN, NULL) != DISP_CHANGE_SUCCESSFUL)
KGE_ERROR_LOG(L"ChangeDisplaySettings failed");
}
void RestoreResolution(WCHAR* device_name)
{
::ChangeDisplaySettingsExW(device_name, NULL, NULL, 0, NULL);
}
}
}

95
src/kiwano/base/Window.h Normal file
View File

@ -0,0 +1,95 @@
// Copyright (c) 2016-2018 Kiwano - Nomango
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#pragma once
#include "../macros.h"
#include "../core/core.h"
#include "../math/helper.h"
#include "types.h"
namespace kiwano
{
class KGE_API Window
: public Singleton<Window>
{
KGE_DECLARE_SINGLETON(Window);
public:
// 获取标题
String GetTitle() const;
// 获取窗口大小
Size GetSize() const;
// 获取窗口宽度
float GetWidth() const;
// 获取窗口高度
float GetHeight() const;
// 设置标题
void SetTitle(String const& title);
// 设置窗口图标
void SetIcon(LPCWSTR icon_resource);
// 重设窗口大小
void Resize(int width, int height);
// 设置全屏模式
void SetFullscreen(bool fullscreen, int width, int height);
// 设置鼠标指针
void SetMouseCursor(MouseCursor cursor);
public:
HRESULT Create(
String const& title,
int width,
int height,
LPCWSTR icon,
bool fullscreen,
WNDPROC proc
);
void Prepare();
HWND GetHandle() const;
DWORD GetWindowStyle() const;
void UpdateWindowRect();
void SetActive(bool actived);
protected:
Window();
~Window();
private:
HWND handle_;
bool is_fullscreen_;
int width_;
int height_;
WCHAR* device_name_;
MouseCursor mouse_cursor_;
};
}

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "time.h"
#include "logs.h"
#include "Logger.h"
#include <regex>
#include <unordered_map>

View File

@ -59,15 +59,15 @@
// base
//
#include "renderer/render.h"
#include "renderer/Renderer.h"
#include "renderer/Image.h"
#include "renderer/GifImage.h"
#include "base/time.h"
#include "base/window.h"
#include "base/Window.h"
#include "base/input.h"
#include "base/Director.h"
#include "base/logs.h"
#include "base/Logger.h"
#include "base/SmartPtr.hpp"
#include "base/ComPtr.hpp"

View File

@ -20,11 +20,11 @@
#include "Application.h"
#include "modules.h"
#include "../base/window.h"
#include "../base/logs.h"
#include "../base/Window.h"
#include "../base/Logger.h"
#include "../base/input.h"
#include "../base/Director.h"
#include "../renderer/render.h"
#include "../renderer/Renderer.h"
#include "../utils/ResourceCache.h"
#include <windowsx.h> // GET_X_LPARAM, GET_Y_LPARAM
#include <imm.h> // ImmAssociateContext

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "modules.h"
#include "../base/logs.h"
#include "../base/Logger.h"
namespace kiwano
{

View File

@ -20,7 +20,7 @@
#include "D2DDeviceResources.h"
#include "ImageCache.h"
#include "../base/logs.h"
#include "../base/Logger.h"
#include "../utils/FileUtil.h"
#pragma comment(lib, "d2d1.lib")

View File

@ -20,7 +20,7 @@
#include "D3D10DeviceResources.h"
#include "../base/logs.h"
#include "../base/Logger.h"
#pragma comment(lib, "d3d10_1.lib")

View File

@ -20,7 +20,7 @@
#include "D3D11DeviceResources.h"
#include "../base/logs.h"
#include "../base/Logger.h"
#include <versionhelpers.h> // IsWindows10OrGreater
#pragma comment(lib, "d3d11.lib")

View File

@ -19,8 +19,8 @@
// THE SOFTWARE.
#include "Geometry.h"
#include "render.h"
#include "../base/logs.h"
#include "Renderer.h"
#include "../base/Logger.h"
namespace kiwano
{

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "GifImage.h"
#include "../base/logs.h"
#include "../base/Logger.h"
#include "../utils/FileUtil.h"
namespace kiwano

View File

@ -20,7 +20,7 @@
#pragma once
#include "../base/Resource.h"
#include "render.h"
#include "Renderer.h"
namespace kiwano
{

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "Image.h"
#include "../base/logs.h"
#include "../base/Logger.h"
#include "../platform/modules.h"
namespace kiwano

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "ImageCache.h"
#include "../base/logs.h"
#include "../base/Logger.h"
namespace kiwano
{

View File

@ -20,7 +20,7 @@
#pragma once
#include "../core/singleton.hpp"
#include "render.h"
#include "Renderer.h"
namespace kiwano
{

View File

@ -18,9 +18,9 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include "render.h"
#include "../base/logs.h"
#include "../base/window.h"
#include "Renderer.h"
#include "../base/Logger.h"
#include "../base/Window.h"
namespace kiwano
{

View File

@ -20,7 +20,7 @@
#include "Button.h"
#include "../2d/Stage.h"
#include "../base/window.h"
#include "../base/Window.h"
namespace kiwano
{

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#include "ResourceCache.h"
#include "../base/logs.h"
#include "../base/Logger.h"
#include "../2d/Frame.h"
#include "../2d/FrameSequence.h"
#include "../renderer/GifImage.h"