亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? atlprint.h

?? WTL7.0所有頭文件,需要的朋友可以成這里下載
?? H
?? 第 1 頁 / 共 2 頁
字號:
	}
	operator HANDLE() const { return m_hDevMode; }
	operator DEVMODE*() const { return m_pDevMode; }

// Implementation
	void Cleanup()
	{
		if (m_hDevMode != NULL)
		{
			GlobalUnlock(m_hDevMode);
			if(t_bManaged)
				GlobalFree(m_hDevMode);
			m_hDevMode = NULL;
		}
	}
};

typedef CDevModeT<false>	CDevModeHandle;
typedef CDevModeT<true> 	CDevMode;


class CPrinterDC : public CDC
{
public:
// Constructors/destructor
	CPrinterDC()
	{
		CPrinter printer;
		printer.OpenDefaultPrinter();
		Attach(printer.CreatePrinterDC());
		ATLASSERT(m_hDC != NULL);
	}
	CPrinterDC(HANDLE hPrinter, const DEVMODE* pdm = NULL)
	{
		CPrinterHandle p;
		p.Attach(hPrinter);
		Attach(p.CreatePrinterDC(pdm));
		ATLASSERT(m_hDC != NULL);
	}
	~CPrinterDC()
	{
		DeleteDC();
	}
};


//Defines callbacks used by CPrintJob (not a COM interface)
class ATL_NO_VTABLE IPrintJobInfo
{
public:
	virtual void BeginPrintJob(HDC hDC) = 0;		// allocate handles needed, etc.
	virtual void EndPrintJob(HDC hDC, bool bAborted) = 0;	// free handles, etc.
	virtual void PrePrintPage(UINT nPage, HDC hDC) = 0;
	virtual bool PrintPage(UINT nPage, HDC hDC) = 0;
	virtual void PostPrintPage(UINT nPage, HDC hDC) = 0;
	// If you want per page devmodes, return the DEVMODE* to use for nPage.
	// You can optimize by only returning a new DEVMODE* when it is different
	// from the one for nLastPage, otherwise return NULL.
	// When nLastPage==0, the current DEVMODE* will be the default passed to
	// StartPrintJob.
	// Note: During print preview, nLastPage will always be "0".
	virtual DEVMODE* GetNewDevModeForPage(UINT nLastPage, UINT nPage) = 0;
	virtual bool IsValidPage(UINT nPage) = 0;
};


// Provides a default implementatin for IPrintJobInfo
// Typically, MI'd into a document or view class
class ATL_NO_VTABLE CPrintJobInfo : public IPrintJobInfo
{
public:
	virtual void BeginPrintJob(HDC /*hDC*/) //allocate handles needed, etc
	{
	}
	virtual void EndPrintJob(HDC /*hDC*/, bool /*bAborted*/)	// free handles, etc
	{
	}
	virtual void PrePrintPage(UINT /*nPage*/, HDC hDC)
	{
		m_nPJState = ::SaveDC(hDC);
	}
	virtual bool PrintPage(UINT /*nPage*/, HDC /*hDC*/) = 0;
	virtual void PostPrintPage(UINT /*nPage*/, HDC hDC)
	{
		RestoreDC(hDC, m_nPJState);
	}
	virtual DEVMODE* GetNewDevModeForPage(UINT /*nLastPage*/, UINT /*nPage*/)
	{
		return NULL;
	}
	virtual bool IsValidPage(UINT /*nPage*/)
	{
		return true;
	}

// Implementation - data
	int m_nPJState;
};


// Wraps a set of tasks for a specific printer (StartDoc/EndDoc)
// Handles aborting, background printing
class CPrintJob
{
public:
// Data members
	CPrinterHandle m_printer;
	IPrintJobInfo* m_pInfo;
	DEVMODE* m_pDefDevMode;
	DOCINFO m_docinfo;
	int m_nJobID;
	bool m_bCancel;
	bool m_bComplete;
	unsigned long m_nStartPage;
	unsigned long m_nEndPage;

// Constructor/destructor
	CPrintJob() : m_nJobID(0), m_bCancel(false), m_bComplete(true)
	{ }

	~CPrintJob()
	{
		ATLASSERT(IsJobComplete()); //premature destruction?
	}

// Operations
	bool IsJobComplete() const
	{
		return m_bComplete;
	}

	bool StartPrintJob(bool bBackground, HANDLE hPrinter, DEVMODE* pDefaultDevMode,
			IPrintJobInfo* pInfo, LPCTSTR lpszDocName, 
			unsigned long nStartPage, unsigned long nEndPage)
	{
		ATLASSERT(m_bComplete); //previous job not done yet?
		if (pInfo == NULL)
			return false;
		memset(&m_docinfo, 0, sizeof(m_docinfo));
		m_docinfo.cbSize = sizeof(m_docinfo);
		m_docinfo.lpszDocName = lpszDocName;
		m_pInfo = pInfo;
		m_nStartPage = nStartPage;
		m_nEndPage = nEndPage;
		m_printer.Attach(hPrinter);
		m_pDefDevMode = pDefaultDevMode;
		m_bComplete = false;
		if (!bBackground)
		{
			m_bComplete = true;
			return StartHelper();
		}

		//Create a thread and return
		DWORD dwThreadID = 0;
		HANDLE hThread = ::CreateThread(NULL, 0, StartProc, (void*)this, 0, &dwThreadID);
		::CloseHandle(hThread);

		return (hThread != NULL);
	}

// Implementation
	static DWORD WINAPI StartProc(void* p)
	{
		CPrintJob* pThis = (CPrintJob*)p;
		pThis->StartHelper();
		pThis->m_bComplete = true;
		return 0;
	}
	bool StartHelper()
	{
		CDC dcPrinter;
		dcPrinter.Attach(m_printer.CreatePrinterDC(m_pDefDevMode));
		if (dcPrinter.IsNull())
			return false;
			
		m_nJobID = ::StartDoc(dcPrinter, &m_docinfo);
		if (m_nJobID <= 0)
			return false;

		m_pInfo->BeginPrintJob(dcPrinter);

		//print all the pages now
		unsigned long nLastPage = 0;
		for (unsigned long nPage = m_nStartPage; nPage <= m_nEndPage; nPage++)
		{
			if (!m_pInfo->IsValidPage(nPage))
				break;
			DEVMODE* pdm = m_pInfo->GetNewDevModeForPage(nLastPage, nPage);
			if (pdm != NULL)
				dcPrinter.ResetDC(pdm);
			dcPrinter.StartPage();
			m_pInfo->PrePrintPage(nPage, dcPrinter);
			if (!m_pInfo->PrintPage(nPage, dcPrinter))
				m_bCancel = true;
			m_pInfo->PostPrintPage(nPage, dcPrinter);
			dcPrinter.EndPage();
			if (m_bCancel)
				break;
			nLastPage = nPage;
		}

		m_pInfo->EndPrintJob(dcPrinter, m_bCancel);
		if (m_bCancel)
			::AbortDoc(dcPrinter);
		else
			::EndDoc(dcPrinter);
		m_nJobID = 0;
		return true;
	}
	// Cancels a print job.	Can be called asynchronously.
	void CancelPrintJob()
	{
		m_bCancel = true;
	}
};


// Adds print preview support to an existing window
class CPrintPreview
{
public:
// Data members
	IPrintJobInfo* m_pInfo;
	CPrinterHandle m_printer;
	CEnhMetaFile m_meta;
	DEVMODE* m_pDefDevMode;
	DEVMODE* m_pCurDevMode;
	SIZE m_sizeCurPhysOffset;

// Constructor
	CPrintPreview() : m_pInfo(NULL), m_pDefDevMode(NULL), m_pCurDevMode(NULL)
	{
		m_sizeCurPhysOffset.cx = 0;
		m_sizeCurPhysOffset.cy = 0;
	}

// Operations
	void SetPrintPreviewInfo(HANDLE hPrinter, DEVMODE* pDefaultDevMode, IPrintJobInfo* pji)
	{
		m_printer.Attach(hPrinter);
		m_pDefDevMode = pDefaultDevMode;
		m_pInfo = pji;
		m_nCurPage = 0;
		m_pCurDevMode = NULL;
	}
	void SetEnhMetaFile(HENHMETAFILE hEMF)
	{
		m_meta = hEMF;
	}
	void SetPage(int nPage)
	{
		if (!m_pInfo->IsValidPage(nPage))
			return;
		m_nCurPage = nPage;
		m_pCurDevMode = m_pInfo->GetNewDevModeForPage(0, nPage);
		if (m_pCurDevMode == NULL)
			m_pCurDevMode = m_pDefDevMode;
		CDC dcPrinter = m_printer.CreatePrinterDC(m_pCurDevMode);

		int iWidth = dcPrinter.GetDeviceCaps(PHYSICALWIDTH); 
		int iHeight = dcPrinter.GetDeviceCaps(PHYSICALHEIGHT); 
		int nLogx = dcPrinter.GetDeviceCaps(LOGPIXELSX);
		int nLogy = dcPrinter.GetDeviceCaps(LOGPIXELSY);

		RECT rcMM = { 0, 0, ::MulDiv(iWidth, 2540, nLogx), ::MulDiv(iHeight, 2540, nLogy) };

		m_sizeCurPhysOffset.cx = dcPrinter.GetDeviceCaps(PHYSICALOFFSETX);
		m_sizeCurPhysOffset.cy = dcPrinter.GetDeviceCaps(PHYSICALOFFSETY);
		
		CEnhMetaFileDC dcMeta(dcPrinter, &rcMM);
		m_pInfo->PrePrintPage(nPage, dcMeta);
		m_pInfo->PrintPage(nPage, dcMeta);
		m_pInfo->PostPrintPage(nPage, dcMeta);
		m_meta.Attach(dcMeta.Close());
	}
	void GetPageRect(RECT& rc, LPRECT prc)
	{
		int x1 = rc.right-rc.left;
		int y1 = rc.bottom - rc.top;
		if ((x1 < 0) || (y1 < 0))
			return;

		CEnhMetaFileInfo emfinfo(m_meta);
		ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader();

		//Compute whether we are OK vertically or horizontally
		int x2 = pmh->szlDevice.cx;
		int y2 = pmh->szlDevice.cy;
		int y1p = MulDiv(x1, y2, x2);
		int x1p = MulDiv(y1, x2, y2);
		ATLASSERT( (x1p <= x1) || (y1p <= y1));
		if (x1p <= x1)
		{
			prc->left = rc.left + (x1 - x1p)/2;
			prc->right = prc->left + x1p;
			prc->top = rc.top;
			prc->bottom = rc.bottom;
		}
		else
		{
			prc->left = rc.left;
			prc->right = rc.right;
			prc->top = rc.top + (y1 - y1p)/2;
			prc->bottom = prc->top + y1p;
		}
	}

// Painting helper
	void DoPaint(CDCHandle dc, RECT& rc)
	{
		CEnhMetaFileInfo emfinfo(m_meta);
		ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader();
		int nOffsetX = MulDiv(m_sizeCurPhysOffset.cx, rc.right-rc.left, pmh->szlDevice.cx);
		int nOffsetY = MulDiv(m_sizeCurPhysOffset.cy, rc.bottom-rc.top, pmh->szlDevice.cy);

		dc.OffsetWindowOrg(-nOffsetX, -nOffsetY);
		dc.PlayMetaFile(m_meta, &rc);
	}

// Implementation - data
	int m_nCurPage;
};

template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CPrintPreviewWindowImpl : public CWindowImpl<T, TBase, TWinTraits>, public CPrintPreview
{
public:
	DECLARE_WND_CLASS_EX(NULL, CS_VREDRAW | CS_HREDRAW, -1)

	enum { m_cxOffset = 10, m_cyOffset = 10 };

// Constructor
	CPrintPreviewWindowImpl() : m_nMaxPage(0), m_nMinPage(0)
	{ }

// Operations
	void SetPrintPreviewInfo(HANDLE hPrinter, DEVMODE* pDefaultDevMode, 
		IPrintJobInfo* pji, int nMinPage, int nMaxPage)
	{
		CPrintPreview::SetPrintPreviewInfo(hPrinter, pDefaultDevMode, pji);
		m_nMinPage = nMinPage;
		m_nMaxPage = nMaxPage;
	}
	bool NextPage()
	{
		if (m_nCurPage == m_nMaxPage)
			return false;
		SetPage(m_nCurPage + 1);
		Invalidate();
		return true;
	}
	bool PrevPage()
	{
		if (m_nCurPage == m_nMinPage)
			return false;
		if (m_nCurPage == 0)
			return false;
		SetPage(m_nCurPage - 1);
		Invalidate();
		return true;
	}

// Message map and handlers
	BEGIN_MSG_MAP(CPrintPreviewWindowImpl)
		MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
		MESSAGE_HANDLER(WM_PAINT, OnPaint)
	END_MSG_MAP()

	LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		return 1;	// no need for the background
	}

	LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		T* pT = static_cast<T*>(this);
		CPaintDC dc(m_hWnd);
		RECT rcClient;
		GetClientRect(&rcClient);
		RECT rcArea = rcClient;
		::InflateRect(&rcArea, -pT->m_cxOffset, -pT->m_cyOffset);
		if (rcArea.left > rcArea.right)
			rcArea.right = rcArea.left;
		if (rcArea.top > rcArea.bottom)
			rcArea.bottom = rcArea.top;
		RECT rc;
		GetPageRect(rcArea, &rc);
		CRgn rgn1, rgn2;
		rgn1.CreateRectRgnIndirect(&rc);
		rgn2.CreateRectRgnIndirect(&rcClient);
		rgn2.CombineRgn(rgn1, RGN_DIFF);
		dc.SelectClipRgn(rgn2);
		dc.FillRect(&rcClient, COLOR_BTNSHADOW);
		dc.SelectClipRgn(NULL);
		dc.FillRect(&rc, (HBRUSH)::GetStockObject(WHITE_BRUSH));
		pT->DoPaint(dc.m_hDC, rc);
		return 0;
	}

// Implementation - data
	int m_nMinPage;
	int m_nMaxPage;
};


class CPrintPreviewWindow : public CPrintPreviewWindowImpl<CPrintPreviewWindow>
{
public:
	DECLARE_WND_CLASS_EX(_T("WTL_PrintPreview"), CS_VREDRAW | CS_HREDRAW, -1)
};

}; //namespace WTL

#endif // __ATLPRINT_H__

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
97se亚洲国产综合在线| 国产欧美日韩中文久久| 在线观看www91| 99精品国产视频| av亚洲精华国产精华| 成人高清视频在线| 成人午夜大片免费观看| 成熟亚洲日本毛茸茸凸凹| 国产成人免费视| 国产成人在线看| 高清日韩电视剧大全免费| 国v精品久久久网| 99视频精品全部免费在线| 91亚洲精品久久久蜜桃网站 | 色狠狠综合天天综合综合| 99精品国产99久久久久久白柏| 欧美精品在线观看播放| 欧美色手机在线观看| 91.xcao| 日韩免费成人网| 久久嫩草精品久久久久| 国产精品成人网| 亚洲自拍偷拍欧美| 日本一区中文字幕| 国产一区二区三区免费看| 成人免费看视频| 欧美性视频一区二区三区| 9191久久久久久久久久久| 日韩免费观看高清完整版 | 国产欧美精品一区二区三区四区 | 国产精品18久久久| 99精品视频中文字幕| 在线看国产日韩| 欧美一区二区三区喷汁尤物| 久久久三级国产网站| 亚洲天堂免费在线观看视频| 亚洲国产欧美一区二区三区丁香婷| 视频在线在亚洲| 国产精品一区二区久激情瑜伽| 成人国产精品免费| 在线不卡中文字幕| 国产女同性恋一区二区| 一区二区视频在线| 美女一区二区在线观看| 成人黄色在线视频| 制服丝袜日韩国产| 国产精品嫩草影院com| 午夜av一区二区| 成人自拍视频在线观看| 色婷婷久久一区二区三区麻豆| 欧美放荡的少妇| 国产精品久久久久久久久搜平片 | 欧美影院一区二区| 欧美精品一区二区三区很污很色的| 国产精品欧美久久久久无广告| 午夜精品久久久久久久久久| 国产一区福利在线| 欧美精品精品一区| 中文字幕一区二区在线观看| 日日夜夜一区二区| 色久优优欧美色久优优| 久久久久久久久久美女| 亚洲精品成人a在线观看| 国产伦精一区二区三区| 欧美精品高清视频| 自拍偷拍亚洲综合| 狠狠色综合播放一区二区| 欧美日韩视频在线一区二区| 国产精品久久久久影院亚瑟| 美国十次了思思久久精品导航| 一本色道久久综合亚洲91| 久久久综合精品| 另类小说综合欧美亚洲| 欧美午夜电影在线播放| 国产精品国模大尺度视频| 韩国理伦片一区二区三区在线播放| 在线观看免费亚洲| 日韩极品在线观看| 91欧美一区二区| 国产三级久久久| 久久99久久精品欧美| 欧美日韩第一区日日骚| 亚洲欧美日韩国产一区二区三区| 国产精品一区二区你懂的| 欧美成人综合网站| 日本特黄久久久高潮| 欧美日韩午夜精品| 亚洲午夜日本在线观看| 色婷婷久久一区二区三区麻豆| 国产精品午夜春色av| 国产麻豆91精品| 久久精品一区二区三区av| 美女一区二区三区在线观看| 欧美电影在哪看比较好| 亚洲一区二区三区小说| 91免费国产在线| 亚洲天堂网中文字| 色婷婷综合久久久中文一区二区| 国产精品护士白丝一区av| 成人高清免费在线播放| 中文字幕在线观看不卡| 波多野洁衣一区| 日韩一区日韩二区| 91猫先生在线| 亚洲一区二区3| 欧美在线观看一二区| 亚洲愉拍自拍另类高清精品| 91福利在线观看| 亚洲国产综合在线| 4hu四虎永久在线影院成人| 偷拍日韩校园综合在线| 欧美精品久久一区| 免费精品视频最新在线| 26uuu久久天堂性欧美| 国产一区二区毛片| 日本一区二区免费在线| 成人97人人超碰人人99| 亚洲乱码日产精品bd| 欧美丝袜丝nylons| 日本女人一区二区三区| 日韩欧美国产1| 韩国一区二区三区| 国产精品丝袜久久久久久app| av在线不卡电影| 亚洲国产日韩a在线播放| 欧美一级黄色大片| 国产91综合网| 亚洲精品网站在线观看| 欧美日本一区二区在线观看| 激情亚洲综合在线| 中文字幕第一区综合| 91福利精品视频| 毛片基地黄久久久久久天堂| 久久久久久久一区| 色婷婷精品大在线视频| 日韩经典中文字幕一区| 久久久精品中文字幕麻豆发布| 99热在这里有精品免费| 亚洲成a人片综合在线| 日韩午夜小视频| 波多野结衣中文一区| 亚洲成人免费在线观看| 久久综合九色综合97婷婷女人| 不卡一区二区中文字幕| 午夜视频一区在线观看| 久久精品夜色噜噜亚洲a∨| 色综合欧美在线| 久久精品国产精品亚洲红杏| 欧美激情综合网| 欧美日韩国产首页| 精油按摩中文字幕久久| 国产日韩影视精品| 欧美亚洲综合一区| 国产一区二区三区av电影| 亚洲精品视频在线观看网站| 欧美一级xxx| 本田岬高潮一区二区三区| 亚洲高清在线视频| 国产无一区二区| 欧美一区二区三区在线观看| www.亚洲国产| 老司机精品视频导航| 亚洲欧洲精品天堂一级| 日韩欧美国产高清| 91久久国产综合久久| 国产伦理精品不卡| 视频一区视频二区中文字幕| 中文字幕一区二区三中文字幕| 日韩三级免费观看| 在线精品观看国产| 大白屁股一区二区视频| 美女视频第一区二区三区免费观看网站| 欧美国产视频在线| 日韩精品一区二区三区在线 | 国产99久久久久| 视频一区二区不卡| 一区二区免费在线| 欧美经典三级视频一区二区三区| 5566中文字幕一区二区电影 | 欧美激情一区二区三区| 91麻豆精品国产91久久久使用方法| 97精品电影院| 国产成人一区二区精品非洲| 日韩国产一区二| 亚洲高清在线视频| 亚洲精品久久7777| 日本一区二区动态图| 精品999在线播放| 91精品国模一区二区三区| 91官网在线免费观看| 91在线porny国产在线看| 国产91色综合久久免费分享| 久久66热re国产| 蜜臀av一级做a爰片久久| 肉肉av福利一精品导航| 亚洲一区影音先锋| 亚洲另类春色校园小说| 中文字幕中文字幕一区二区| 久久久久国色av免费看影院| 精品福利二区三区|