< Àμâ ÀÛ¾÷ >

Áö±Ý±îÁöÀÇ Àμâ ÇÁ·Î±×·¥Àº  Àμâ Äڵ带 ´ÙÀ½°ú °°ÀÌ ¾²°í ÀÖ¾ú½À´Ï´Ù.

CPrinterDC dc(m_printerCur, m_devmodeCur);

 

DOCINFO di = {sizeof(di), _T("WTL¿¡ ÀÇÇÑ Àμâ Å×½ºÆ®")};

if(dc.StartDoc(&di) > 0){

    if(dc.StartPage() > 0){

        CRect rect(0, 0, dc.GetDeviceCaps(HORZRES), dc.GetDeviceCaps(VERTRES));

        Draw(dc, rect);

        if(dc.EndPage() > 0)

            dc.EndDoc();

    }

}

                      


WTL¿¡¼­´Â  ÀϹÝÀûÀÎ
Àμâ ó¸®(Àμâ ÀÛ¾÷)¸¦ CPrintJob Ŭ·¡½º¿Í CPrintJobInfo Ŭ·¡½º¿¡¼­ ĸ½¶È­Çϰí ÀÖ½À´Ï´Ù.  ÀÌ·¯ÇÑ Å¬·¡½º¸¦ »ç¿ëÇϸé StartDoc()³ª StartPage() ¸¦ ½º½º·Î ¾µ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ±×¸®°í Àμâ 󸮸¦ ´Ù¸¥ thread·Î ½Ç½ÃÇϵµ·Ï ÁöÁ¤ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.  ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº  Àüȸ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥ÀÇ Àμâ ó¸® Äڵ带 CPrintJobŬ·¡½º¿Í CPrintJobInfo Ŭ·¡½º¸¦ »ç¿ëÇØ °íÃÄ ¾²´Â ¿¹ÀÔ´Ï´Ù.

 

// 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;          // Àμâ ÀÛ¾÷

 

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)

        // ¿£Æ®¸® ¾øÀ½

    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_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){

        // ¸Þ½ÃÁö ·çÇÁ¿¡ ¸Þ¼¼Áö ÇÊÅÍ¿Í ¾ÆÀ̵¹ Çڵ鷯¸¦ Ãß°¡

        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 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;

}

                      


¡¡
¿ì¼± CPrintJobInfo Ŭ·¡½º¸¦ CMainFrame Ŭ·¡½ºÀÇ base class¿¡ Ãß°¡ÇÕ´Ï´Ù. ÀÌ CPrintJobInfo Ŭ·¡½º¿¡´Â ¸î °³ÀÇ °¡»ó ÇÔ¼ö°¡ ÁغñµÇ¾î ÀÖ¾î CPrintJobInfo Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º´Â ±×°ÍµéÀ» ¿À¹ö¶óÀ̵å(override) ÇØ Àμâ 󸮸¦ ±â¼úÇÕ´Ï´Ù.  CPrintJobInfoŬ·¡½º°¡ ÁغñÇØ ÀÖ´Â °¡»ó ÇÔ¼ö¸¦ ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.

ÇÔ¼ö¸í

ÇØ¼³

BeginPrintJob

Àμâ 󸮸¦ °³½ÃÇϱâ Àü(StartDoc()°¡ ºÒ·Á °£ Á÷ÈÄ) ÀÇ Ã³¸®

EndPrintJob

Àμâ 󸮸¦ Á¾·áÇÑ ÈÄ (EndDoc()°¡ ºÒ·Á °¡±â Á÷Àü) ÀÇ Ã³¸®

PrePrintPage

ÆäÀÌÁö¸¦ ÀμâÇϱâ Àü(StartPage()°¡ ºÒ·Á °£ Á÷ÈÄ) ÀÇ Ã³¸®

PostPrintPage

ÆäÀÌÁö¸¦ ÀμâÇÑ ÈÄ (EndPage()°¡ ºÒ·Á °¡±â Á÷Àü) ÀÇ Ã³¸®

PrintPage

ÆäÀÌÁöÀÇ Àμâ ó¸®

GetNewDevModeForPage

ÆäÀÌÁö µ¶ÀÚÀûÀÎDEVMODE¿¡ÀÇ Æ÷ÀÎÅ͸¦ Ãëµæ

IsValidPage

ÆäÀÌÁö°¡ À¯È¿ÇÑÁö ¾î¶²Áö¸¦ Áö½Ã


ÀÌ ¾È¿¡¼­ PrintPage()´Â ¼ø¼ö °¡»ó ÇÔ¼öÀ̱⠶§¹®¿¡  ¹Ýµå½Ã ¿À¹ö¶óÀ̵å(override) ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. À̹ø ¿¹ ¿¡¼­´Â CPrintJobInfo Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½ºÀÎ CMainFrame Ŭ·¡½º¿¡¼­ IsValidPage()¶ó°í PrintPage()¸¦ ¿À¹ö¶óÀ̵å(override) ÇÕ´Ï´Ù.

IsValidPage()Àº ÆäÀÌÁö ¹øÈ£°¡  0ÀÇ °æ¿ì¸¸ trueÀ» µ¹·ÁÁÖ¾î Àμâ ÀÛ¾÷À» °è¼ÓÇÏ´Â °ÍÀ» Áö½ÃÇÕ´Ï´Ù. À̰ÍÀº  À̹ø ÇÁ·Î±×·¥Àº ÃÖÃÊÀÇ ÆäÀÌÁö ¹Û¿¡ ÀμâÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù.

PrintPage()Àº ÇöÀçÀÇ ÆäÀÌÁö ¹øÈ£¸¦ È®ÀÎÇØ Draw()¸¦ È£ÃâÇØ Àμ⸦ ½Ç½ÃÇϰí ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ CPrintJob Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ CMainFrame Ŭ·¡½ºÀÇ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡  ¸Þ´º ¾ÆÀÌÅÛ [Àμâ](ID£ºID_FILE_PRINT) ¿ëÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ º¯°æÇÕ´Ï´Ù. ÀÌ Çڵ鷯 ¿¡¼­´Â CPrintJob Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼öÀÎ StartPrintJob()À» È£ÃâÇØ Àμâ ÀÛ¾÷À» °³½ÃÇÕ´Ï´Ù.  StartPrintJob()ÀÇ Àμö´Â ¼ø¼­¿¡ Àμâ ÀÛ¾÷À» À§Çؼ­  thread¸¦ ±âµ¿ÇÏ´ÂÁö ¾î¶²Áö¸¦ ³ªÅ¸³»´Â bool°ª,  ÇÁ¸°ÅÍ ÇÚµé DEVMODE¿¡ÀÇ Æ÷ÀÎÅÍ,  IPrintJobInfo Ŭ·¡½º¿¡ÀÇ Æ÷ÀÎÅÍ,  ¹®¼­¸í, °³½Ã ÆäÀÌÁö ¹øÈ£, Á¾·á ÆäÀÌÁö ¹øÈ£,  ÆÄÀÏ¿¡ Ãâ·ÂÇÏ´ÂÁö ¾î¶²Áö¸¦ ³ªÅ¸³»´Â bool°ª, Ãâ·Â ÆÄÀϸíÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. µ¡ºÙ¿© Á¦ 4ÀμöÀÇ IPrintJobInfo Ŭ·¡½º¶õ  CPrintJobInfo Ŭ·¡½ºÀÇ  base class ÀÔ´Ï´Ù. À̹ø ¿¹¿¡¼­´Â CMainFrame Ŭ·¡½º´Â CPrintJobInfo Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½ºÀ̱⠶§¹®¿¡  CMainFrame Ŭ·¡½º´Â °£Á¢ÀûÀ¸·Î IPrintJobInfoŬ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º¶ó´Â °ÍÀÌ µË´Ï´Ù.