Magic_Game/core/Win/winbase.cpp

137 lines
2.9 KiB
C++
Raw Normal View History

2017-10-10 01:14:03 +08:00
#include "winbase.h"
2017-10-17 21:22:25 +08:00
static HWND s_HWnd = nullptr;
static ID2D1Factory * s_pDirect2dFactory = nullptr;
static ID2D1HwndRenderTarget * s_pRenderTarget = nullptr;
static ID2D1SolidColorBrush * s_pSolidBrush = nullptr;
static IWICImagingFactory * s_pIWICFactory = nullptr;
static IDWriteFactory * s_pDWriteFactory = nullptr;
2017-12-15 21:51:07 +08:00
static LARGE_INTEGER s_tNow;
static LARGE_INTEGER s_tFreq;
2017-10-10 01:14:03 +08:00
2017-10-12 02:44:44 +08:00
HWND &GetHWnd()
2017-10-10 01:14:03 +08:00
{
2017-10-17 21:22:25 +08:00
return s_HWnd;
2017-10-10 01:14:03 +08:00
}
2017-10-12 02:44:44 +08:00
ID2D1Factory * &GetFactory()
2017-10-10 01:14:03 +08:00
{
2017-10-31 17:19:13 +08:00
if (!s_pDirect2dFactory)
{
2017-10-31 17:19:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD><DEB9><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ںͳ<DABA><CDB3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͬ
HRESULT hr = S_OK;
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> Direct2D <20><><EFBFBD><EFBFBD>
hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &s_pDirect2dFactory);
ASSERT(SUCCEEDED(hr), "Create Device Independent Resources Failed!");
}
2017-10-31 17:19:13 +08:00
return s_pDirect2dFactory;
}
2017-10-12 02:44:44 +08:00
ID2D1HwndRenderTarget * &GetRenderTarget()
2017-10-11 11:15:17 +08:00
{
2017-10-17 21:22:25 +08:00
if (!s_pRenderTarget)
{
2017-10-31 17:19:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9>ԴӦ<D4B4><D3A6> Direct3D <20><EFBFBD><E8B1B8>ʧʱ<CAA7>ؽ<EFBFBD><D8BD><EFBFBD>
// <20><><EFBFBD>統 isVisiable <20><><EFBFBD>޸ģ<DEB8><C4A3>ȵ<EFBFBD>
RECT rc;
2017-10-31 17:19:13 +08:00
GetClientRect(GetHWnd(), &rc);
D2D1_SIZE_U size = D2D1::SizeU(
rc.right - rc.left,
rc.bottom - rc.top
);
2017-10-31 17:19:13 +08:00
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> Direct2D <20><>ȾĿ<C8BE><C4BF>
HRESULT hr;
hr = GetFactory()->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
2017-10-31 17:19:13 +08:00
D2D1::HwndRenderTargetProperties(
GetHWnd(),
size),
2017-10-17 21:22:25 +08:00
&s_pRenderTarget
);
2017-10-31 17:19:13 +08:00
ASSERT(SUCCEEDED(hr), "Create Render Target Failed! Maybe you should initalize EApp first.");
}
2017-10-17 21:22:25 +08:00
return s_pRenderTarget;
2017-10-11 11:15:17 +08:00
}
2017-10-31 17:19:13 +08:00
IWICImagingFactory * &GetImagingFactory()
{
if (!s_pIWICFactory)
{
// <20><><EFBFBD><EFBFBD> WIC <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>ʽ<EFBFBD><CABD>ͼƬ
HRESULT hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
reinterpret_cast<void**>(&s_pIWICFactory)
);
ASSERT(SUCCEEDED(hr), "Create WICImagingFactory Failed!");
}
return s_pIWICFactory;
}
IDWriteFactory * &GetDirectWriteFactory()
{
if (!s_pDWriteFactory)
{
2017-10-31 17:19:13 +08:00
// <20><><EFBFBD><EFBFBD> DirectWrite <20><><EFBFBD><EFBFBD>
HRESULT hr = DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory),
reinterpret_cast<IUnknown**>(&s_pDWriteFactory)
);
ASSERT(SUCCEEDED(hr), "Create DirectWrite Factory Failed!");
}
return s_pDWriteFactory;
}
ID2D1SolidColorBrush * &GetSolidColorBrush()
2017-10-14 18:43:32 +08:00
{
2017-10-17 21:22:25 +08:00
if (!s_pSolidBrush)
2017-10-15 02:46:24 +08:00
{
HRESULT hr;
hr = GetRenderTarget()->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::White),
&s_pSolidBrush
);
ASSERT(SUCCEEDED(hr), "Create Solid Color Brush Failed!");
2017-10-15 02:46:24 +08:00
}
2017-10-17 21:22:25 +08:00
return s_pSolidBrush;
2017-10-14 18:43:32 +08:00
}
2017-12-15 21:51:07 +08:00
LARGE_INTEGER &GetFreq()
{
if (s_tFreq.QuadPart == 0)
{
QueryPerformanceFrequency(&s_tFreq); // <20><>ȡʱ<C8A1><CAB1>Ƶ<EFBFBD><C6B5>
}
return s_tFreq;
}
LARGE_INTEGER &GetNow()
2017-10-17 21:22:25 +08:00
{
return s_tNow;
}
2017-12-15 21:51:07 +08:00
bool IsIntervalFull(const LARGE_INTEGER& tLast, const LARGE_INTEGER& tInterval)
{
return (s_tNow.QuadPart - tLast.QuadPart) >= tInterval.QuadPart;
}
LONGLONG ToMilliseconds(LONGLONG tLast)
{
return tLast * 1000LL / GetFreq().QuadPart;
}
void SetInterval(LARGE_INTEGER& nInterval, LONGLONG nIntervalMS)
2017-10-17 21:22:25 +08:00
{
2017-12-15 21:51:07 +08:00
nInterval.QuadPart = static_cast<LONGLONG>(GetFreq().QuadPart * nIntervalMS / 1000.0);
}