< Àμ⠹̸® º¸±â >
¡¡WTLÀº Àμâ ÇÁ¸®ºä¿ë À©µµ¿ì¸¦ CPrintPreviewWindowImpl À̶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼ ĸ½¶ÈÇϰí ÀÖ½À´Ï´Ù. ÀÌ Å¬·¡½º´Â ATLÀÇCDialogImpl Ŭ·¡½º¿Í °°ÀÌ base class ·Î¼ »ç¿ëÇÕ´Ï´Ù. atlprint.h Çì´õ¿¡¼´Â CPrintPreviewWindowImpl Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º·Î¼ CPrintPreviewWindow Ŭ·¡½º°¡ Á¤Àǵǰí ÀÖ½À´Ï´Ù.
|
// atlprint.h class CPrintPreviewWindow : public CPrintPreviewWindowImpl<CPrintPreviewWindow> { ... ... |
¡¡ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº Àüȸ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥À» °íÃÄ ½á, Àμâ ÇÁ¸®ºä ±â´ÉÀ» Ãß°¡ÇÏ´Â ¿¹ÀÔ´Ï´Ù. ¸Þ´ºÀÇ [Àμâ ÇÁ¸®ºä]¸¦ ½ÇÇàÇÒ ¶§¸¶´Ù Àμâ ÇÁ¸®ºä À©µµ¿ìÀÇ Ç¥½Ã/ºñÇ¥½Ã¸¦ »õ·Î ¹Ù²ß´Ï´Ù.

|
// stdafx.h #include <atlbase.h> #include <atlapp.h> extern CAppModule _Module; #include <atlwin.h> #include <atlcrack.h> #include <atlmisc.h> #include <atlframe.h> #include <atldlgs.h> #include <atlprint.h> |
|
// mainfrm.h class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler, public CPrintJobInfo { CPrinter
m_printerCur;
// ÇöÀçÀÇ ÇÁ¸°ÅÍ ÇÚµé CDevMode
m_devmodeCur;
// ÇöÀçÀÇ ÇÁ¸°ÅÍÀÇ ¼³Á¤ CPrintJob
m_job;
// Àμâ ÀÛ¾÷ CPrintPreviewWindow
m_wndPreview;
// Àμâ ÇÁ¸®ºä À©µµ¿ì public:
DECLARE_FRAME_WND_CLASS_EX(_T("WTL:PrintSample"),
IDR_MAINFRAME,
CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, COLOR_WINDOW) // constructor¡¡ ¡¡ CMainFrame(){ // µðÆúÆ® ÇÁ¸°Å͸¦ ¿ÀÇ m_printerCur.OpenDefaultPrinter(); m_devmodeCur.CopyFromPrinter(m_printerCur); } virtual
BOOL PreTranslateMessage(MSG* pMsg){ return CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg); } virtual
BOOL OnIdle(){ return FALSE; } BEGIN_UPDATE_UI_MAP(CMainFrame) UPDATE_ELEMENT(ID_FILE_PRINT_PREVIEW,
UPDUI_MENUPOPUP) END_UPDATE_UI_MAP() BEGIN_MSG_MAP_EX(CMainFrame)
MSG_WM_PAINT(OnPaint)
MSG_WM_CREATE(OnCreate)
COMMAND_ID_HANDLER_EX(ID_FILE_PRINT, OnFilePrint)
COMMAND_ID_HANDLER_EX(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
COMMAND_ID_HANDLER_EX(ID_FILE_PRINT_SETUP, OnFilePrintSetup)
COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnMenuExit)
CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>) END_MSG_MAP() virtual bool IsValidPage(UINT
nPage){ // ÃÖÃÊÀÇ ÆäÀÌÁö¸¸ Àμâ return (nPage == 0); } virtual bool PrintPage(UINT nPage, HDC hDC){ // ÃÖÃÊÀÇ ÆäÀÌÁö¸¸ Àμâ if(nPage >= 1)
return false; CRect rect(0, 0,
::GetDeviceCaps(hDC,
HORZRES), ::GetDeviceCaps(hDC,
VERTRES));
Draw(hDC, rect); return true; } void
Draw(HDC hDC, CRect& rect){ CDCHandle dc(hDC); dc.DrawText(_T("Hello, ATL/WTL"), -1,
rect, DT_CENTER | DT_VCENTER |
DT_SINGLELINE); } void OnPaint(HDC /*hDC*/){ CPaintDC dc(m_hWnd); CRect rect; GetClientRect(rect);
Draw(dc, rect); } LRESULT OnCreate(LPCREATESTRUCT lpcs){ UISetCheck(ID_FILE_PRINT_PREVIEW, false); // ¸Þ½ÃÁö ·çÇÁ¿¡ ¸Þ¼¼Áö ÇÊÅÍ¿Í
¾ÆÀ̵¹ Çڵ鷯¸¦ Ãß°¡ CMessageLoop* pLoop = _Module.GetMessageLoop(); pLoop->AddMessageFilter(this); pLoop->AddIdleHandler(this); return 0; } void OnFilePrint(UINT uNotifyCode, int nID, HWND hWndCtl){ CPrintDialog dlg; // ´ÙÀ̾ó·Î±×¸¦ ÃʱâÈ dlg.m_pd.hDevMode = m_devmodeCur.CopyToHDEVMODE(); dlg.m_pd.hDevNames = m_printerCur.CopyToHDEVNAMES(); if(dlg.DoModal() == IDOK){
// ÇÁ¸°ÅÍÀÇ ¼³Á¤À» º¸Á¸
m_devmodeCur.CopyFromHDEVMODE(dlg.m_pd.hDevMode);
// ÇöÀçÀÇ ÇÁ¸°ÅÍ ÇÚµéÀ» Ŭ·Î¿ìÁî ÇØ , »õ·Î¿î ÇÚµéÀ» ¿ÀÇÂ
m_printerCur.ClosePrinter();
m_printerCur.OpenPrinter(dlg.m_pd.hDevNames,
m_devmodeCur);
// Àμâ ÀÛ¾÷À» °³½Ã
m_job.StartPrintJob(false, m_printerCur, m_devmodeCur, this,
_T("WTL¿¡ ÀÇÇÑ Àμâ Å×½ºÆ®"), 0, 0, (dlg.PrintToFile() != FALSE)); } // ´ÙÀ̾ó·Î±×ÀÇ ÃʱâÈ·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇØ¹æ ::GlobalFree(dlg.m_pd.hDevMode); ::GlobalFree(dlg.m_pd.hDevNames); } void OnFilePrintPreview(UINT uNotifyCode,
int nID, HWND hWndCtl){ static bool bPreview = false; if(bPreview){
// Àμâ ÇÁ¸®ºä À©µµ¿ì¸¦ ÆÄ±â
m_hWndClient
= NULL;
m_wndPreview.DestroyWindow(); }else{
// Àμâ ÇÁ¸®ºä À©µµ¿ì¸¦ ÀÛ¼º
m_wndPreview.SetPrintPreviewInfo(m_printerCur, m_devmodeCur, this, 0, 0);
m_wndPreview.SetPage(0);
m_wndPreview.Create(m_hWnd,
rcDefault, NULL, 0, WS_EX_CLIENTEDGE);
m_hWndClient = m_wndPreview; } bPreview = !bPreview; UISetCheck(ID_FILE_PRINT_PREVIEW, bPreview); UpdateLayout(); } void OnFilePrintSetup(UINT uNotifyCode,
int nID, HWND hWndCtl){ CPageSetupDialog dlg; // ´ÙÀ̾ó·Î±×¸¦ ÃʱâÈ dlg.m_psd.hDevMode = m_devmodeCur.CopyToHDEVMODE(); dlg.m_psd.hDevNames = m_printerCur.CopyToHDEVNAMES(); if(dlg.DoModal() == IDOK){
// ÇÁ¸°ÅÍÀÇ ¼³Á¤À» º¸Á¸
m_devmodeCur.CopyFromHDEVMODE(dlg.m_psd.hDevMode);
// ÇöÀçÀÇ ÇÁ¸°ÅÍ ÇÚµéÀ» Ŭ·Î¿ìÁî ÇØ , »õ·Î¿î ÇÚµéÀ» ¿ÀÇÂ
m_printerCur.ClosePrinter();
m_printerCur.OpenPrinter(dlg.m_psd.hDevNames,
m_devmodeCur);
} // ´ÙÀ̾ó·Î±×ÀÇ ÃʱâÈ·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇØ¹æ ::GlobalFree(dlg.m_psd.hDevMode); ::GlobalFree(dlg.m_psd.hDevNames); } void OnMenuExit(UINT uNotifyCode, int nID, HWND hWndCtl){ PostMessage(WM_CLOSE); } }; |
|
// app.cpp #include "stdafx.h" #include "resource.h" #include "mainfrm.h" CAppModule _Module; int WINAPI _tWinMain(HINSTANCE
hInstance, HINSTANCE, LPTSTR lpCmdLine,
int nCmdShow) { HRESULT hRes = ::CoInitialize(NULL); ATLASSERT(SUCCEEDED(hRes)); ::DefWindowProc(NULL,
0, 0, 0L); AtlInitCommonControls(ICC_COOL_CLASSES
| ICC_WIN95_CLASSES); hRes
= _Module.Init(NULL, hInstance); ATLASSERT(SUCCEEDED(hRes)); int nRet = 0; // BLOCK: ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇà { CMessageLoop theLoop; _Module.AddMessageLoop(&theLoop); CMainFrame wnd; wnd.CreateEx(); wnd.ShowWindow(nCmdShow); wnd.UpdateWindow(); nRet = theLoop.Run(); _Module.RemoveMessageLoop(); } _Module.Term(); ::CoUninitialize(); return nRet; } |
¡¡¿ì¼± µµ±¸¸ðÀ½ ÀÚ¿øÀÇ [ÆÄÀÏ] ¾Æ·¡¿¡ [Àμâ ÇÁ¸®ºä] ¸Þ´º ¾ÆÀÌÅÛÀ» Ãß°¡ÇÏ¿© ID ·Î¼ ID_FILE_PRINT_PREVIEW¸¦ ¼³Á¤ÇÕ´Ï´Ù.
¡¡´ÙÀ½À¸·Î CPrintPreviewWindow Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ CMainFrame Ŭ·¡½ºÀÇ ¸â¹ö º¯¼ö·Î¼ ¼±¾ðÇÕ´Ï´Ù.
¡¡´ÙÀ½À¸·Î ¸Þ´º ¾ÆÀÌÅÛ [Àμâ ÇÁ¸®ºä](ID£ºID_FILE_PRINT_PREVIEW) ¿ëÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ Çڵ鷯 ¿¡¼´Â ¿ì¼± bPreviewÀ̶ó°í ÇÏ´Â Á¤Àû º¯¼ö¸¦ ¼±¾ðÇÕ´Ï´Ù. ÀÌ º¯¼ö´Â Àμâ ÇÁ¸®ºä À©µµ¿ì »óŸ¦ º¸°ü À¯ÁöÇÕ´Ï´Ù.
Àμâ ÇÁ¸®ºä À©µµ¿ì¸¦ ÀÛ¼ºÇϱâ À§Çؼ´Â ¿ì¼± SetPrintPreviewInfo()À» È£ÃâÇÕ´Ï´Ù. ÀÌ ÇÔ¼öÀÇ Àμö´Â ¼ø¼¿¡ ÇÁ¸°ÅÍ ÇÚµé DEVMODE ±¸Á¶Ã¼¿¡ÀÇ Æ÷ÀÎÅÍ IPrintJobInfo Ŭ·¡½º¿¡ÀÇ Æ÷ÀÎÅÍ, ÃÖ¼Ò ÆäÀÌÁö, ÃÖ´ë ÆäÀÌÁö¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½¿¡ SetPage()¸¦ È£ÃâÇØ ÃÖÃʷΠǥ½ÃÇÏ´Â ÆäÀÌÁö¸¦ ÁöÁ¤ÇÏ¿© Create()¸¦ È£ÃâÇØ Àμâ ÇÁ¸®ºä À©µµ¿ì¸¦ ÀÛ¼ºÇÕ´Ï´Ù.