< ÆäÀÌÁö ¼³Á¤ ´ÙÀ̾ó·Î±× >

CPrintDialog Ŭ·¡½ºÀÇ constructorÀÇ Á¦ 1Àμö¿¡ TRUE¸¦ ÁöÁ¤Çϸé [ÇÁ¸°ÅÍÀÇ ¼³Á¤] ´ÙÀ̾ó·Î±×¸¦ Ç¥½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸ MSDN¿¡ ÀÇÇϸé [ÆäÀÌÁö ¼³Á¤] ´ÙÀ̾ó·Î±×ÀÇ »ç¿ëÀ» ÃßõÇÒ ¼ö ÀÖ°í ÀÖ½À´Ï´Ù.  WTLÀº ÆäÀÌÁö ¼³Á¤ ´ÙÀ̾ó·Î±×¸¦  CPageSetupDialogImpl À̶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼­ ĸ½¶È­Çϰí ÀÖ½À´Ï´Ù. ÀÌ Å¬·¡½º´Â ATLÀÇCDialogImpl Ŭ·¡½º¿Í °°ÀÌ base class·Î¼­ º¸°í »ç¿ëÇÕ´Ï´Ù.  atldlgs.h Çì´õ¿¡¼­´Â CPageSetupDialogImpl Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º·Î¼­ CPageSetupDialog Ŭ·¡½º°¡ Á¤Àǵǰí ÀÖ½À´Ï´Ù.

// atldlgs.h

class CPageSetupDialog : public CPageSetupDialogImpl<CPageSetupDialog>

{

    ...

    ...

                      


¡¡WTL
ÀÇ CPageSetupDialog Ŭ·¡½º´Â MFCÀÇ µ¿¸íÀÇ Å¬·¡½º¿Í °ÅÀÇ °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº ÀÌÀü ÀÛ¼ºÇÑ Àμ⠴ÙÀ̾ó·Î±×¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥¿¡  ÆäÀÌÁö ¼³Á¤ ´ÙÀ̾ó·Î±×¸¦ ¿©´Â ±â´ÉÀ» Ãß°¡ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

// 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>  // CPrintDialog,CPageSetupDialogŬ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ(¶§¹®¿¡)

#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_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()

 

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

 

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

}

                      


¡¡
¿ì¼±  µµ±¸¸ðÀ½ ÀÚ¿øÀÇ [ÆÄÀÏ] ÀÌÇÏ¿¡ [ÆäÀÌÁö ¼³Á¤] ¸Þ´º ¾ÆÀÌÅÛÀ» Ãß°¡ÇØ ID·Î ID_FILE_PRINT_SETUP¸¦ ¼³Á¤ÇÕ´Ï´Ù.

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

ÆäÀÌÁö ¼³Á¤ ´ÙÀ̾ó·Î±×¸¦ Ç¥½ÃÇϱâ À§Çؼ­´Â DoModal()À» »ç¿ëÇÕ´Ï´Ù. [OK] ¹öưÀ» ´­·¯ ÆäÀÌÁö ¼³Á¤ ´ÙÀ̾ó·Î±×¸¦ ´Ý¾ÒÀ» °æ¿ì´Â ¹Ýȯ °ªÀ¸·Î¼­ IDOK°¡ [ĵ½½]À» ´­·¯ ´Ý¾ÒÀ» °æ¿ì´Â IDCANCELÀÌ µÇµ¹¾Æ ¿É´Ï´Ù.

IDOK°¡ µÇµ¹¾Æ ¿ÔÀ» °æ¿ì´Â GetPaperSize()À» È£ÃâÇØ ¿ëÁö »çÀÌÁ ÃëµæÇϰųª GetMargins()¸¦ È£ÃâÇØ ¸¶ÁøÀÇ ¼³Á¤À» ÃëµæÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. À̹ø ¿¹ ¿¡¼­´Â ´ÜÁö ÇÁ¸°ÅÍÀÇ ¼³Á¤À» º¸Á¸ÇØ »õ·Î¿î ÇÁ¸°ÅÍ ÇÚµéÀ» ¿ÀÇ Çϰí ÀÖ½À´Ï´Ù.