196 lines
5.0 KiB
C++
196 lines
5.0 KiB
C++
//// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
//// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
//// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
//// PARTICULAR PURPOSE.
|
|
////
|
|
//// Copyright (c) Microsoft Corporation. All rights reserved
|
|
|
|
#pragma once
|
|
|
|
// Modify the following defines if you have to target a platform prior to the ones specified below.
|
|
// Refer to MSDN for the latest info on corresponding values for different platforms.
|
|
#ifndef WINVER // Allow use of features specific to Windows 7 or later.
|
|
#define WINVER 0x0800 // Change this to the appropriate value to target other versions of Windows.
|
|
#endif
|
|
|
|
#ifndef _WIN32_WINNT // Allow use of features specific to Windows 7 or later.
|
|
#define _WIN32_WINNT 0x0800 // Change this to the appropriate value to target other versions of Windows.
|
|
#endif
|
|
|
|
#ifndef UNICODE
|
|
#define UNICODE
|
|
#endif
|
|
|
|
// DirectX header files.
|
|
#include <d2d1_1.h>
|
|
#include <d3d11.h>
|
|
#include <dwrite.h>
|
|
#include <wincodec.h>
|
|
#include <Windows.h>
|
|
#include <WinUser.h>
|
|
|
|
#include <xpsobjectmodel_1.h>
|
|
#include <DocumentTarget.h>
|
|
|
|
#include "D2DPrintJobChecker.h"
|
|
|
|
// SafeRelease inline function.
|
|
template <class Interface> inline void SafeRelease(
|
|
Interface** interfaceToRelease
|
|
)
|
|
{
|
|
if (*interfaceToRelease != nullptr)
|
|
{
|
|
(*interfaceToRelease)->Release();
|
|
|
|
(*interfaceToRelease) = nullptr;
|
|
}
|
|
}
|
|
|
|
// Macros.
|
|
#ifndef Assert
|
|
#if defined(DEBUG) || defined(_DEBUG) || DBG
|
|
#define Assert(b) if (!(b)) { OutputDebugStringA("Assert: " #b "\n"); }
|
|
#else
|
|
#define Assert(b)
|
|
#endif // DEBUG || _DEBUG
|
|
#endif
|
|
|
|
#ifndef HINST_THISCOMPONENT
|
|
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
|
|
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
|
|
#endif
|
|
|
|
// The main class for this sample application.
|
|
class DemoApp
|
|
{
|
|
public:
|
|
DemoApp();
|
|
|
|
~DemoApp();
|
|
|
|
HRESULT Initialize();
|
|
|
|
void RunMessageLoop();
|
|
|
|
private:
|
|
HRESULT CreateDeviceIndependentResources();
|
|
|
|
HRESULT CreateDeviceContext();
|
|
|
|
HRESULT CreateDeviceResources();
|
|
|
|
void DiscardDeviceResources();
|
|
|
|
HRESULT CreateGridPatternBrush(
|
|
_Outptr_ ID2D1ImageBrush** imageBrush
|
|
);
|
|
|
|
HRESULT OnRender();
|
|
|
|
HRESULT OnPrint();
|
|
|
|
HRESULT InitializePrintJob();
|
|
|
|
HRESULT GetPrintTicketFromDevmode(
|
|
_In_ PCTSTR printerName,
|
|
_In_reads_bytes_(devModeSize) PDEVMODE devMode,
|
|
WORD devModeSize,
|
|
_Out_ LPSTREAM* printTicketStream
|
|
);
|
|
|
|
HRESULT FinalizePrintJob();
|
|
|
|
HRESULT DrawToContext(
|
|
_In_ ID2D1DeviceContext* d2dContext,
|
|
UINT pageNumber, // 1-based page number
|
|
BOOL printing
|
|
);
|
|
|
|
void OnChar(
|
|
SHORT key
|
|
);
|
|
|
|
void ToggleMultiPageMode();
|
|
|
|
void OnResize();
|
|
|
|
void OnVScroll(
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
);
|
|
|
|
void ResetScrollBar();
|
|
|
|
void OnMouseWheel(
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
);
|
|
|
|
D2D1_SIZE_U CalculateD2DWindowSize();
|
|
|
|
static LRESULT CALLBACK ParentWndProc(
|
|
HWND hWnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
);
|
|
|
|
static LRESULT CALLBACK ChildWndProc(
|
|
HWND hWnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
);
|
|
|
|
static HRESULT LoadBitmapFromFile(
|
|
_In_ ID2D1DeviceContext* d2dContext,
|
|
_In_ IWICImagingFactory* wicFactory,
|
|
_In_ PCWSTR uri,
|
|
UINT destinationWidth,
|
|
UINT destinationHeight,
|
|
_Outptr_ ID2D1Bitmap** bitmap
|
|
);
|
|
|
|
LRESULT OnClose();
|
|
|
|
private:
|
|
bool m_resourcesValid; // Whether or not the device-dependent resources are ready to use.
|
|
|
|
HWND m_parentHwnd; // The outer window containing the scroll bar and inner window.
|
|
HWND m_d2dHwnd; // The inner window onto which D2D renders.
|
|
bool m_multiPageMode; // Whether or not the application is currently in multi-page mode.
|
|
static const UINT m_scrollRange = 1100; // The maximum distance the user is allowed to scroll.
|
|
|
|
// The current distance between the top of the scene and the top
|
|
// of the displayed rectangle.
|
|
INT m_currentScrollPosition;
|
|
|
|
// Device-independent resources.
|
|
ID2D1Factory1* m_d2dFactory;
|
|
IWICImagingFactory2* m_wicFactory;
|
|
IDWriteFactory* m_dwriteFactory;
|
|
IDWriteTextFormat* m_textFormat;
|
|
IDWriteTextFormat* m_smallTextFormat;
|
|
ID2D1PathGeometry* m_pathGeometry;
|
|
|
|
// Device-dependent resources.
|
|
IDXGISwapChain* m_swapChain;
|
|
ID2D1Device* m_d2dDevice;
|
|
ID2D1DeviceContext* m_d2dContext;
|
|
ID2D1LinearGradientBrush* m_linearGradientBrush;
|
|
ID2D1SolidColorBrush* m_blackBrush;
|
|
ID2D1ImageBrush* m_gridPatternBrush;
|
|
ID2D1Bitmap* m_customBitmap;
|
|
|
|
// Printing-specific resources.
|
|
IStream* m_jobPrintTicketStream;
|
|
ID2D1PrintControl* m_printControl;
|
|
IPrintDocumentPackageTarget* m_documentTarget;
|
|
D2DPrintJobChecker* m_printJobChecker;
|
|
|
|
// Page size (in DIPs).
|
|
float m_pageHeight;
|
|
float m_pageWidth;
|
|
};
|