Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // just build with: cl Win32DirectWrite.cpp
- #include <windows.h>
- #include <windowsx.h>
- #include <commctrl.h>
- #include <d2d1.h>
- #include <d2d1helper.h>
- #include <dwrite.h>
- #pragma comment(lib, "user32.lib")
- #pragma comment(lib, "gdi32.lib")
- #pragma comment(lib, "comctl32.lib")
- #pragma comment(lib, "d2d1.lib")
- #pragma comment(lib, "dwrite.lib")
- // Include the v6 common controls in the manifest
- #pragma comment(linker, \
- "\"/manifestdependency:type='Win32' "\
- "name='Microsoft.Windows.Common-Controls' "\
- "version='6.0.0.0' "\
- "processorArchitecture='*' "\
- "publicKeyToken='6595b64144ccf1df' "\
- "language='*'\"")
- DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
- #define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
- #define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2)
- #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3)
- #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-3)
- typedef DPI_AWARENESS_CONTEXT (WINAPI * SetThreadDpiAwarenessContextProc)(DPI_AWARENESS_CONTEXT);
- HWND CreateMainWindow(HINSTANCE hInstance);
- LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
- INT WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ INT nCmdShow) {
- // Initialize the common controls
- INITCOMMONCONTROLSEX icex;
- ZeroMemory(&icex, sizeof(icex));
- icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
- icex.dwICC = ICC_WIN95_CLASSES;
- InitCommonControlsEx(&icex);
- SetThreadDpiAwarenessContextProc SetThreadDpiAwarenessContext;
- HMODULE hUser32 = GetModuleHandleW(L"user32");
- if (hUser32) {
- // EnableNonClientDpiScaling = (EnableNonClientDpiScalingProc)GetProcAddress(hUser32, "EnableNonClientDpiScaling");
- SetThreadDpiAwarenessContext = (SetThreadDpiAwarenessContextProc)GetProcAddress(hUser32, "SetThreadDpiAwarenessContext");
- }
- if (SetThreadDpiAwarenessContext) {
- DPI_AWARENESS_CONTEXT previousDpiContext = SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
- }
- HWND hwnd = CreateMainWindow(hInstance);
- if (hwnd == 0) {
- return 1;
- }
- ShowWindow(hwnd, nCmdShow);
- // Run the message loop.
- MSG msg;
- while (GetMessage(&msg, NULL, 0, 0)) {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return 0;
- }
- HWND CreateMainWindow(HINSTANCE hInstance) {
- // Register the window class.
- LPCTSTR CLASS_NAME = "Window Class";
- WNDCLASS wc;
- ZeroMemory(&wc, sizeof(wc));
- wc.lpfnWndProc = WindowProc;
- wc.hInstance = hInstance;
- wc.lpszClassName = CLASS_NAME;
- RegisterClass(&wc);
- // Create the window.
- return CreateWindowEx(0, CLASS_NAME, "Application",
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, CW_USEDEFAULT,
- 400, 300,
- //CW_USEDEFAULT, CW_USEDEFAULT,
- NULL, NULL, hInstance, NULL);
- };
- BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
- void OnPaint(HWND hwnd);
- void OnSize(HWND hwnd, UINT state, int cx, int cy);
- void OnDestroy(HWND hwnd);
- void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
- LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- switch (uMsg) {
- HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
- HANDLE_MSG(hwnd, WM_PAINT, OnPaint);
- HANDLE_MSG(hwnd, WM_SIZE, OnSize);
- HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);
- HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
- case WM_ERASEBKGND:
- return 1;
- }
- return DefWindowProc(hwnd, uMsg, wParam, lParam);
- }
- static ID2D1Factory* pD2DFactory = NULL;
- static IDWriteFactory* pDWriteFactory = NULL;
- static IDWriteTextFormat* pTextFormat = NULL;
- static ID2D1HwndRenderTarget* pRT = NULL;
- static ID2D1SolidColorBrush* pBlackBrush = NULL;
- static IDWriteRenderingParams* pDefaultRenderingParams = NULL;
- static IDWriteRenderingParams* pGDIClassicRenderingParams = NULL;
- static IDWriteRenderingParams* pGDINaturalRenderingParams = NULL;
- static IDWriteRenderingParams* pNaturalRenderingParams = NULL;
- static IDWriteRenderingParams* p2xContrastRenderingParams = NULL;
- static IDWriteRenderingParams* p05xContrastRenderingParams = NULL;
- static IDWriteRenderingParams* p05xGammaRenderingParams = NULL;
- static IDWriteRenderingParams* p2xGammaRenderingParams = NULL;
- static wchar_t* wszText = _wcsdup(L"1. m_pRenderTarget->DrawText(\"Hello World\");");
- //static const wchar_t* wszText = L"SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)";
- UINT32 cTextLength = (UINT32)wcslen(wszText);
- template <class T> void SafeRelease(T **ppT) {
- if (*ppT) {
- (*ppT)->Release();
- *ppT = NULL;
- }
- }
- BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) {
- RECT rc;
- GetClientRect(hwnd, &rc);
- D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);
- if (!SUCCEEDED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,
- &pD2DFactory)) ||
- !SUCCEEDED(DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
- __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&pDWriteFactory))) ||
- !SUCCEEDED(pDWriteFactory->CreateTextFormat(
- L"Consolas", // Font family name.
- NULL, // Font collection (NULL sets it to use the system font collection).
- DWRITE_FONT_WEIGHT_REGULAR,
- DWRITE_FONT_STYLE_NORMAL,
- DWRITE_FONT_STRETCH_NORMAL,
- 11.0f, // 9.0f * 96.0f / 72.0f,
- L"en-us",
- &pTextFormat)) ||
- //!SUCCEEDED(pTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER)) ||
- //!SUCCEEDED(pTextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER)) ||
- !SUCCEEDED(pD2DFactory->CreateHwndRenderTarget(
- D2D1::RenderTargetProperties(),
- D2D1::HwndRenderTargetProperties(
- hwnd,
- size),
- &pRT)) ||
- !SUCCEEDED(pDWriteFactory->CreateRenderingParams(&pDefaultRenderingParams)) ||
- !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
- pDefaultRenderingParams->GetGamma(),
- pDefaultRenderingParams->GetEnhancedContrast(),
- pDefaultRenderingParams->GetClearTypeLevel(),
- pDefaultRenderingParams->GetPixelGeometry(),
- DWRITE_RENDERING_MODE_GDI_CLASSIC,
- &pGDIClassicRenderingParams)) ||
- !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
- pDefaultRenderingParams->GetGamma(),
- pDefaultRenderingParams->GetEnhancedContrast(),
- pDefaultRenderingParams->GetClearTypeLevel(),
- pDefaultRenderingParams->GetPixelGeometry(),
- DWRITE_RENDERING_MODE_GDI_NATURAL,
- &pGDINaturalRenderingParams)) ||
- !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
- pDefaultRenderingParams->GetGamma(),
- pDefaultRenderingParams->GetEnhancedContrast(),
- pDefaultRenderingParams->GetClearTypeLevel(),
- pDefaultRenderingParams->GetPixelGeometry(),
- DWRITE_RENDERING_MODE_NATURAL,
- &pNaturalRenderingParams)) ||
- !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
- pDefaultRenderingParams->GetGamma(),
- pDefaultRenderingParams->GetEnhancedContrast() * 2.0f,
- pDefaultRenderingParams->GetClearTypeLevel(),
- pDefaultRenderingParams->GetPixelGeometry(),
- DWRITE_RENDERING_MODE_NATURAL,
- &p2xContrastRenderingParams)) ||
- !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
- pDefaultRenderingParams->GetGamma(),
- pDefaultRenderingParams->GetEnhancedContrast() * 0.5f,
- pDefaultRenderingParams->GetClearTypeLevel(),
- pDefaultRenderingParams->GetPixelGeometry(),
- DWRITE_RENDERING_MODE_NATURAL,
- &p05xContrastRenderingParams)) ||
- !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
- pDefaultRenderingParams->GetGamma() * 0.5f,
- pDefaultRenderingParams->GetEnhancedContrast(),
- pDefaultRenderingParams->GetClearTypeLevel(),
- pDefaultRenderingParams->GetPixelGeometry(),
- DWRITE_RENDERING_MODE_NATURAL,
- &p05xGammaRenderingParams)) ||
- !SUCCEEDED(pDWriteFactory->CreateCustomRenderingParams(
- pDefaultRenderingParams->GetGamma() * 2.0f,
- pDefaultRenderingParams->GetEnhancedContrast(),
- pDefaultRenderingParams->GetClearTypeLevel(),
- pDefaultRenderingParams->GetPixelGeometry(),
- DWRITE_RENDERING_MODE_NATURAL,
- &p2xGammaRenderingParams)) ||
- !SUCCEEDED(pRT->CreateSolidColorBrush(
- D2D1::ColorF(D2D1::ColorF::Black),
- &pBlackBrush))) {
- MessageBox(NULL,
- "OnCreate failed.",
- "OnCreate Error", MB_ICONERROR);
- return FALSE;
- }
- return TRUE;
- }
- void OnPaintHDC(HWND hwnd) {
- PAINTSTRUCT ps;
- HDC hdc = BeginPaint(hwnd, &ps);
- //FillRect(hdc, &ps.rcPaint, (HBRUSH)GetStockObject(BLACK_BRUSH));
- FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW+1));
- EndPaint(hwnd, &ps);
- }
- void OnPaint(HWND hwnd) {
- RECT rc;
- GetClientRect(hwnd, &rc);
- FLOAT dpiScaleX = 1.0f;
- FLOAT dpiScaleY = 1.0f;
- D2D1_RECT_F layoutRect = D2D1::RectF(
- static_cast<FLOAT>(rc.left) / dpiScaleX,
- static_cast<FLOAT>(rc.top) / dpiScaleY,
- static_cast<FLOAT>(rc.right - rc.left) / dpiScaleX,
- static_cast<FLOAT>(rc.bottom - rc.top) / dpiScaleY
- );
- pRT->BeginDraw();
- pRT->SetTransform(D2D1::IdentityMatrix());
- pRT->Clear(D2D1::ColorF(D2D1::ColorF::White));
- wszText[0] = L'1';
- pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 10.0f)));
- pRT->SetTextRenderingParams(pDefaultRenderingParams);
- pRT->DrawText(
- wszText, // The string to render.
- cTextLength, // The string's length.
- pTextFormat, // The text format.
- layoutRect, // The region of the window where the text will be rendered.
- pBlackBrush // The brush used to draw the text.
- );
- wszText[0] = L'2';
- pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 30.0f)));
- pRT->SetTextRenderingParams(pGDIClassicRenderingParams);
- pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
- D2D1_DRAW_TEXT_OPTIONS_NONE,
- DWRITE_MEASURING_MODE_GDI_CLASSIC
- );
- wszText[0] = L'3';
- pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 50.0f)));
- pRT->SetTextRenderingParams(pGDINaturalRenderingParams);
- pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
- D2D1_DRAW_TEXT_OPTIONS_NONE,
- DWRITE_MEASURING_MODE_GDI_NATURAL
- );
- wszText[0] = L'4';
- pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 70.0f)));
- pRT->SetTextRenderingParams(pGDINaturalRenderingParams);
- pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
- D2D1_DRAW_TEXT_OPTIONS_NONE,
- DWRITE_MEASURING_MODE_NATURAL
- );
- wszText[0] = L'5';
- pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 90.0f)));
- pRT->SetTextRenderingParams(p05xContrastRenderingParams);
- pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
- D2D1_DRAW_TEXT_OPTIONS_NONE,
- DWRITE_MEASURING_MODE_NATURAL
- );
- wszText[0] = L'6';
- pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 110.0f)));
- pRT->SetTextRenderingParams(p05xContrastRenderingParams);
- pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
- D2D1_DRAW_TEXT_OPTIONS_NONE,
- DWRITE_MEASURING_MODE_GDI_CLASSIC
- );
- wszText[0] = L'7';
- pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 130.0f)));
- pRT->SetTextRenderingParams(p2xContrastRenderingParams);
- pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
- D2D1_DRAW_TEXT_OPTIONS_NONE,
- DWRITE_MEASURING_MODE_GDI_CLASSIC
- );
- wszText[0] = L'8';
- pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 150.0f)));
- pRT->SetTextRenderingParams(p2xGammaRenderingParams);
- pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
- D2D1_DRAW_TEXT_OPTIONS_NONE,
- DWRITE_MEASURING_MODE_GDI_CLASSIC
- );
- wszText[0] = L'9';
- pRT->SetTransform(D2D1::Matrix3x2F::Translation(D2D1::SizeF(10.0f, 170.0f)));
- pRT->SetTextRenderingParams(p05xGammaRenderingParams);
- pRT->DrawText(wszText, cTextLength, pTextFormat, layoutRect, pBlackBrush,
- D2D1_DRAW_TEXT_OPTIONS_NONE,
- DWRITE_MEASURING_MODE_GDI_CLASSIC
- );
- pRT->EndDraw();
- }
- void OnDestroy(HWND hwnd) {
- PostQuitMessage(0);
- SafeRelease(&pBlackBrush);
- SafeRelease(&p2xGammaRenderingParams);
- SafeRelease(&p05xGammaRenderingParams);
- SafeRelease(&p05xContrastRenderingParams);
- SafeRelease(&p2xContrastRenderingParams);
- SafeRelease(&pNaturalRenderingParams);
- SafeRelease(&pGDINaturalRenderingParams);
- SafeRelease(&pGDIClassicRenderingParams);
- SafeRelease(&pDefaultRenderingParams);
- SafeRelease(&pRT);
- SafeRelease(&pTextFormat);
- SafeRelease(&pDWriteFactory);
- SafeRelease(&pD2DFactory);
- }
- void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) {
- switch (id) {}
- }
- void OnSize(HWND hwnd, UINT state, int cx, int cy) {
- if (state == SIZE_RESTORED || state == SIZE_MAXIMIZED) {}
- }
Add Comment
Please, Sign In to add comment