| 
									
										
										
										
											2017-10-10 01:14:03 +08:00
										 |  |  |  | #include "winbase.h"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 21:22:25 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-18 22:13:20 +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-15 23:58:39 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											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-15 23:58:39 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | 	return s_pDirect2dFactory; | 
					
						
							| 
									
										
										
										
											2017-10-15 23:58:39 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-15 23:58:39 +08:00
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											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>
 | 
					
						
							| 
									
										
										
										
											2017-10-15 23:58:39 +08:00
										 |  |  |  | 		RECT rc; | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | 		GetClientRect(GetHWnd(), &rc); | 
					
						
							| 
									
										
										
										
											2017-10-15 23:58:39 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 		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>
 | 
					
						
							| 
									
										
										
										
											2017-10-15 23:58:39 +08:00
										 |  |  |  | 		HRESULT hr; | 
					
						
							| 
									
										
										
										
											2017-10-20 00:59:26 +08:00
										 |  |  |  | 		hr = GetFactory()->CreateHwndRenderTarget( | 
					
						
							| 
									
										
										
										
											2017-10-15 23:58:39 +08:00
										 |  |  |  | 			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-15 23:58:39 +08:00
										 |  |  |  | 		); | 
					
						
							|  |  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | 		ASSERT(SUCCEEDED(hr), "Create Render Target Failed! Maybe you should initalize EApp first."); | 
					
						
							| 
									
										
										
										
											2017-10-15 23:58:39 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-18 22:13:20 +08:00
										 |  |  |  | IDWriteFactory * &GetDirectWriteFactory() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	if (!s_pDWriteFactory) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-31 17:19:13 +08:00
										 |  |  |  | 		// <20><><EFBFBD><EFBFBD> DirectWrite <20><><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		HRESULT hr = DWriteCreateFactory( | 
					
						
							| 
									
										
										
										
											2017-10-18 22:13:20 +08:00
										 |  |  |  | 			DWRITE_FACTORY_TYPE_SHARED, | 
					
						
							|  |  |  |  | 			__uuidof(IDWriteFactory), | 
					
						
							|  |  |  |  | 			reinterpret_cast<IUnknown**>(&s_pDWriteFactory) | 
					
						
							|  |  |  |  | 		); | 
					
						
							|  |  |  |  | 		ASSERT(SUCCEEDED(hr), "Create DirectWrite Factory Failed!"); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	return s_pDWriteFactory; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-15 23:58:39 +08:00
										 |  |  |  | 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
										 |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-20 00:59:26 +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); | 
					
						
							|  |  |  |  | } |