Guest User

Untitled

a guest
Jun 22nd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.35 KB | None | 0 0
  1. // just build with: cl Win32DirectWrite.cpp
  2.  
  3. #include <windows.h>
  4. #include <windowsx.h>
  5. #include <commctrl.h>
  6. #include <d2d1.h>
  7. #include <d2d1helper.h>
  8. #include <dwrite.h>
  9.  
  10. #pragma comment(lib, "user32.lib")
  11. #pragma comment(lib, "gdi32.lib")
  12. #pragma comment(lib, "comctl32.lib")
  13. #pragma comment(lib, "d2d1.lib")
  14. #pragma comment(lib, "dwrite.lib")
  15.  
  16. // Include the v6 common controls in the manifest
  17. #pragma comment(linker, \
  18. "\"/manifestdependency:type='Win32' "\
  19. "name='Microsoft.Windows.Common-Controls' "\
  20. "version='6.0.0.0' "\
  21. "processorArchitecture='*' "\
  22. "publicKeyToken='6595b64144ccf1df' "\
  23. "language='*'\"")
  24.  
  25. DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
  26.  
  27. #define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
  28. #define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2)
  29. #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3)
  30. #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-3)
  31. typedef DPI_AWARENESS_CONTEXT (WINAPI * SetThreadDpiAwarenessContextProc)(DPI_AWARENESS_CONTEXT);
  32.  
  33. HWND CreateMainWindow(HINSTANCE hInstance);
  34. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  35.  
  36. INT WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ INT nCmdShow) {
  37. // Initialize the common controls
  38. INITCOMMONCONTROLSEX icex;
  39. ZeroMemory(&icex, sizeof(icex));
  40. icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
  41. icex.dwICC = ICC_WIN95_CLASSES;
  42. InitCommonControlsEx(&icex);
  43.  
  44. SetThreadDpiAwarenessContextProc SetThreadDpiAwarenessContext;
  45. HMODULE hUser32 = GetModuleHandleW(L"user32");
  46. if (hUser32) {
  47. // EnableNonClientDpiScaling = (EnableNonClientDpiScalingProc)GetProcAddress(hUser32, "EnableNonClientDpiScaling");
  48. SetThreadDpiAwarenessContext = (SetThreadDpiAwarenessContextProc)GetProcAddress(hUser32, "SetThreadDpiAwarenessContext");
  49. }
  50. if (SetThreadDpiAwarenessContext) {
  51. DPI_AWARENESS_CONTEXT previousDpiContext = SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
  52. }
  53.  
  54. HWND hwnd = CreateMainWindow(hInstance);
  55. if (hwnd == 0) {
  56. return 1;
  57. }
  58.  
  59. ShowWindow(hwnd, nCmdShow);
  60.  
  61. // Run the message loop.
  62. MSG msg;
  63. while (GetMessage(&msg, NULL, 0, 0)) {
  64. TranslateMessage(&msg);
  65. DispatchMessage(&msg);
  66. }
  67.  
  68. return 0;
  69. }
  70.  
  71. HWND CreateMainWindow(HINSTANCE hInstance) {
  72. // Register the window class.
  73. LPCTSTR CLASS_NAME = "Window Class";
  74.  
  75. WNDCLASS wc;
  76. ZeroMemory(&wc, sizeof(wc));
  77. wc.lpfnWndProc = WindowProc;
  78. wc.hInstance = hInstance;
  79. wc.lpszClassName = CLASS_NAME;
  80.  
  81. RegisterClass(&wc);
  82.  
  83. // Create the window.
  84. return CreateWindowEx(0, CLASS_NAME, "Application",
  85. WS_OVERLAPPEDWINDOW,
  86. CW_USEDEFAULT, CW_USEDEFAULT,
  87. 400, 300,
  88. //CW_USEDEFAULT, CW_USEDEFAULT,
  89. NULL, NULL, hInstance, NULL);
  90. };
  91.  
  92. BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
  93. void OnPaint(HWND hwnd);
  94. void OnSize(HWND hwnd, UINT state, int cx, int cy);
  95. void OnDestroy(HWND hwnd);
  96. void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
  97.  
  98. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  99. switch (uMsg) {
  100. HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
  101. HANDLE_MSG(hwnd, WM_PAINT, OnPaint);
  102. HANDLE_MSG(hwnd, WM_SIZE, OnSize);
  103. HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);
  104. HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
  105. case WM_ERASEBKGND:
  106. return 1;
  107. }
  108. return DefWindowProc(hwnd, uMsg, wParam, lParam);
  109. }
  110.  
  111. static ID2D1Factory* pD2DFactory = NULL;
  112. static IDWriteFactory* pDWriteFactory = NULL;
  113. static IDWriteTextFormat* pTextFormat = NULL;
  114. static ID2D1HwndRenderTarget* pRT = NULL;
  115. static ID2D1SolidColorBrush* pBlackBrush = NULL;
  116. static IDWriteRenderingParams* pDefaultRenderingParams = NULL;
  117. static IDWriteRenderingParams* pGDIClassicRenderingParams = NULL;
  118. static IDWriteRenderingParams* pGDINaturalRenderingParams = NULL;
  119. static IDWriteRenderingParams* pNaturalRenderingParams = NULL;
  120. static IDWriteRenderingParams* p2xContrastRenderingParams = NULL;
  121. static IDWriteRenderingParams* p05xContrastRenderingParams = NULL;
  122. static IDWriteRenderingParams* p05xGammaRenderingParams = NULL;
  123. static IDWriteRenderingParams* p2xGammaRenderingParams = NULL;
  124.  
  125. static wchar_t* wszText = _wcsdup(L"1. m_pRenderTarget->DrawText(\"Hello World\");");
  126. //static const wchar_t* wszText = L"SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)";
  127. UINT32 cTextLength = (UINT32)wcslen(wszText);
  128.  
  129. template <class T> void SafeRelease(T **ppT) {
  130. if (*ppT) {
  131. (*ppT)->Release();
  132. *ppT = NULL;
  133. }
  134. }
  135.  
  136. BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) {
  137. RECT rc;
  138. GetClientRect(hwnd, &rc);
  139. D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);
  140.  
  141. if (!SUCCEEDED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,
  142. &pD2DFactory)) ||
  143. !SUCCEEDED(DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
  144. __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&pDWriteFactory))) ||
  145. !SUCCEEDED(pDWriteFactory->CreateTextFormat(
  146. L"Consolas", // Font family name.
  147. NULL, // Font collection (NULL sets it to use the system font collection).
  148. DWRITE_FONT_WEIGHT_REGULAR,
  149. DWRITE_FONT_STYLE_NORMAL,
  150. DWRITE_FONT_STRETCH_NORMAL,
  151. 11.0f, // 9.0f * 96.0f / 72.0f,
  152. L"en-us",
  153. &pTextFormat)) ||
  154. //!SUCCEEDED(pTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER)) ||
  155. //!SUCCEEDED(pTextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER)) ||
  156. !SUCCEEDED(pD2DFactory->CreateHwndRenderTarget(
  157. D2D1::RenderTargetProperties(),
  158. D2D1::HwndRenderTargetProperties(
  159. hwnd,
  160. size),
  161. &pRT)) ||
  162. !SUCCEEDED(pDWriteFactory->CreateRenderingParams(&pDefaultRenderingParams)) ||
  163. !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
  164. pDefaultRenderingParams->GetGamma(),
  165. pDefaultRenderingParams->GetEnhancedContrast(),
  166. pDefaultRenderingParams->GetClearTypeLevel(),
  167. pDefaultRenderingParams->GetPixelGeometry(),
  168. DWRITE_RENDERING_MODE_GDI_CLASSIC,
  169. &pGDIClassicRenderingParams)) ||
  170. !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
  171. pDefaultRenderingParams->GetGamma(),
  172. pDefaultRenderingParams->GetEnhancedContrast(),
  173. pDefaultRenderingParams->GetClearTypeLevel(),
  174. pDefaultRenderingParams->GetPixelGeometry(),
  175. DWRITE_RENDERING_MODE_GDI_NATURAL,
  176. &pGDINaturalRenderingParams)) ||
  177. !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
  178. pDefaultRenderingParams->GetGamma(),
  179. pDefaultRenderingParams->GetEnhancedContrast(),
  180. pDefaultRenderingParams->GetClearTypeLevel(),
  181. pDefaultRenderingParams->GetPixelGeometry(),
  182. DWRITE_RENDERING_MODE_NATURAL,
  183. &pNaturalRenderingParams)) ||
  184. !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
  185. pDefaultRenderingParams->GetGamma(),
  186. pDefaultRenderingParams->GetEnhancedContrast() * 2.0f,
  187. pDefaultRenderingParams->GetClearTypeLevel(),
  188. pDefaultRenderingParams->GetPixelGeometry(),
  189. DWRITE_RENDERING_MODE_NATURAL,
  190. &p2xContrastRenderingParams)) ||
  191. !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
  192. pDefaultRenderingParams->GetGamma(),
  193. pDefaultRenderingParams->GetEnhancedContrast() * 0.5f,
  194. pDefaultRenderingParams->GetClearTypeLevel(),
  195. pDefaultRenderingParams->GetPixelGeometry(),
  196. DWRITE_RENDERING_MODE_NATURAL,
  197. &p05xContrastRenderingParams)) ||
  198. !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
  199. pDefaultRenderingParams->GetGamma() * 0.5f,
  200. pDefaultRenderingParams->GetEnhancedContrast(),
  201. pDefaultRenderingParams->GetClearTypeLevel(),
  202. pDefaultRenderingParams->GetPixelGeometry(),
  203. DWRITE_RENDERING_MODE_NATURAL,
  204. &p05xGammaRenderingParams)) ||
  205. !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
  206. pDefaultRenderingParams->GetGamma() * 2.0f,
  207. pDefaultRenderingParams->GetEnhancedContrast(),
  208. pDefaultRenderingParams->GetClearTypeLevel(),
  209. pDefaultRenderingParams->GetPixelGeometry(),
  210. DWRITE_RENDERING_MODE_NATURAL,
  211. &p2xGammaRenderingParams)) ||
  212. !SUCCEEDED(pRT->CreateSolidColorBrush(
  213. D2D1::ColorF(D2D1::ColorF::Black),
  214. &pBlackBrush))) {
  215. MessageBox(NULL,
  216. "OnCreate failed.",
  217. "OnCreate Error", MB_ICONERROR);
  218. return FALSE;
  219. }
  220. return TRUE;
  221. }
  222.  
  223. void OnPaintHDC(HWND hwnd) {
  224. PAINTSTRUCT ps;
  225. HDC hdc = BeginPaint(hwnd, &ps);
  226. //FillRect(hdc, &ps.rcPaint, (HBRUSH)GetStockObject(BLACK_BRUSH));
  227. FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW+1));
  228. EndPaint(hwnd, &ps);
  229. }
  230.  
  231. void OnPaint(HWND hwnd) {
  232. RECT rc;
  233. GetClientRect(hwnd, &rc);
  234. FLOAT dpiScaleX = 1.0f;
  235. FLOAT dpiScaleY = 1.0f;
  236. D2D1_RECT_F layoutRect = D2D1::RectF(
  237. static_cast<FLOAT>(rc.left) / dpiScaleX,
  238. static_cast<FLOAT>(rc.top) / dpiScaleY,
  239. static_cast<FLOAT>(rc.right - rc.left) / dpiScaleX,
  240. static_cast<FLOAT>(rc.bottom - rc.top) / dpiScaleY
  241. );
  242. pRT->BeginDraw();
  243. pRT->SetTransform(D2D1::IdentityMatrix());
  244. pRT->Clear(D2D1::ColorF(D2D1::ColorF::White));
  245.  
  246. wszText[0] = L'1';
  247. pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 10.0f)));
  248. pRT->SetTextRenderingParams(pDefaultRenderingParams);
  249. pRT->DrawText(
  250. wszText, // The string to render.
  251. cTextLength, // The string's length.
  252. pTextFormat, // The text format.
  253. layoutRect, // The region of the window where the text will be rendered.
  254. pBlackBrush // The brush used to draw the text.
  255. );
  256.  
  257. wszText[0] = L'2';
  258. pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 30.0f)));
  259. pRT->SetTextRenderingParams(pGDIClassicRenderingParams);
  260. pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
  261. D2D1_DRAW_TEXT_OPTIONS_NONE,
  262. DWRITE_MEASURING_MODE_GDI_CLASSIC
  263. );
  264.  
  265. wszText[0] = L'3';
  266. pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 50.0f)));
  267. pRT->SetTextRenderingParams(pGDINaturalRenderingParams);
  268. pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
  269. D2D1_DRAW_TEXT_OPTIONS_NONE,
  270. DWRITE_MEASURING_MODE_GDI_NATURAL
  271. );
  272.  
  273. wszText[0] = L'4';
  274. pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 70.0f)));
  275. pRT->SetTextRenderingParams(pGDINaturalRenderingParams);
  276. pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
  277. D2D1_DRAW_TEXT_OPTIONS_NONE,
  278. DWRITE_MEASURING_MODE_NATURAL
  279. );
  280.  
  281. wszText[0] = L'5';
  282. pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 90.0f)));
  283. pRT->SetTextRenderingParams(p05xContrastRenderingParams);
  284. pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
  285. D2D1_DRAW_TEXT_OPTIONS_NONE,
  286. DWRITE_MEASURING_MODE_NATURAL
  287. );
  288.  
  289. wszText[0] = L'6';
  290. pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 110.0f)));
  291. pRT->SetTextRenderingParams(p05xContrastRenderingParams);
  292. pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
  293. D2D1_DRAW_TEXT_OPTIONS_NONE,
  294. DWRITE_MEASURING_MODE_GDI_CLASSIC
  295. );
  296.  
  297. wszText[0] = L'7';
  298. pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 130.0f)));
  299. pRT->SetTextRenderingParams(p2xContrastRenderingParams);
  300. pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
  301. D2D1_DRAW_TEXT_OPTIONS_NONE,
  302. DWRITE_MEASURING_MODE_GDI_CLASSIC
  303. );
  304.  
  305. wszText[0] = L'8';
  306. pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 150.0f)));
  307. pRT->SetTextRenderingParams(p2xGammaRenderingParams);
  308. pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
  309. D2D1_DRAW_TEXT_OPTIONS_NONE,
  310. DWRITE_MEASURING_MODE_GDI_CLASSIC
  311. );
  312.  
  313. wszText[0] = L'9';
  314. pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 170.0f)));
  315. pRT->SetTextRenderingParams(p05xGammaRenderingParams);
  316. pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
  317. D2D1_DRAW_TEXT_OPTIONS_NONE,
  318. DWRITE_MEASURING_MODE_GDI_CLASSIC
  319. );
  320.  
  321. pRT->EndDraw();
  322. }
  323.  
  324. void OnDestroy(HWND hwnd) {
  325. PostQuitMessage(0);
  326. SafeRelease(&pBlackBrush);
  327. SafeRelease(&p2xGammaRenderingParams);
  328. SafeRelease(&p05xGammaRenderingParams);
  329. SafeRelease(&p05xContrastRenderingParams);
  330. SafeRelease(&p2xContrastRenderingParams);
  331. SafeRelease(&pNaturalRenderingParams);
  332. SafeRelease(&pGDINaturalRenderingParams);
  333. SafeRelease(&pGDIClassicRenderingParams);
  334. SafeRelease(&pDefaultRenderingParams);
  335. SafeRelease(&pRT);
  336. SafeRelease(&pTextFormat);
  337. SafeRelease(&pDWriteFactory);
  338. SafeRelease(&pD2DFactory);
  339. }
  340.  
  341. void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) {
  342. switch (id) {}
  343. }
  344.  
  345. void OnSize(HWND hwnd, UINT state, int cx, int cy) {
  346. if (state == SIZE_RESTORED || state == SIZE_MAXIMIZED) {}
  347. }
Add Comment
Please, Sign In to add comment