< ÇÁ¸°Æ® µð¹ÙÀ̽º ÄÁÅØ½ºÆ® >
WTLÀº ÇÁ¸°ÅÍ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ CPrinterDC Ŭ·¡½º¿¡¼ ĸ½¶ÈÇϰí ÀÖ½À´Ï´Ù. ÀÌ Å¬·¡½º´Â ´Ù¸¥ µð¹ÙÀ̽º ÄÁÅØ½ºÆ® Ŭ·¡½º¿Í °°°Ô CDC Ŭ·¡½º·ÎºÎÅÍ ÆÄ»ýÇϰí ÀÖ½À´Ï´Ù.
¡¡ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CPrinterDC Ŭ·¡½º¸¦ »ç¿ëÇØ µðÆúÆ® ÇÁ¸°ÅÍÀÇ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇÏ¿© ¿ëÁöÀÇ Áß¾Ó¿¡ ¡¸Hello, ATL/WTL¡¹ À̶ó°í Çϴ ij¸¯ÅÍ ¶óÀÎÀ» ÀμâÇÏ´Â ¿¹ ÀÔ´Ï´Ù. ¸Þ´º·ÎºÎÅÍ [Àμâ]¸¦ ½ÇÇàÇϸé Àμ⸦ °³½ÃÇÕ´Ï´Ù.

|
// stdafx.h #include <atlbase.h> #include <atlapp.h> extern CAppModule _Module; #include <atlwin.h> #include <atlcrack.h> #include <atlmisc.h> #include <atlframe.h> #include <atlprint.h> // CPrinterDCŬ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ(¶§¹®¿¡) |
|
// mainfrm.h class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler { public: DECLARE_FRAME_WND_CLASS_EX(_T("WTL:PrintSample"), IDR_MAINFRAME,
CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, COLOR_WINDOW) 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){ CPrinterDC dc;
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();
} } } 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¸¦ ¼³Á¤ÇÕ´Ï´Ù.
¡¡´ÙÀ½À¸·Î stdafx.h ¿¡¼´Â CPrinterDC Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ atlprint.h Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.
¡¡CMainFrame Ŭ·¡½º¿¡¼´Â ÀϹÝÀûÀÎ ÇÁ·¹ÀÓ À©µµ¿ì¸¦ ÀÛ¼ºÇÏ¿© WM_PAINT ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇØ Å¬¶óÀÌ¾ðÆ® ¿µ¿ªÀÇ Áß¾Ó¿¡ ij¸¯ÅÍ ¶óÀÎÀ» ¹¦È ÇÕ´Ï´Ù. ÀÌ ¶§ ¹¦È Äڵ带 Draw() ¶ó°í ÇÏ´Â µ¶ÀÚÀûÀÎ ÇÔ¼ö·Î Á¤¸®ÇÕ´Ï´Ù. Draw()´Â Àμâ ÄÚµå¿Í °ø¿ëÇÕ´Ï´Ù.
¡¡¸Þ´º ¾ÆÀÌÅÛ [Àμâ](ID£ºID_FILE_PRINT) ¿ëÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ Çڵ鷯¿¡¼´Â CPrinterDC Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇØ µðÆúÆ® ÇÁ¸°ÅÍÀÇ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇÏ¿© Draw()¸¦ È£ÃâÇØ ¿ëÁöÀÇ Áß¾Ó¿¡ ij¸¯ÅÍ ¶óÀÎÀ» ÀμâÇÕ´Ï´Ù.
¡¡ÀÌ¿Í °°ÀÌ CPrinterDC Ŭ·¡½ºÀÇ µðÆúÆ®
constructorÀ» È£ÃâÇÏ¸é µðÆúÆ® ÇÁ¸°ÅÍÀÇ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÑÆí CPrinterDC Ŭ·¡½º´Â ÁöÁ¤ÇÑ ÇÁ¸°ÅÍÀÇ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇϱâ À§Çؼ Àμö ÀÖ¾î constructorÀ» ÁغñÇØ ÀÖ½À´Ï´Ù.
|
// atlprint.h // CPrinterDCÀÇ Àμö
ÀÖ¾î constructor¡¡ ¡¡ CPrinterDC(HANDLE hPrinter,
const DEVMODE* pdm = NULL) { CPrinterHandle
p; p.Attach(hPrinter); Attach(p.CreatePrinterDC(pdm)); ATLASSERT(m_hDC != NULL); } |
ÀÌ constructorÀº ÇÁ¸°ÅÍÀÇ ÇÚµéÀ» ÇÊ¿ä·Î ÇÕ´Ï´Ù. WTLÀº ÇÁ¸°ÅÍÀÇ ÇÚµéÀ» CPrinterT ¶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼ ĸ½¶ÈÇϰí ÀÖ½À´Ï´Ù. ÅÛÇø´ Àμö´Â bool °ªÀ¸·Î trueÀÇ °æ¿ì´Â ¼Ò¸êÀÚ·Î ClosePrinter()¸¦ È£ÃâÇØ falseÀÇ °æ¿ì´Â È£ÃâÇÏÁö ¾Ê½À´Ï´Ù. atlprint.hÇì´õ¿¡¼´Âtypedef¿¡ ÀÇÇØ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù.
|
// atlprint.h typedef CPrinterT<false> CPrinterHandle; typedef CPrinterT<true> CPrinter; |
¡¡ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CPrinter Ŭ·¡½º¸¦ »ç¿ëÇØ ÇÁ¸°ÅÍÀÇ ÇÚµéÀ» ÃëµæÇÏ¿© ±× ÇÁ¸°ÅÍÀÇ ÇÚµé·ÎºÎÅÍ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇØ ÀμâÇÏ´Â ¿¹ÀÔ´Ï´Ù. À̹ø¿¡ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥ OnFilePrint()¸¦ ´ÙÀ½°ú °°ÀÌ °íÃÄ ¾¹´Ï´Ù.
|
// ÁöÁ¤ÇÑ À̸§ÀÇ ÇÁ¸°ÅÍ ÇÚµéÀ» Ãëµæ CPrinter printer; if(!printer.OpenPrinter(_T("EPSON MJ-800C
ESC/P R"))){ MessageBox(_T("ÇÁ¸°ÅÍ
ÇÚµéÀÇ Ãëµæ¿¡ ½ÇÆÐÇß½À´Ï´Ù. ")); return; } // ÁöÁ¤ÇÑ ÇÁ¸°ÅÍÀÇ ÇÁ¸°ÅÍ µð¹ÙÀ̽º ÄÜÅØ½ºÆ®¸¦
Ãëµæ CPrinterDC dc(printer); 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(); } } |
¡¡ÀÌ¿Í °°ÀÌ CPrinterDC Ŭ·¡½º³ª CPrinter Ŭ·¡½º¸¦ »ç¿ëÇÏ¸é µð¹ÙÀ̽º ÄÁÅØ½ºÆ®³ª ÇÁ¸°ÅÍÀÇ ÇÚµéÀ» ¸í½ÃÀûÀ¸·Î »èÁ¦Çϰųª ´Ý°Å³ª ÇÒ Çʿ䰡 ¾ø¾îÁö¹Ç·Î Æí¸®ÇÕ´Ï´Ù.