#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <commdlg.h>

HDC
CreatePrinterDC(void)
{
	PRINTDLG	pd;
	HDC hdc = 0;

	memset(&pd, 0, sizeof(pd));
	pd.lStructSize = sizeof(pd);
	pd.Flags = PD_RETURNDEFAULT;
	if (PrintDlg(&pd))
	{
		if (pd.hDevNames)
		{
			DEVNAMES *pdn = (DEVNAMES *) GlobalLock(pd.hDevNames);
			char const *pchDriver = (char *) pdn + pdn->wDriverOffset;
			char const *pchPort = (char *) pdn + pdn->wDriverOffset;
			char const *pchDeviceName = (char *) pdn + pdn->wDeviceOffset;

			if (pd.hDevMode)
			{
				DEVMODE *pdm = (DEVMODE *) GlobalLock(pd.hDevMode);

				hdc = CreateDC(pchDriver, pchDeviceName, pchPort, pdm);
				GlobalUnlock(pd.hDevMode);
				GlobalFree(pd.hDevMode);
			}
			GlobalUnlock(pd.hDevNames);
			GlobalFree(pd.hDevNames);
		}
	}
	return hdc;
}

LRESULT WINAPI
WndProc(	HWND hWnd,
		UINT wMsg,
		WPARAM wParam,
		LPARAM lParam)
{
	HDC	hdc;
	HDC	hdcPrint;
	PAINTSTRUCT ps;

	switch(wMsg)
	{
	case WM_LBUTTONDOWN:
		hdcPrint = CreatePrinterDC();
		if (hdcPrint)
			DeleteDC(hdcPrint);
		InvalidateRect(hWnd, 0, TRUE);
		return 0;

	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		SelectFont(hdc, GetStockFont(ANSI_VAR_FONT));
		SelectFont(hdc, GetStockFont(SYSTEM_FONT));
		ExtTextOut(hdc, 0, 0, 0, 0, "C", 1, 0);
		EndPaint(hWnd, &ps);
		return 0;

	case WM_CLOSE:
		DestroyWindow(hWnd);
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWnd, wMsg, wParam, lParam);
}

int WINAPI
WinMain(	HINSTANCE hInstance,
		HINSTANCE hInstancePrev,
		LPSTR lpCmdLine,
		int nCmdShow)
{
	WNDCLASS wndclass;
	MSG	msg;
	HWND	hwnd;

	memset(&wndclass, 0, sizeof(wndclass));

	wndclass.style = 0;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = 0;
	wndclass.hbrBackground = GetStockBrush(WHITE_BRUSH);
	wndclass.lpszClassName = "SysFontTest";

	RegisterClass(&wndclass);

	hwnd = 	CreateWindow(	"SysFontTest",
				"Left Click to Create Printer DC",
				WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_VISIBLE,
				CW_USEDEFAULT, 0,
				CW_USEDEFAULT, 0,
				0,
				0,
				hInstance,
				0);

	ShowWindow(hwnd, SW_SHOW);

	while(GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}
