{"id":854,"date":"2015-12-27T21:04:09","date_gmt":"2015-12-27T12:04:09","guid":{"rendered":"http:\/\/dev.activebasic.com\/egtra\/?p=854"},"modified":"2015-12-29T21:22:35","modified_gmt":"2015-12-29T12:22:35","slug":"direct2d%e3%81%a7pdf%e3%82%92%e6%8f%8f%e7%94%bb%e3%81%99%e3%82%8bapi%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f-ccx%e7%b7%a8","status":"publish","type":"post","link":"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/","title":{"rendered":"Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f (C++\/CX\u7de8)"},"content":{"rendered":"<p>\u524d\u56de\uff08<a href=\"\/egtra\/2015\/12\/24\/853\/\">Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f<\/a>\uff09\u306e\u7d9a\u304d\u3067\u3059\u3002\u4f7f\u7528\u3057\u3066\u3044\u308bPdfDocument\u30af\u30e9\u30b9\u95a2\u4fc2\u304cWinRT API\u306a\u306e\u3067\u3001C++\/CX\u3067\u3082\u66f8\u3044\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306f\u4e00\u756a\u6700\u5f8c\u306b\u8f09\u305b\u3066\u3044\u307e\u3059\u3002\u307e\u305a\u306f\u3001\u524d\u56de\u306eC++\u3068\u6bd4\u3079\u3066\u5909\u5316\u3057\u305f\u90e8\u5206\u3092\u9806\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<section>\n<h3>\u5909\u6570\u306e\u578b<\/h3>\n<p>\u3053\u308c\u306f\u3001\u30af\u30e9\u30b9\u5185\u306e\u30e1\u30f3\u30d0\u5909\u6570\u306e\u5b9a\u7fa9\u90e8\u5206\u3067\u3059\u3002<\/p>\n<pre lang=\"cpp\">\r\n\/\/ C++\r\nComPtr<IPdfDocument> m_document;\r\n\r\n\/\/ C++\/CX\r\nPdfDocument^ m_document;\r\n<\/pre>\n<p>\u540d\u524d\u7a7a\u9593\u3082\u305d\u308c\u305e\u308c\u3067\u7570\u306a\u308a\u307e\u3059\u3002<\/p>\n<ul>\n<li>ABI::Windows::Data::Pdf::IPdfDocument<\/li>\n<li>Windows::Data::Pdf::PdfDocument<\/li>\n<\/ul>\n<h3>GetPage\u3068\u63cf\u753b\u5468\u308a<\/h3>\n<pre lang=\"cpp\">\r\n\/\/ C++\r\nMicrosoft::WRL::ComPtr<ABI::Windows::Data::Pdf::IPdfPage> page;\r\nauto hr = m_document->GetPage(0, &page);\r\nif (SUCCEEDED(hr))\r\n{\r\nauto params = PdfRenderParams();\r\nresource.m_pdfRenderer->RenderPageToDeviceContext(\r\n  page.Get(), resource.m_d2dDeviceContext.Get(), &params);\r\n}\r\n\r\n\/\/ C++\/CX\r\nauto pdfPage = m_document->GetPage(0);\r\nauto params = PdfRenderParams();\r\nresource.m_pdfRenderer->RenderPageToDeviceContext(\r\n  reinterpret_cast<IUnknown*>(pdfPage),\r\n  resource.m_d2dDeviceContext.Get(),\r\n  &params);\r\n<\/pre>\n<p>C++\/CX\u7248\u3067\u306e\u5909\u6570pdfPage\u306e\u578b\u306f\u3001<code>Windows::Data::Pdf::PdfPage^<\/code>\u3067\u3059\u3002<br \/>\n\u305d\u306e\u305f\u3081\u3001reinterpret_cast\u3067IUnknown*\u306b\u5909\u63db\u3057\u3066\u304b\u3089\u6e21\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>CreateRandomAccessStreamOnFile<\/h3>\n<pre lang=\"cpp\">\r\n\/\/ C++\r\nComPtr<IRandomAccessStream> s;\r\nauto hr = CreateRandomAccessStreamOnFile(\r\n  __wargv[1], FileAccessMode_Read, IID_PPV_ARGS(&s));\r\n\r\n\/\/ C++\/CX\r\nIRandomAccessStream^ s;\r\nauto hr = CreateRandomAccessStreamOnFile(\r\n __wargv[1],\r\n  static_cast<DWORD>(FileAccessMode::Read),\r\n  ID_PPV_ARGS(reinterpret_cast<ABI::Windows::Storage::Streams::IRandomAccessStream**>(&s)));\r\n<\/pre>\n<p>FileAccessMode\u304c\u30b9\u30b3\u30fc\u30d7\u4ed8\u304d\u5217\u6319\u4f53\u306a\u306e\u3067\u3001static_cast\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u3053\u3046\u3044\u3046\u66f8\u304d\u65b9\u3082\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<pre lang=\"cpp\">\r\nIRandomAccessStream^ s;\r\nauto hr = CreateRandomAccessStreamOnFile(\r\n __wargv[1],\r\n  static_cast<DWORD>(FileAccessMode::Read),\r\n  __uuidof(s), \/\/\u307e\u305f\u306f__uuidof(IRandomAccessStream^),\r\n  reinterpret_cast<void**>(&s));\r\n<\/pre>\n<p>\u3053\u306e\u307b\u3046\u304c\u7c21\u6f54\u306a\u306e\u3067\u3001IID_PPV_ARGS\u306e\u5229\u7528\u306b\u62d8\u6ce5\u305b\u305a\u3001\u3053\u306e\u3088\u3046\u306b\u66f8\u304f\u307b\u3046\u304c\u826f\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n<h3>LoadFromStreamAsync<\/h3>\n<pre lang=\"cpp\">\r\nComPtr<IPdfDocumentStatics> pdfDocumentsStatics;\r\nHStringReference className(RuntimeClass_Windows_Data_Pdf_PdfDocument);\r\n\/\/ \u4ee5\u4e0b\u306fRoGetActivationFactory\u306e\u30e9\u30c3\u30d1\u30fc\r\nauto hr = Windows::Foundation::GetActivationFactory(\r\n  className.Get(), &pdfDocumentsStatics);\r\nif (FAILED(hr))\r\n  return hr;\r\nComPtr<IAsyncOperation<PdfDocument*>> async;\r\nhr = pdfDocumentsStatics->LoadFromStreamAsync(s, &async);\r\nif (FAILED(hr))\r\n  return hr;\r\n  \r\nPdfDocument::LoadFromStreamAsync(s)\r\n<\/pre>\n<p>C++\u3060\u3068\u3086\u3063\u305f\u308a\u66f8\u3044\u306610\u884c\u307b\u3069\u306e\u30b3\u30fc\u30c9\u304cC++\/CX\u3067\u306f1\u95a2\u6570\u547c\u3073\u51fa\u3057\u3067\u6e08\u3093\u3067\u3044\u307e\u3059\u3002WinRT\u306eCOM\u306b\u304a\u3044\u3066\u3001\u9759\u7684\u30e1\u30f3\u30d0\u30fc\u306f\u30af\u30e9\u30b9\u30d5\u30a1\u30af\u30c8\u30ea\u306b\u5b9f\u88c5\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u305d\u3057\u3066\u3001\u300cI\u30af\u30e9\u30b9Statics\u300d\u3068\u3044\u3046\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067\u8868\u73fe\u3055\u308c\u307e\u3059\u3002<\/p>\n<h3>\u975e\u540c\u671f\u51e6\u7406<\/h3>\n<pre lang=\"cpp\">\r\n\/\/ C++\r\nComPtr<IAsyncOperation<PdfDocument*>> async;\r\nhr = pdfDocumentsStatics->LoadFromStreamAsync(s, &async);\r\nif (FAILED(hr))\r\n  return hr;\r\nauto callback = Callback<IAsyncOperationCompletedHandler<PdfDocument*>>(\r\n  [this](_In_ IAsyncOperation<PdfDocument*>* async, AsyncStatus status)\r\n{\r\n  if (status != AsyncStatus::Completed)\r\n    return S_FALSE;\r\n  ComPtr<IPdfDocument> doc;\r\n  auto hr = async->GetResults(&doc);\r\n  if (SUCCEEDED(hr))\r\n  {\r\n    m_document = std::move(doc);\r\n    Invalidate();\r\n  }\r\n  return hr;\r\n});\r\nhr = async->put_Completed(callback.Get());\r\nif (FAILED(hr))\r\n  return hr;\r\n\r\n\/\/ C++\/CX\r\nauto asyncTask = concurrency::create_task(\r\n  PdfDocument::LoadFromStreamAsync(s));\r\nasyncTask.then([this](PdfDocument^ doc)\r\n{\r\n  m_document = doc;\r\n  Invalidate();\r\n});\r\n<\/pre>\n<p>C++\/CX\u3067\u306e\u975e\u540c\u671f\u51e6\u7406\u306f\u3001concurrency::create_task\u3067\u30e9\u30c3\u30d7\u3059\u308b\u306e\u304c\u4fbf\u5229\u3067\u3059\u3002\u3053\u3053\u304c\u4e00\u756aC++\/CX\u306e\u307b\u3046\u304c\u697d\u3060\u3068\u611f\u3058\u305f\u7b87\u6240\u3067\u3059\u3002<\/p>\n<h3>\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9<\/h3>\n<p>\u6700\u5f8c\u306b\u3001\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u5168\u4f53\u3092\u8f09\u305b\u307e\u3059\u3002<\/p>\n<pre lang=\"cpp\">\r\n#define UNICODE\r\n#define _UNICODE\r\n\r\n#include <cstdlib>\r\n\r\n#include <ppltasks.h>\r\n\r\n#include <windows.h>\r\n#include <shcore.h>\r\n#include <d3d11_1.h>\r\n#include <dxgi1_2.h>\r\n#include <d2d1_2.h>\r\n\r\n#include <windows.data.pdf.interop.h>\r\n#include <windows.storage.streams.h>\r\n\r\n#include <wrl\/client.h>\r\n#include <wrl\/event.h>\r\n\r\n#include <atlbase.h>\r\n#include <atlwin.h>\r\n#include <atltypes.h>\r\n\r\n#pragma comment(lib, \"shcore.lib\")\r\n#pragma comment(lib, \"runtimeobject.lib\")\r\n#pragma comment(lib, \"d3d11.lib\")\r\n#pragma comment(lib, \"d2d1.lib\")\r\n#pragma comment(lib, \"windows.data.pdf.lib\")\r\n\r\n\r\nusing namespace Platform;\r\nusing namespace Windows::Data::Pdf;\r\nusing namespace Windows::Foundation;\r\nusing namespace Windows::Storage;\r\nusing namespace Windows::Storage::Streams;\r\nusing namespace Microsoft::WRL;\r\nusing namespace Microsoft::WRL::Wrappers;\r\n\r\nclass TestWindow\r\n  : public ATL::CWindowImpl<TestWindow>\r\n{\r\npublic:\r\n  DECLARE_WND_CLASS_EX(L\"Test Window Class\", 0, -1);\r\n\r\n  BEGIN_MSG_MAP(TestWindow)\r\n    MESSAGE_HANDLER(WM_SIZE, OnSize) \/\/MSG_WM_SIZE(OnSize)\r\n    MESSAGE_HANDLER(WM_PAINT, OnPaint) \/\/MSG_WM_PAINT(OnPaint)\r\n    MESSAGE_HANDLER(WM_CREATE, OnCreate) \/\/MSG_WM_CREATE(OnCreate)\r\n    MESSAGE_HANDLER(WM_DESTROY, OnDestroy) \/\/MSG_WM_DESTROY(OnDestroy)\r\n  END_MSG_MAP()\r\n\r\nprivate:\r\n  \/\/void OnSize(UINT type, SIZE size)\r\n  LRESULT OnSize(UINT, WPARAM type, LPARAM lp, BOOL&)\r\n  {\r\n    SIZE size{ GET_X_LPARAM(lp), GET_Y_LPARAM(lp) };\r\n    if (type == SIZE_MINIMIZED || type == SIZE_MAXHIDE)\r\n      return 0;\r\n\r\n    DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};\r\n    auto hr = resource.m_dxgiSwapChain->GetDesc1(&swapChainDesc);\r\n    if (SUCCEEDED(hr)\r\n      && swapChainDesc.Width == size.cx && swapChainDesc.Height == size.cy)\r\n    {\r\n      return 0;\r\n    }\r\n    resource.m_d2dDeviceContext->SetTarget(nullptr);\r\n\r\n    hr = resource.m_dxgiSwapChain->ResizeBuffers(\r\n      swapChainDesc.BufferCount, 0, 0, DXGI_FORMAT_UNKNOWN, 0);\r\n    if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)\r\n    {\r\n      HandleDeviceLost();\r\n    }\r\n    InitializeRenderTarget();\r\n\r\n    BOOL b{};\r\n    OnPaint(0, 0, 0, b); \/\/ WTL\u4f7f\u7528\u6642\u306fOnPaint(nullptr);\r\n    return 0;\r\n  }\r\n\r\n  \/\/void OnPaint(HDC)\r\n  LRESULT OnPaint(UINT, WPARAM, LPARAM, BOOL&)\r\n  {\r\n    OnRender();\r\n    ValidateRect(nullptr);\r\n    return 0;\r\n  }\r\n\r\n  void OnRender()\r\n  {\r\n    resource.m_d2dDeviceContext->BeginDraw();\r\n    OnRenderCore();\r\n    auto hr = resource.m_d2dDeviceContext->EndDraw();\r\n    if (hr == D2DERR_RECREATE_TARGET)\r\n    {\r\n      HandleDeviceLost();\r\n    }\r\n    else if (SUCCEEDED(hr))\r\n    {\r\n      hr = resource.m_dxgiSwapChain->Present(1, 0);\r\n      if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)\r\n      {\r\n        HandleDeviceLost();\r\n      }\r\n    }\r\n  }\r\n\r\n  void OnRenderCore()\r\n  {\r\n    resource.m_d2dDeviceContext->Clear(D2D1::ColorF(D2D1::ColorF::Black));\r\n    if (m_document != nullptr)\r\n    {\r\n      auto pdfPage = m_document->GetPage(0);\r\n      auto params = PdfRenderParams();\r\n      resource.m_pdfRenderer->RenderPageToDeviceContext(\r\n        reinterpret_cast<IUnknown*>(pdfPage),\r\n        resource.m_d2dDeviceContext.Get(),\r\n        &params);\r\n    }\r\n  }\r\n\r\n  \/\/LRESULT OnCreate(const CREATESTRUCT*)\r\n  LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&)\r\n  {\r\n    if (FAILED(CreateDeviceIndependentResources()))\r\n      return -1;\r\n    if (FAILED(CreateDeviceResources()))\r\n      return -1;\r\n    LoadPdf();\r\n    return 0;\r\n  }\r\n\r\n  void HandleDeviceLost()\r\n  {\r\n    \/\/MessageBox(L\"\u30c7\u30d0\u30a4\u30b9\u30ed\u30b9\u30c8\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\");\r\n    OutputDebugStringW(L\"\u30c7\u30d0\u30a4\u30b9\u30ed\u30b9\u30c8\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\\r\\n\");\r\n\r\n    ReleaseDeviceResources();\r\n    CreateDeviceResources();\r\n    \/\/ \u3044\u3063\u305f\u3093\u30e1\u30c3\u30bb\u30fc\u30b8\u30eb\u30fc\u30d7\u306b\u623b\u3057\u305f\u304f\u3066\u3001OnRender\u3092\u76f4\u63a5\u547c\u3070\u305a\u3001\u3053\u3046\u3057\u3066\u3044\u308b\u3002\r\n    Invalidate();\r\n  }\r\n\r\n  \/\/void OnDestroy()\r\n  LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&)\r\n  {\r\n    PostQuitMessage(0);\r\n    RevokeDragDrop(m_hWnd);\r\n    ReleaseDeviceResources();\r\n    return 0;\r\n  }\r\n\r\n  void ReleaseDeviceResources()\r\n  {\r\n    resource = {};\r\n  }\r\n\r\n  HRESULT Direct3DCreateDevice(\r\n    D3D_DRIVER_TYPE driverType, _COM_Outptr_ ID3D11Device** ppDevice)\r\n  {\r\n    UINT flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;\r\n#ifdef _DEBUG\r\n    \/\/flags |= D3D11_CREATE_DEVICE_DEBUG;\r\n#endif\r\n\r\n    const D3D_FEATURE_LEVEL featureLevels[] =\r\n    {\r\n      D3D_FEATURE_LEVEL_11_1,\r\n      D3D_FEATURE_LEVEL_11_0,\r\n      D3D_FEATURE_LEVEL_10_1,\r\n      D3D_FEATURE_LEVEL_10_0,\r\n      D3D_FEATURE_LEVEL_9_3,\r\n      D3D_FEATURE_LEVEL_9_2,\r\n      D3D_FEATURE_LEVEL_9_1,\r\n    };\r\n    return D3D11CreateDevice(nullptr,\r\n      driverType,\r\n      nullptr,\r\n      flags,\r\n      featureLevels,\r\n      ARRAYSIZE(featureLevels),\r\n      D3D11_SDK_VERSION,\r\n      ppDevice,\r\n      nullptr,\r\n      nullptr);\r\n  }\r\n\r\n  HRESULT Direct3DCreateDevice(_COM_Outptr_ ID3D11Device** ppDevice)\r\n  {\r\n    auto hr = Direct3DCreateDevice(D3D_DRIVER_TYPE_HARDWARE, ppDevice);\r\n    if (SUCCEEDED(hr)) return hr;\r\n    return Direct3DCreateDevice(D3D_DRIVER_TYPE_WARP, ppDevice);\r\n  }\r\n\r\n  HRESULT CreateDeviceResources()\r\n  {\r\n    ComPtr<ID3D11Device> device;\r\n\r\n    auto hr = Direct3DCreateDevice(&device);\r\n    if (FAILED(hr)) return hr;\r\n    ComPtr<IDXGIDevice2> dxgiDevice;\r\n    hr = device.As(&dxgiDevice);\r\n    if (FAILED(hr)) return hr;\r\n\r\n    ComPtr<ID2D1Device> d2d1Device;\r\n    hr = m_d2dFactory->CreateDevice(dxgiDevice.Get(), &d2d1Device);\r\n    if (FAILED(hr)) return hr;\r\n\r\n    hr = d2d1Device->CreateDeviceContext(\r\n      D2D1_DEVICE_CONTEXT_OPTIONS_NONE,\r\n      &resource.m_d2dDeviceContext);\r\n    if (FAILED(hr)) return hr;\r\n    ComPtr<IDXGIAdapter> dxgiAdapter;\r\n    hr = dxgiDevice->GetAdapter(&dxgiAdapter);\r\n    if (FAILED(hr)) return hr;\r\n    ComPtr<IDXGIFactory2> dxgiFactory;\r\n    hr = dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory));\r\n    if (FAILED(hr)) return hr;\r\n\r\n    DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};\r\n    swapChainDesc.Width = 0;\r\n    swapChainDesc.Height = 0;\r\n    swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;\r\n    swapChainDesc.Stereo = FALSE;\r\n    swapChainDesc.SampleDesc.Count = 1;\r\n    swapChainDesc.SampleDesc.Quality = 0;\r\n    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;\r\n    swapChainDesc.BufferCount = 2;\r\n    swapChainDesc.Scaling = DXGI_SCALING_NONE;\r\n    swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;\r\n    swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;\r\n    hr = dxgiFactory->CreateSwapChainForHwnd(\r\n      device.Get(),\r\n      m_hWnd,\r\n      &swapChainDesc,\r\n      nullptr,\r\n      nullptr,\r\n      &resource.m_dxgiSwapChain);\r\n    if (FAILED(hr)) return hr;\r\n    (void)dxgiDevice->SetMaximumFrameLatency(1);\r\n    hr = InitializeRenderTarget();\r\n    if (FAILED(hr)) return hr;\r\n    hr = PdfCreateRenderer(dxgiDevice.Get(), &resource.m_pdfRenderer);\r\n    if (FAILED(hr)) return hr;\r\n    return S_OK;\r\n  }\r\n\r\n  HRESULT InitializeRenderTarget()\r\n  {\r\n    ComPtr<ID2D1Bitmap1> d2d1RenderTarget;\r\n    ComPtr<IDXGISurface2> dxgiSurface;\r\n    auto hr = resource.m_dxgiSwapChain->GetBuffer(\r\n      0, IID_PPV_ARGS(&dxgiSurface));\r\n    if (FAILED(hr)) return hr;\r\n\r\n    float dpiX, dpiY;\r\n    m_d2dFactory->GetDesktopDpi(&dpiX, &dpiY);\r\n    hr = resource.m_d2dDeviceContext->CreateBitmapFromDxgiSurface(\r\n      dxgiSurface.Get(),\r\n      D2D1::BitmapProperties1(\r\n        D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,\r\n        D2D1::PixelFormat(\r\n          DXGI_FORMAT_B8G8R8A8_UNORM,\r\n          D2D1_ALPHA_MODE_IGNORE)),\r\n      &d2d1RenderTarget);\r\n    if (FAILED(hr)) return hr;\r\n    resource.m_d2dDeviceContext->SetTarget(d2d1RenderTarget.Get());\r\n    return S_OK;\r\n  }\r\n\r\n  HRESULT LoadPdf()\r\n  {\r\n    IRandomAccessStream^ s;\r\n    auto hr = CreateRandomAccessStreamOnFile(\r\n      __wargv[1],\r\n      static_cast<DWORD>(FileAccessMode::Read),\r\n      IID_PPV_ARGS(reinterpret_cast<\r\n        ABI::Windows::Storage::Streams::IRandomAccessStream**>(&s)));\r\n    if (FAILED(hr))\r\n      return hr;\r\n    return LoadPdf(s);\r\n  }\r\n\r\n  HRESULT LoadPdf(_In_ IRandomAccessStream^ s)\r\n  {\r\n    auto asyncTask = concurrency::create_task(\r\n      PdfDocument::LoadFromStreamAsync(s));\r\n    asyncTask.then([this](PdfDocument^ doc)\r\n    {\r\n      m_document = doc;\r\n      Invalidate();\r\n    });\r\n    return S_OK;\r\n  }\r\n\r\n  HRESULT CreateDeviceIndependentResources()\r\n  {\r\n    D2D1_FACTORY_OPTIONS options = {};\r\n#ifdef _DEBUG\r\n    options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION;\r\n#endif\r\n    auto hr = D2D1CreateFactory(\r\n      D2D1_FACTORY_TYPE_MULTI_THREADED,\r\n      options,\r\n      m_d2dFactory.GetAddressOf());\r\n    if (FAILED(hr)) return hr;\r\n    return S_OK;\r\n  }\r\n\r\n  \/\/ \u30c7\u30d0\u30a4\u30b9\u975e\u4f9d\u5b58\u30ea\u30bd\u30fc\u30b9\r\n  ComPtr<ID2D1Factory1> m_d2dFactory;\r\n  \/\/ \u30c7\u30d0\u30a4\u30b9\u4f9d\u5b58\u30ea\u30bd\u30fc\u30b9\r\n  struct DeviceResources\r\n  {\r\n    ComPtr<IDXGISwapChain1> m_dxgiSwapChain;\r\n    ComPtr<ID2D1DeviceContext> m_d2dDeviceContext;\r\n    ComPtr<IPdfRendererNative> m_pdfRenderer;\r\n  } resource;\r\n  \/\/ \u305d\u306e\u4ed6\r\n  PdfDocument^ m_document;\r\n};\r\n\r\n[STAThread]\r\nint WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int cmdShow)\r\n{\r\n  CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\r\n\r\n  TestWindow wnd;\r\n  if (!wnd.Create(nullptr, ATL::CWindow::rcDefault,\r\n    TEXT(\"Hello, world\"), WS_OVERLAPPEDWINDOW))\r\n  {\r\n    std::quick_exit(-1);\r\n  }\r\n\r\n  wnd.ShowWindow(cmdShow);\r\n  wnd.UpdateWindow();\r\n\r\n  MSG msg;\r\n  while (GetMessage(&msg, nullptr, 0, 0))\r\n  {\r\n    TranslateMessage(&msg);\r\n    DispatchMessage(&msg);\r\n  }\r\n  std::quick_exit(static_cast<int>(msg.wParam));\r\n}\r\n<\/pre>\n<\/section>\n<p>\u975e\u540c\u671f\u51e6\u7406\u306e\u3068\u3053\u308d\u304c\u3001C++\/CX\u3060\u3068\u5927\u5e45\u306b\u697d\u3067\u3059\u3002\u3053\u308c\u3060\u3051\u3067\u3082C++\/CX\u3092\u4f7f\u3044\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C++\/CX\u3092\u4f7f\u3044\u3001PdfDocument\u3068IPdfRendererNative\u3092\u7d44\u307f\u5408\u308f\u305b\u3066\u3001PDF\u3092\u63cf\u753b\u3059\u308b\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u4f5c\u308a\u307e\u3057\u305f\u3002\u4ee5\u524d\u4f5c\u3063\u305fC++\u7248\u306e\u30b3\u30fc\u30c9\u3068\u5bfe\u6bd4\u3055\u305b\u3066\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[5,29,12,143],"tags":[184,37,311],"class_list":["post-854","post","type-post","status-publish","format-standard","hentry","category-cpp","category-directx","category-vc","category-winrt","tag-cpp-cx","tag-direct2d","tag-pdf"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f (C++\/CX\u7de8) - \u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d<\/title>\n<meta name=\"description\" content=\"C++\/CX\u3092\u4f7f\u3044\u3001PdfDocument\u3068IPdfRendererNative\u3092\u7d44\u307f\u5408\u308f\u305b\u3066\u3001PDF\u3092\u63cf\u753b\u3059\u308b\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u4f5c\u308a\u307e\u3057\u305f\u3002\u4ee5\u524d\u4f5c\u3063\u305fC++\u7248\u306e\u30b3\u30fc\u30c9\u3068\u5bfe\u6bd4\u3055\u305b\u3066\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f (C++\/CX\u7de8) - \u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d\" \/>\n<meta property=\"og:description\" content=\"C++\/CX\u3092\u4f7f\u3044\u3001PdfDocument\u3068IPdfRendererNative\u3092\u7d44\u307f\u5408\u308f\u305b\u3066\u3001PDF\u3092\u63cf\u753b\u3059\u308b\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u4f5c\u308a\u307e\u3057\u305f\u3002\u4ee5\u524d\u4f5c\u3063\u305fC++\u7248\u306e\u30b3\u30fc\u30c9\u3068\u5bfe\u6bd4\u3055\u305b\u3066\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/\" \/>\n<meta property=\"og:site_name\" content=\"\u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ysk.noh\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-27T12:04:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-12-29T12:22:35+00:00\" \/>\n<meta name=\"author\" content=\"egtra\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@egtra\" \/>\n<meta name=\"twitter:site\" content=\"@egtra\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"egtra\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"6\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/\",\"url\":\"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/\",\"name\":\"Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f (C++\/CX\u7de8) - \u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d\",\"isPartOf\":{\"@id\":\"https:\/\/dev.activebasic.com\/egtra\/#website\"},\"datePublished\":\"2015-12-27T12:04:09+00:00\",\"dateModified\":\"2015-12-29T12:22:35+00:00\",\"author\":{\"@id\":\"https:\/\/dev.activebasic.com\/egtra\/#\/schema\/person\/8de756b2ff20b964f64594dfe8f18164\"},\"description\":\"C++\/CX\u3092\u4f7f\u3044\u3001PdfDocument\u3068IPdfRendererNative\u3092\u7d44\u307f\u5408\u308f\u305b\u3066\u3001PDF\u3092\u63cf\u753b\u3059\u308b\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u4f5c\u308a\u307e\u3057\u305f\u3002\u4ee5\u524d\u4f5c\u3063\u305fC++\u7248\u306e\u30b3\u30fc\u30c9\u3068\u5bfe\u6bd4\u3055\u305b\u3066\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002\",\"breadcrumb\":{\"@id\":\"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\/\/dev.activebasic.com\/egtra\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f (C++\/CX\u7de8)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/dev.activebasic.com\/egtra\/#website\",\"url\":\"https:\/\/dev.activebasic.com\/egtra\/\",\"name\":\"\u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d\",\"description\":\"\u982d\u306e\u4e2d\u306e\u304b\u3051\u3089\u3002ActiveBasic\u3092\u4e2d\u5fc3\u306b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306e\u8a71\u3092\u307c\u3061\u307c\u3061\u3068\u3002\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/dev.activebasic.com\/egtra\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/dev.activebasic.com\/egtra\/#\/schema\/person\/8de756b2ff20b964f64594dfe8f18164\",\"name\":\"egtra\",\"sameAs\":[\"https:\/\/x.com\/egtra\"],\"url\":\"https:\/\/dev.activebasic.com\/egtra\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f (C++\/CX\u7de8) - \u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d","description":"C++\/CX\u3092\u4f7f\u3044\u3001PdfDocument\u3068IPdfRendererNative\u3092\u7d44\u307f\u5408\u308f\u305b\u3066\u3001PDF\u3092\u63cf\u753b\u3059\u308b\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u4f5c\u308a\u307e\u3057\u305f\u3002\u4ee5\u524d\u4f5c\u3063\u305fC++\u7248\u306e\u30b3\u30fc\u30c9\u3068\u5bfe\u6bd4\u3055\u305b\u3066\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/","og_locale":"ja_JP","og_type":"article","og_title":"Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f (C++\/CX\u7de8) - \u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d","og_description":"C++\/CX\u3092\u4f7f\u3044\u3001PdfDocument\u3068IPdfRendererNative\u3092\u7d44\u307f\u5408\u308f\u305b\u3066\u3001PDF\u3092\u63cf\u753b\u3059\u308b\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u4f5c\u308a\u307e\u3057\u305f\u3002\u4ee5\u524d\u4f5c\u3063\u305fC++\u7248\u306e\u30b3\u30fc\u30c9\u3068\u5bfe\u6bd4\u3055\u305b\u3066\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002","og_url":"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/","og_site_name":"\u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d","article_publisher":"https:\/\/www.facebook.com\/ysk.noh","article_published_time":"2015-12-27T12:04:09+00:00","article_modified_time":"2015-12-29T12:22:35+00:00","author":"egtra","twitter_card":"summary_large_image","twitter_creator":"@egtra","twitter_site":"@egtra","twitter_misc":{"\u57f7\u7b46\u8005":"egtra","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"6\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/","url":"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/","name":"Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f (C++\/CX\u7de8) - \u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d","isPartOf":{"@id":"https:\/\/dev.activebasic.com\/egtra\/#website"},"datePublished":"2015-12-27T12:04:09+00:00","dateModified":"2015-12-29T12:22:35+00:00","author":{"@id":"https:\/\/dev.activebasic.com\/egtra\/#\/schema\/person\/8de756b2ff20b964f64594dfe8f18164"},"description":"C++\/CX\u3092\u4f7f\u3044\u3001PdfDocument\u3068IPdfRendererNative\u3092\u7d44\u307f\u5408\u308f\u305b\u3066\u3001PDF\u3092\u63cf\u753b\u3059\u308b\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30a2\u30d7\u30ea\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u4f5c\u308a\u307e\u3057\u305f\u3002\u4ee5\u524d\u4f5c\u3063\u305fC++\u7248\u306e\u30b3\u30fc\u30c9\u3068\u5bfe\u6bd4\u3055\u305b\u3066\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002","breadcrumb":{"@id":"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dev.activebasic.com\/egtra\/2015\/12\/27\/854\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/dev.activebasic.com\/egtra\/"},{"@type":"ListItem","position":2,"name":"Direct2D\u3067PDF\u3092\u63cf\u753b\u3059\u308bAPI\u3092\u4f7f\u3063\u3066\u307f\u305f (C++\/CX\u7de8)"}]},{"@type":"WebSite","@id":"https:\/\/dev.activebasic.com\/egtra\/#website","url":"https:\/\/dev.activebasic.com\/egtra\/","name":"\u30a4\u30b0\u30c8\u30e9\u30f3\u30b9\u306e\u982d\u306e\u4e2d","description":"\u982d\u306e\u4e2d\u306e\u304b\u3051\u3089\u3002ActiveBasic\u3092\u4e2d\u5fc3\u306b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306e\u8a71\u3092\u307c\u3061\u307c\u3061\u3068\u3002","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dev.activebasic.com\/egtra\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/dev.activebasic.com\/egtra\/#\/schema\/person\/8de756b2ff20b964f64594dfe8f18164","name":"egtra","sameAs":["https:\/\/x.com\/egtra"],"url":"https:\/\/dev.activebasic.com\/egtra\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/dev.activebasic.com\/egtra\/wp-json\/wp\/v2\/posts\/854"}],"collection":[{"href":"https:\/\/dev.activebasic.com\/egtra\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev.activebasic.com\/egtra\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev.activebasic.com\/egtra\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dev.activebasic.com\/egtra\/wp-json\/wp\/v2\/comments?post=854"}],"version-history":[{"count":0,"href":"https:\/\/dev.activebasic.com\/egtra\/wp-json\/wp\/v2\/posts\/854\/revisions"}],"wp:attachment":[{"href":"https:\/\/dev.activebasic.com\/egtra\/wp-json\/wp\/v2\/media?parent=854"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev.activebasic.com\/egtra\/wp-json\/wp\/v2\/categories?post=854"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev.activebasic.com\/egtra\/wp-json\/wp\/v2\/tags?post=854"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}