< Àμ⠴ÙÀ̾ó·Î±× >
Àüȸ´Â ÁöÁ¤ÇÑ ÇÁ¸°ÅÍÀÇ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇϱâ À§Çؼ Á÷Á¢ ÇÁ¸°Å͸íÀ» ÁöÁ¤Çß½À´Ï´Ù¸¸ , Àμ⠴ÙÀ̾ó·Î±×¸¦ »ç¿ëÇϸé À¯Àú°¡ ¼±ÅÃÇÑ ÇÁ¸°ÅÍÀÇ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. WTLÀº common dialogÀÇ Àμ⠴ÙÀ̾ó·Î±×¸¦ CPrintDialogImpl À̶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼ ĸ½¶ÈÇϰí ÀÖ½À´Ï´Ù. ÀÌ Å¬·¡½º´Â ATLÀÇ CDialogImpl Ŭ·¡½º¿Í °°ÀÌ base class·Î¼ º¸°í »ç¿ëÇÕ´Ï´Ù. atldlgs.h Çì´õ¿¡¼´Â CPrintDialogImpl Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º·Î¼ CPrintDialog Ŭ·¡½º°¡ Á¤Àǵǰí ÀÖ½À´Ï´Ù.
|
// atldlgs.h class CPrintDialog : public CPrintDialogImpl<CPrintDialog> { ... ... |
¡¡WTLÀÇ CPrintDialog Ŭ·¡½º´Â MFCÀÇ µ¿¸íÀÇ Å¬·¡½º¿Í °ÅÀÇ °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº Àüȸ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥À» °íÃÄ ½á CPrintDialog Ŭ·¡½º·ÎºÎÅÍ ÇÁ¸°ÅÍ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇÏ´Â ¿¹ÀÔ´Ï´Ù.

|
// 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Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ(¶§¹®¿¡) #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){ 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 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 ¿¡¼´Â CPrintDialog Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ atldlgs.h Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.
¡¡´ÙÀ½¿¡ CPrinter Ŭ·¡½º¿Í CDevMode Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ CMainFrame Ŭ·¡½ºÀÇ ¸â¹ö º¯¼ö·Î¼ ¼±¾ðÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¸â¹ö º¯¼ö´Â °¢°¢ ÇöÀçÀÇ ÇÁ¸°ÅÍ ÇÚµé°ú ÇÁ¸°ÅÍÀÇ ¼³Á¤À» º¸°ü À¯ÁöÇØ CMainFrame Ŭ·¡½ºÀÇ constructorÀ¸·Î ÃʱâÈ ÇÕ´Ï´Ù.
¡¡´ÙÀ½¿¡ ¸Þ´º ¾ÆÀÌÅÛ [Àμâ](ID£ºID_FILE_PRINT)¿ëÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ º¯°æÇÕ´Ï´Ù. ÀÌ Çڵ鷯¿¡¼´Â ¿ì¼± CPrintDialog Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇÕ´Ï´Ù. CPrintDialog Ŭ·¡½ºÀÇ constructorÀμö´Â ¸ðµÎ »ý·« ÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸ , Á¦ 1Àμö¿¡ TRUE¸¦ ÁöÁ¤Çϸé [Àμâ] ´ÙÀ̾ó·Î±×´Â ¾Æ´Ï°í [ÇÁ¸°ÅÍÀÇ ¼³Á¤] ´ÙÀ̾ó·Î±×¸¦ Ç¥½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù. Á¦ 2Àμö´Â Ç÷¡±×,
Á¦ 3Àμö´Â ºÎ¸ð À©µµ¿ìÀÇ ÇÚµéÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
CPrintDialog Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇÑ ÈÄ Àμ⠴ÙÀ̾ó·Î±×¸¦ ÃʱâÈÇϱâ À§Çؼ ´ÙÀ̾ó·Î±×ÀÇ m_pd.hDevMode °ú m_pd.hDevNames¿¡ ÇöÀçÀÇ ¼³Á¤ÀÇ Ä«ÇǸ¦ ´ëÀÔÇÕ´Ï´Ù. ÀÌ ¶§ CopyToHDEVMODE() ¶ó°í CopyToHDEVNAMES()´Â ³»ºÎ¿¡¼ GlobalAlloc()¸¦ È£ÃâÇϰí Àֱ⠶§¹®¿¡ ºÒÇÊ¿äÇÏ°Ô µÇ¾úÀ» ¶§¿¡ GlobalFree¸¦ È£ÃâÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
Àμ⠴ÙÀ̾ó·Î±×¸¦ Ç¥½ÃÇϱâ À§Çؼ´Â DoModal()À» È£ÃâÇÕ´Ï´Ù. [OK] ¹öưÀ» ´·¯ Àμ⠴ÙÀ̾ó·Î±×¸¦ ´Ý¾ÒÀ» °æ¿ì´Â ¹Ýȯ °ªÀ¸·Î¼ IDOK°¡ [ĵ½½]À» ´·¯ ´Ý¾ÒÀ» °æ¿ì´ÂIDCANCEL ÀÌ ¹Ýȯ´Ï´Ù.
IDOK °¡ ¹ÝȯµÇ¾î ¿ÔÀ» °æ¿ì´Â ¿ì¼± CopyFromHDEVMODE()À» È£ÃâÇØ m_devmodeCur ÇöÀçÀÇ ÇÁ¸°ÅÍÀÇ ¼³Á¤À» Ä«ÇÇÇÕ´Ï´Ù. ´ÙÀ½¿¡ ÇöÀçÀÇ ÇÁ¸°Å͸¦ Ŭ·Î¿ìÁî ÇÏ¿© Àμ⠴ÙÀ̾ó·Î±×·Î ¼±ÅÃµÈ ÇÁ¸°Å͸¦ ¿ÀÇÂÇÕ´Ï´Ù. ÇÁ¸°ÅÍ ÇÚµéÀ» ÃëµæÇÒ ¼ö ÀÖÀ¸¸é ÇÁ¸°ÅÍ µð¹ÙÀ̽º ÄÜÅØ½ºÆ®¸¦ ÀÛ¼ºÇÏ¿© Àμ⸦ °³½ÃÇÕ´Ï´Ù.
¸¶Áö¸·À¸·Î ´ÙÀ̾ó·Î±×ÀÇ m_pd.hDevMode °ú m_pd.hDevNames¿¡ ´ëÇØ¼ GlobalFree¸¦ È£ÃâÇÕ´Ï´Ù.
¡¡ÀÌ¿Í °°ÀÌ ÀÌ ÇÁ·Î±×·¥Àº Àμ⠴ÙÀ̾ó·Î±×¸¦ ´ÝÀ» ¶§¸¶´Ù ÇÁ¸°ÅÍ ÇÚµé°ú ÇÁ¸°ÅÍÀÇ ¼³Á¤À» CMainFrame Ŭ·¡½ºÀÇ ¸â¹ö º¯¼ö¿¡ º¸Á¸ÇÏ¿© ÀçÂ÷ Àμ⠴ÙÀ̾ó·Î±×¸¦ ¿ ¶§¿¡ Àüȸ º¸Á¸ÇÑ ³»¿ëÀ¸·Î Àμ⠴ÙÀ̾ó·Î±×¸¦ ÃʱâÈÇÏ´Â °ÍÀ¸·Î ÇÁ¸°ÅÍ ÇÚµé°ú ÇÁ¸°ÅÍÀÇ ¼³Á¤À» »ç¿ëÇØ µ¹¸³´Ï´Ù.