Áö±Ý±îÁöÀÇ ¡¸Hello, ATL/WTL¡¹ÇÁ·Î±×·¥¿¡¼­´Â  WM_PAINT¸Þ¼¼Áö Çڵ鷯ÀÇ Ã³¸®¸¦SDK½ºÅ¸ÀÏ·Î ½á ¿Ô½À´Ï´Ù.

// WM_PAINT¸Þ¼¼Áö Çڵ鷯

void OnPaint(HDC /*hDC*/){

    PAINTSTRUCT ps;

    HDC hDC = BeginPaint(&ps);

    RECT rect;

    GetClientRect(&rect);

    DrawText(hDC, _T("Hello, ATL/WTL"),

        -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    EndPaint(&ps);

}

                      


¡¡WTLÀº GDIÀ» ¼­Æ÷Æ® Çϴ Ŭ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. ´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº  ÀüȸÀÇ ¾ÆÀ̵é Çڵ鷯¸¦ Ãß°¡ÇÑ ¡¸Hello, ATL/WTL¡¹ÇÁ·Î±×·¥ÀÇ WM_PAINT¸Þ¼¼Áö Çڵ鷯¸¦ WTLÀÇGDI¼­Æ÷Æ® Ŭ·¡½º¸¦ »ç¿ëÇØ °íÃÄ ¾´ ¿¹ÀÔ´Ï´Ù.

// stdafx.h¾È

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

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

                      

 

// MainWindow.hµ¿¾È

class CMyWindow : public CWindowImpl<CMyWindow>,

    public CMessageFilter, public CIdleHandler

{

public:

    // À©µµ¿ì Ŭ·¡½º¸íÀ» µî·Ï

    DECLARE_WND_CLASS(_T("Hello"));

 

private:

    // ¸Þ¼¼Áö ÇÊÅÍ Ã³¸®

    virtual BOOL PreTranslateMessage(MSG* pMsg){

        return FALSE;

    }

 

    // ¾ÆÀ̵é ó¸®

    virtual BOOL OnIdle(){

        return FALSE;

    }

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMyWindow)

        MSG_WM_PAINT(OnPaint)

        MSG_WM_CREATE(OnCreate)

        MSG_WM_DESTROY(OnDestroy)

    END_MSG_MAP()

 

    void OnPaint(HDC /*hDC*/){

        CPaintDC dc(m_hWnd);

        CRect rect;

        GetClientRect(rect);

        dc.DrawText(_T("Hello, ATL/WTL"), -1,

            rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    }

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

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

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

        return 0;

    }

 

    void OnDestroy(){

        PostQuitMessage(0);

    }

};

                      

 

// hello.cpp³»

#include "stdafx.h"

 

#include "MainWindow.h"

 

CAppModule _Module;

 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)

{

    _Module.Init(NULL, hInstance);

 

    CMessageLoop theLoop;

    _Module.AddMessageLoop(&theLoop);

 

    // µ¶ÀÚ À©µµ¿ì¸¦ ÀÛ¼º

    CMyWindow wnd;

    wnd.Create(NULL, CWindow::rcDefault,

        _T("Hello, ATL/WTL"), WS_OVERLAPPEDWINDOW | WS_VISIBLE);

 

    int nRet = theLoop.Run();

 

    _Module.RemoveMessageLoop();

 

    _Module.Term();

 

    return nRet;

}

                      


¡¡GDI¼­Æ÷Æ® Ŭ·¡½º´Âatlgdi.hÇì´õ¿¡ Á¤Àǵǰí ÀÖ½À´Ï´Ù¸¸  ÀÌ Çì´õ´Âatlapp.hÇì´õ¸¦ ÀÎŬ·çµå ÇÑ ½ÃÁ¡¿¡¼­ ÀÚµ¿ÀûÀ¸·Î ÀÎŬ·çµå µÇ°í ÀÖ½À´Ï´Ù.

¡¡À̹øÀºRECT±¸Á¶Ã¼¸¦ º£À̽º·Î ÇÑ´Ù.  CRect¶ó°í Çϴ Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ stdafx.h¾È¿¡¼­ atlmisc.h¶ó°í ÇÏ´Â Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù. ÀÌatlmisc.h¿¡´ÂCRectŬ·¡½ºÀÇ ¿Ü  SIZE±¸Á¶Ã¼¸¦ º£À̽º·Î ÇÏ´ÂCSize POINT±¸Á¶Ã¼¸¦ º£À̽º·Î ÇÏ´ÂCPoint ij¸¯ÅÍ ¶óÀÎÀ» ¼­Æ÷Æ®ÇÏ´ÂCStringµîÀÌ Á¤Àǵǰí ÀÖ½À´Ï´Ù. atlmisc.h±×¸®°í Á¤Àǵǰí ÀÖ´Â ÀÌ·¯ÇÑ Å¬·¡½º´ÂMFCÀÇ µ¿¸íÀÇ Å¬·¡½º¿Í °ÅÀÇ °°Àº ±â´ÉÀ» °®Ãß°í ÀÖ½À´Ï´Ù.

¡¡´ÙÀ½¿¡ ,WM_PAINT¸Þ¼¼Áö Çڵ鷯¸¦ °íÃÄ ¾¹´Ï´Ù. ¿ì¼± ,CPaintDCŬ·¡½ºÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇÕ´Ï´Ù. ÀÌ Å¬·¡½º´Â constructor À¸·Î::BeginPaint()¸¦ È£ÃâÇØ µð¹ÙÀ̽º ÄÜÅØ½ºÆ®¸¦ ÃëµæÇØ  ¼Ò¸êÀÚ·Î::EndPaint()¸¦ È£ÃâÇÕ´Ï´Ù.  WM_PAINT¸Þ¼¼Áö Çڵ鷯¿¡¼­´Â ±× ÈÄ Å¬¶óÀÌ¾ðÆ® ¿µ¿ªÀÇ ±¸ÇüÀ» ÃëµæÇØ  Áß¾Ó¿¡ ¡¸Hello, ATL/WTL¡¹À̶ó°í Çϴ ij¸¯ÅÍ ¶óÀÎÀ» Ç¥½ÃÇϰí ÀÖ½À´Ï´Ù.

¡¡À̹øÀº µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇϱâ À§Çؼ­CPaintDCŬ·¡½º¸¦ »ç¿ëÇß½À´Ï´Ù¸¸  WTLÀºCPaintDCŬ·¡½º¸¦ Æ÷ÇÔÇØ ´ÙÀ½°ú °°Àº µð¹ÙÀ̽º ÄÁÅØ½ºÆ® Ãëµæ Ŭ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.



CPaintDC

¡¡WM_PAINT¸Þ¼¼Áö Çڵ鷯 Àü¿ëÀÇ µð¹ÙÀ̽º ÄÜÅØ½ºÆ® Ãëµæ Ŭ·¡½ºÀÔ´Ï´Ù. Àü¼ú´ë·Î  constructor¡¡ ¡¡ À¸·Î ::BeginPaint()¸¦ È£ÃâÇØ µð¹ÙÀ̽º ÄÜÅØ½ºÆ®¸¦ ÃëµæÇØ  ¼Ò¸êÀÚ·Î ::EndPaint()¸¦ È£ÃâÇÕ´Ï´Ù.



CClientDC

¡¡WM_PAINT¸Þ¼¼Áö Çڵ鷯 ÀÌ¿ÜÀÇ Àå¼Ò¿¡¼­  À©µµ¿ìÀÇ Å¬¶óÀÌ¾ðÆ® ¿µ¿ª¿¡ ¹¦È­Çϱâ À§ÇÑ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇϴ Ŭ·¡½ºÀÔ´Ï´Ù. constructor  À¸·Î ::GetDC()¸¦ È£ÃâÇØ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇØ  ¼Ò¸êÀÚ·Î ::ReleaseDC()¸¦ È£ÃâÇØ µð¹ÙÀ̽º ÄÜÅØ½ºÆ®¸¦ ÇØ¹æÇÕ´Ï´Ù.



CWindowDC

¡¡À©µµ¿ìÀÇ Å¬¶óÀÌ¾ðÆ® ¿µ¿ª »Ó¸¸ÀÌ ¾Æ´Ï¶ó  ºñŬ¶óÀÌ¾ðÆ® ¿µ¿ª¿¡µµ ¹¦È­Çϱâ À§ÇÑ µð¹ÙÀ̽º ÄÜÅØ½ºÆ®¸¦ ÃëµæÇϴ Ŭ·¡½ºÀÔ´Ï´Ù. constructor À¸·Î  ::GetWindowDC()¸¦ È£ÃâÇØ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÃëµæÇØ  ¼Ò¸êÀÚ·Î ::ReleaseDC()¸¦ È£ÃâÇØ µð¹ÙÀ̽º ÄÁÅØ½ºÆ®¸¦ ÇØ¹æÇÕ´Ï´Ù.



CEnhMetaFileDC

¡¡È®Àå ¸ÞŸÆÄÀÏ µð¹ÙÀ̽º ÄÜÅØ½ºÆ®¸¦ ÀÛ¼ºÇÕ´Ï´Ù.

ÀÌ·¯ÇÑ Å¬·¡½º´Â ¸ðµÎCDC¶ó°í Çϴ Ŭ·¡½º·ÎºÎÅÍ ÆÄ»ýÇϰí ÀÖ½À´Ï´Ù.  CDCŬ·¡½º´Â MFCÀÇ µ¿¸íÀÇ Å¬·¡½º¿Í °°ÀÌ  µð¹ÙÀ̽º ÄÜÅØ½ºÆ® ÇÚµé°ú °Å±â¿¡ °üÇÑWin32APIÀ» ĸ½¶È­ÇÕ´Ï´Ù. WTLÀÇCDCŬ·¡½º´Â °Ô´Ù°¡DIB³ªOpenGLµµ ¼­Æ÷Æ®ÇÕ´Ï´Ù.