< Àμâ ÇÁ·ÓÆÛƼ ½ÃÆ® >

Windows 2000 ÀÌÈÄ¿¡¼­´Â Àμ⠴ÙÀ̾ó·Î±× ´ë½Å¿¡ Àμâ ÇÁ·ÓÆÛƼ ½ÃÆ®¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.  WTLÀº Àμâ ÇÁ·ÓÆÛƼ ½ÃÆ®¸¦ CPrintDialogExImpl À̶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼­ ĸ½¶È­Çϰí ÀÖ½À´Ï´Ù.  ÀÌ Å¬·¡½º´Â ATLÀÇ CDialogImpl Ŭ·¡½º¿Í °°ÀÌ base class·Î¼­ º¸°í »ç¿ëÇÕ´Ï´Ù. atldlgs.h Çì´õ¿¡¼­´Â CPrintDialogExImpl Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º·Î¼­ CPrintDialogEx Ŭ·¡½º°¡ Á¤ÀÇ µÇ°í ÀÖ½À´Ï´Ù.

// atldlgs.h

class CPrintDialogEx : public CPrintDialogExImpl<CPrintDialogEx>

{

    ...

    ...

                      


¡¡WTL
ÀÇ CPrintDialogEx Ŭ·¡½ºÀÇ »ç¿ë¹ýÀº CPrintDialog Ŭ·¡½º¿Í °ÅÀÇ °°½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº Àüȸ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥À» °íÃÄ ½á  CPrintDialogEx Ŭ·¡½º·ÎºÎÅÍ ÇÁ¸°ÅÍ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

// stdafx.h

#define WINVER    0x0500

 

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlframe.h>

#include <atldlgs.h>  // CPrintDialogExŬ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ(¶§¹®¿¡)

#include <atlprint.h>

                      

 

// mainfrm.h

class CMainFrame : public CFrameWindowImpl<CMainFrame>,

    public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler

{

    CPrinter m_printerCur;    // ÇöÀçÀÇ ÇÁ¸°ÅÍ ÇÚµé

    CDevMode m_devmodeCur;    // ÇöÀçÀÇ ÇÁ¸°ÅÍÀÇ ¼³Á¤

 

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_APP_EXIT, OnMenuExit)

        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)

        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)

    END_MSG_MAP()

 

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

        CPrintDialogEx dlg;

 

        // ´ÙÀ̾ó·Î±×¸¦ ÃʱâÈ­

        dlg.m_pdex.hDevMode = m_devmodeCur.CopyToHDEVMODE();

        dlg.m_pdex.hDevNames = m_printerCur.CopyToHDEVNAMES();

 

        if(SUCCEEDED(dlg.DoModal())){

            // [Àμâ]¹öư ¶Ç´Â[Àû¿ë]¹öưÀ» ´­·¶À» °æ¿ì

            if(dlg.m_pdex.dwResultAction == PD_RESULT_PRINT ||

                dlg.m_pdex.dwResultAction == PD_RESULT_APPLY)

            {

                // ÇÁ¸°ÅÍÀÇ ¼³Á¤À» º¸Á¸

                m_devmodeCur.CopyFromHDEVMODE(dlg.m_pdex.hDevMode);

 

                // ÇöÀçÀÇ ÇÁ¸°ÅÍ ÇÚµéÀ» Ŭ·Î¿ìÁî ÇØ , »õ·Î¿î ÇÚµéÀ» ¿ÀÇÂ

                m_printerCur.ClosePrinter();

                m_printerCur.OpenPrinter(dlg.m_pdex.hDevNames, m_devmodeCur);

            }

 

            // [Àμâ]¹öưÀ» ´­·¶À» °æ¿ì

            if(dlg.m_pdex.dwResultAction == PD_RESULT_PRINT){

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

                    }

                }

            }

        }

 

        // ´ÙÀ̾ó·Î±×ÀÇ ÃʱâÈ­·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇØ¹æ

        ::GlobalFree(dlg.m_pdex.hDevMode);

        ::GlobalFree(dlg.m_pdex.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;

}

                      


¡¡
¿ì¼± stdafx.h ¿¡¼­´Â CPrintDialogEx Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­  WINVER¸¦ 0x0500¿¡ Á¤ÀÇÇÏ°í ³ª¼­ atldlgs.h Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡  ¸Þ´º ¾ÆÀÌÅÛ [Àμâ](ID£ºID_FILE_PRINT) ¿ëÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ º¯°æÇÕ´Ï´Ù. ÀÌ Çڵ鷯 ¿¡¼­´Â ¿ì¼± CPrintDialogEx Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇÕ´Ï´Ù. CPrintDialogEx Ŭ·¡½ºÀÇ constructorÀμö´Â ¸ðµÎ »ý·« ÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸ ,  Á¦1Àμö¿¡´Â Ç÷¡±×,  Á¦2Àμö¿¡´Â ºÎ¸ð À©µµ¿ìÀÇ ÇÚµéÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀνºÅϽº¸¦ ÀÛ¼ºÇÑ ÈÄ ´Â ´ÙÀ̾ó·Î±×¸¦ ÃʱâÈ­ ÇÕ´Ï´Ù.

Àμâ ÇÁ·ÓÆÛƼ ½ÃÆ®¸¦ Ç¥½ÃÇϱâ À§Çؼ­´Â DoModal()À» »ç¿ëÇÕ´Ï´Ù. ÀÌ ÇÔ¼ö°¡ ¼º°øÇßÀ» °æ¿ì´Â ¹Ýȯ °ªÀ¸·Î¼­ S_OK°¡ µ¹¾Æ°¡  Àμâ ÇÁ·ÓÆÛƼ ½ÃÆ®·Î ´©¸¥ ¹öư¿¡ ÀÇÇØ PRINTDLGEX ÇüÅÂÀÇ ¸â¹ö º¯¼ö m_pdexÀÇ dwResultAction ¸â¹ö¿¡ ´ÙÀ½ÀÇ °ªÀÌ ¼³Á¤µË´Ï´Ù.

¹öư¸í

dlg.m_pdex.dwResultActionÀÇ °ª

[Àμâ]

PD_RESULT_PRINT

[ĵ½½]

PD_RESULT_CANCEL

[Àû¿ë]À» ´©¸£°í ³ª¼­[ĵ½½]

PD_RESULT_APPLY


À̹ø ¿¹ ¿¡¼­´Â [Àμâ] ¹öưÀ» ´­·¯ Àμâ ÇÁ·ÓÆÛƼ ½ÃÆ®¸¦ ´Ý¾ÒÀ» °æ¿ì´Â  ÇÁ¸°ÅÍÀÇ ¼³Á¤À» º¸Á¸ÇÏ°í ³ª¼­ »õ·Î¿î ÇÁ¸°ÅÍ ÇÚµéÀ» ¿ÀÇÂÇÏ¿© ÇÑÃþ ´õ ÇÁ¸°ÅÍ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇØ Àμ⸦ °³½ÃÇÕ´Ï´Ù.  [Àû¿ë] ¹öưÀ» ´©¸£°í ³ª¼­ [ĵ½½] ¹öưÀ» ´­·¯ Àμâ ÇÁ·ÓÆÛƼ ½ÃÆ®¸¦ ´Ý¾ÒÀ» °æ¿ì´Â  ´ÜÁö ÇÁ¸°ÅÍÀÇ ¼³Á¤À» º¸Á¸ÇØ »õ·Î¿î ÇÁ¸°ÅÍ ÇÚµéÀ» ¿ÀÇ Çϰí ÀÖ½À´Ï´Ù.