< ½ºÅ©·Ñ >

 

ÇÁ·¹ÀÓ À©µµ¿ìÀÇ ºä·Î½á ½ºÅ©·Ñ À©µµ¿ì¸¦ ÀÛ¼ºÇÕ´Ï´Ù.  WTLÀº ½ºÅ©·Ñ À©µµ¿ì¸¦ ÀÛ¼ºÇϱâ À§Çؼ­ CScrollWindowImpl¶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. ÀÌ Å¬·¡½º´ÂATLÀÇ CWindowImpl Ŭ·¡½º¿Í °°ÀÌ  base class·Î¼­ÀÇ º¸°í »ç¿ëÇÏ¿© ÅÛÇø´ ÀμöÀÇ Á¾·ùµµ CWindowImplŬ·¡½º¿Í °°½À´Ï´Ù.

¡¡
ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CScrollWindowImpl Ŭ·¡½º¸¦ ÇÁ·¹ÀÓ À©µµ¿ìÀÇ ºä·Î½á »ç¿ëÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlframe.h>

#include <atlscrl.h>    // ½ºÅ©·Ñ À©µµ¿ì Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ(¶§¹®¿¡)

                      

 

// view.h

class CScrollView : public CScrollWindowImpl<CScrollView>

{

public:

    BOOL PreTranslateMessage(MSG* pMsg){

        return FALSE;

    }

 

private:

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CScrollView)

        MSG_WM_CREATE(OnCreate)

        CHAIN_MSG_MAP(CScrollWindowImpl<CScrollView>)

        CHAIN_MSG_MAP_ALT(CScrollWindowImpl<CScrollView>, 1)

    END_MSG_MAP()

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

        LRESULT lRet = DefWindowProc();

 

        SetScrollSize(640, 480);

        SetScrollLine(10, 10);

        SetScrollPage(100, 100);

 

        SetMsgHandled(false);

 

        return lRet;

    }

 

    void DoPaint(CDCHandle dc){

        // ½ºÅ©·Ñ À©µµ¿ìÀÇ Áß¾Ó¿¡ ij¸¯ÅÍ ¶óÀÎÀ» ¹¦È­

        CSize size;

        GetScrollSize(size);

        CRect rect(0, 0, size.cx, size.cy);

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

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

    }

};

                      

 

// mainfrm.h

class CMainFrame : public CFrameWindowImpl<CMainFrame>,

    public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler

{

public:

    DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)

 

    CScrollView m_view;

 

    virtual BOOL PreTranslateMessage(MSG* pMsg){

        if(CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg))

            return TRUE;

 

        return m_view.PreTranslateMessage(pMsg);

    }

 

    virtual BOOL OnIdle(){

        UIUpdateStatusBar();

        return FALSE;

    }

 

    BEGIN_UPDATE_UI_MAP(CMainFrame)

        // ¿£Æ®¸® ¾øÀ½

    END_UPDATE_UI_MAP()

 

    BEGIN_MSG_MAP_EX(CMainFrame)

        MSG_WM_CREATE(OnCreate)

        COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnMenuExit)

        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)

        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)

        CHAIN_CLIENT_COMMANDS()    // ºäÅ©¶ó½º¿¡ Ä¿¸àµå üÀÎ

    END_MSG_MAP()

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

        // »óÅ ¹Ù¸¦ ÀÛ¼º

        CreateSimpleStatusBar();

        UIAddStatusBar(m_hWndStatusBar);

 

        // ºä¸¦ ÀÛ¼º

        m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL,

            WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,

            WS_EX_CLIENTEDGE);

 

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

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

 

        return 0;

    }

 

    void OnMenuExit(UINT uNotifyCode, int nID, HWND hWndCtl){

        PostMessage(WM_CLOSE);

    }

};

                      

 

// app.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "view.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 ¿¡¼­´Â CScrollWindowImpl Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ atlscrl.h Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡  ºä À©µµ¿ì¸¦ À§ÇÑ Å¬·¡½º¸¦ Á¤ÀÇÇÕ´Ï´Ù.  À§ÀÇ ¿¹¿¡¼­´Â ÇÁ·ÎÁ§Æ®¿¡ view.h¶ó°í ÇÏ´Â Çì´õ ÆÄÀÏÀ» Ãß°¡ÇÏ¿© °Å±â¿¡ CScrollWindowImplŬ·¡½º·ÎºÎÅÍ ÆÄ»ýÇß´Ù.  CScrollView ¶ó°í Çϴ Ŭ·¡½º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù.

¡¡
CScrollView Ŭ·¡½º ³»¿¡¼­´Â ¸Þ¼¼Áö ¸ÊÀ» ÁغñÇÏ¿©  WM_CREATE ¸Þ¼¼Áö ¿£Æ®¸®¿Í  base class¿¡ÀÇ Ã¼ÀÎÀ» Ãß°¡ÇÕ´Ï´Ù.  WM_CREATE ¸Þ¼¼Áö Çڵ鷯¿¡¼­´Â ½ºÅ©·Ñ À©µµ¿ìÀÇ »çÀÌÁ ½ºÅ©·Ñ ¹ÙÀÇ À̵¿·®À» ¼³Á¤ÇÏ¿© SetMsgHandled(false)¸¦ È£ÃâÇÕ´Ï´Ù.  À̰ÍÀº  base class¿¡¼­µµ WM_CREATE ¸Þ¼¼Áö Çڵ鷯°¡ ÁغñµÇ¾î Àֱ⠶§¹®ÀÔ´Ï´Ù.

¡¡
´ÙÀ½À¸·Î  base classÀÇ ¸â¹ö ÇÔ¼ö DoPaint()¸¦ ¿À¹ö¶óÀ̵å(override) ÇÕ´Ï´Ù. ÀÌ ÇÔ¼ö´Â CScrollWindowImpl Ŭ·¡½º¿¡¼­ ÁغñµÇ¾î ÀÖ´Â WM_PAINT¸Þ¼¼Áö Çڵ鷯·Î ºÎÅÍ ºÒ·ÁÁ® ¿©±â¿¡ ºäÀÇ ¹¦È­ Äڵ带 ±â¼úÇÏ´Â °ÍÀ¸·Î  ½ºÅ©·Ñ ¹Ù¿¡ ¸ÂÃß¾î ¹¦È­ ³»¿ëµµ ÀÚµ¿ÀûÀ¸·Î ½ºÅ©·Ñ µÇ°Ô µË´Ï´Ù. À§ÀÇ ¿¹¿¡¼­´Â ½ºÅ©·Ñ À©µµ¿ìÀÇ Áß¾Ó¿¡ ij¸¯ÅÍ ¶óÀÎÀ» ¹¦È­ Çϰí ÀÖ½À´Ï´Ù.

¡¡
ÀÌ¿Í °°ÀÌ CScrollWindowImpl Ŭ·¡½º¿¡´Â ¸Þ¼¼Áö ¸ÊÀÌ ÁغñµÇ¾î ÀÖ¾î WM_CREATE ¸Þ½ÃÁö³ª WM_PAINT¸Þ¼¼Áö ±× ¿Ü WM_VSCROLL, WM_HSCROLL, WM_MOUSEWHEEL,  WM_SIZE, WM_SETTINGCHANGE, WM_PRINTCLIENT ¸Þ¼¼Áö¸¦ ¸ÅÇÎ Çϰí Àֱ⠶§¹®¿¡ ÀûÀº ÀÛ¾÷À¸·Î ±âº»ÀûÀÎ ±â´ÉÀ» °¡Áø ½ºÅ©·Ñ À©µµ¿ì¸¦ ÀÛ¼ºÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

¡¡
±×·±µ¥  CScrollWindowImplŬ·¡½º´Â ´ëü ¸Þ¼¼Áö ¸Êµµ ÁغñÇØ ÀÖ½À´Ï´Ù. À̰ÍÀº  ºä¸¦ »óÇÏ Á¿쿡 ½ºÅ©·ÑÇϱâ À§ÇÑ Ä¿¸àµå ¸Þ¼¼Áö¸¦ ¸ÅÇÎ Çϰí ÀÖ½À´Ï´Ù.  WTLÀº ½ºÅ©·Ñ À©µµ¿ì¸¦ Á¶ÀÛÇϱâ À§Çؼ­ µðÆúÆ®·Î ´ÙÀ½°ú °°Àº ID¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.

ID

Á¶ÀÛ

ID_SCROLL_UP

»ó¿¡ ½ºÅ©·Ñ

ID_SCROLL_DOWN

ÇÏ¿¡ ½ºÅ©·Ñ

ID_SCROLL_PAGE_UP

ÀüÀÇ ÆäÀÌÁö

ID_SCROLL_PAGE_DOWN

´ÙÀ½ÀÇ ÆäÀÌÁö

ID_SCROLL_TOP

ÃÖ»óºÎ

ID_SCROLL_BOTTOM

ÃÖÇϺÎ

ID_SCROLL_LEFT

¿ÞÂÊÀ¸·Î ½ºÅ©·Ñ

ID_SCROLL_RIGHT

¿À¸¥ÂÊÀ¸·Î ½ºÅ©·Ñ

ID_SCROLL_PAGE_LEFT

¿ÞÂÊÀÇ ÆäÀÌÁö

ID_SCROLL_PAGE_RIGHT

¿À¸¥ÂÊÀÇ ÆäÀÌÁö

ID_SCROLL_ALL_LEFT

¿ÞÂÊÀÇ ´Ü

ID_SCROLL_ALL_RIGHT

¿ìÀÇ ±¸¼®


À̹ø ¿¹ ¿¡¼­´Â ¸Þ´º¿¡ID_SCROLL_UP, ID_SCROLL_DOWN,, D_SCROLL_LEFT, ID_SCROLL_RIGHTÀÇ 4°³ÀÇ ¾ÆÀÌÅÛÀ» Ãß°¡Çß½À´Ï´Ù.



À̰Ϳ¡ ÀÇÇØ ÀÌ·¯ÇÑ ¸Þ´º ¾ÆÀÌÅÛÀ» ¼±ÅÃÇϸé Ä¿¸àµå üÀο¡ ÀÇÇØ Ä¿¸àµå ¸Þ¼¼Áö°¡ ÇÁ·¹ÀÓ À©µµ¿ì·ÎºÎÅÍ ºä À©µµ¿ì¿¡ Àü¼Û µÇ¾î ÇÑÃþ ´õ ´ëü ¸Þ¼¼Áö ¸Ê¿¡ÀÇ Ã¼Àο¡ ÀÇÇØ CScrollWindowImplŬ·¡½ºÀÇ ´ëü ¸Þ¼¼Áö ¸Ê¿¡ Àü¼Û µË´Ï´Ù.  CScrollWindowImplŬ·¡½º¿¡¼­´Â °£Á¢ÀûÀ¸·ÎDoScroll()¶ó°í ÇÏ´Â ¸â¹ö ÇÔ¼ö°¡ ºÒ·ÁÁ® ±× ÇÔ¼ö ³»¿¡¼­ ID¸¶´Ù ½ºÅ©·Ñ 󸮸¦ ÇÕ´Ï´Ù.



¸ÅÇÎ ¹æ½Ä ½ºÅ©·Ñ À©µµ¿ì

¡¡WTLÀº  ¸ÅÇÎ ¹æ½Ä¿¡ ´ëÀÀÇÑ ½ºÅ©·Ñ À©µµ¿ì¿ëÀ¸·Î CMapScrollWindowImplŬ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. ÀÌ Å¬·¡½º´Â CScrollWindowImplŬ·¡½º¿¡ ¸ÅÇιæ½Ä¿ëÀÇ ±â´ÉÀÌ Ãß°¡µÈ °ÍÀ¸·Î  »ç¿ë¹ýµµ CScrollWindowImpl Ŭ·¡½º¿Í °ÅÀÇ °°½À´Ï´Ù.

¡¡
ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CMapScrollWindowImpl Ŭ·¡½º·ÎºÎÅÍ ÆÄ»ýÇÑ CMapScrollView Ŭ·¡½º¸¦ ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù.

// view.h

class CMapScrollView : public CMapScrollWindowImpl<CMapScrollView>

{

public:

    BOOL PreTranslateMessage(MSG* pMsg){

        return FALSE;

    }

 

private:

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMapScrollView)

        MSG_WM_CREATE(OnCreate)

        CHAIN_MSG_MAP(CMapScrollWindowImpl<CMapScrollView>)

        CHAIN_MSG_MAP_ALT(CMapScrollWindowImpl<CMapScrollView>, 1)

    END_MSG_MAP()

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

        LRESULT lRet = DefWindowProc();

 

        SetScrollMapMode(MM_LOMETRIC);    // ¸ÅÇιæ½ÄÀ» ¼³Á¤

        SetScrollSize(640, 480);

        SetScrollLine(10, 10);

        SetScrollPage(100, 100);

 

        SetMsgHandled(false);

 

        return lRet;

    }

 

    void DoPaint(CDCHandle dc){

        // ½ºÅ©·Ñ À©µµ¿ìÀÇ Áß¾Ó¿¡ ij¸¯ÅÍ ¶óÀÎÀ» ¹¦È­

        CRect rect;

        GetScrollSize(rect);

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

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

    }

};

                      


CMapScrollWindowImpl Ŭ·¡½ºÀÇ µðÆúÆ®ÀÇ ¸ÅÇιæ½ÄÀº MM_TEXTÀÔ´Ï´Ù. CMapScrollView Ŭ·¡½º¿¡¼­´Â ¸ÅÇιæ½ÄÀ» MM_LOMETRIC·Î ¼³Á¤ÇØ Àֱ⠶§¹®¿¡ ½ºÅ©·Ñ À©µµ¿ìÀÇ ³í¸® ´ÜÀ§´Â 0.1mm¿¡  ¸Ê µË´Ï´Ù



Ç÷§ ½ºÅ©·Ñ À©µµ¿ì

¡¡WTLÀº °ø¿ë ÄÁÆ®·ÑÀÇ Ç÷§ ½ºÅ©·Ñ ¹Ù¿¡ ´ëÀÀÇÑ ½ºÅ©·Ñ À©µµ¿ì¿ëÀ¸·Î  CFSBWindowT¶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.  ÅÛÇø´ Àμö¿¡´Â Ŭ·¡½º¸¦ ÁöÁ¤ÇÕ´Ï´Ù¸¸  ±× Ŭ·¡½º´Â CFSBWindowT Ŭ·¡½ºÀÇ  base classÀÎ  CFlatScrollBarImpl Ŭ·¡½ºÀÇ ÅÛÇø´ Àμö·Î¼­ »ç¿ëµË´Ï´Ù.  atlscrl.h Çì´õ¿¡¼­´Â typedef¿¡ ÀÇÇØ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù.

// atlscrl.h

template <class TBase = ATL::CWindow>

class CFSBWindowT : public TBase, public CFlatScrollBarImpl<CFSBWindowT< TBase > >

{

    ...

};

 

typedef CFSBWindowT<ATL::CWindow>   CFSBWindow;

                      


¡¡
ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CScrollWindowImplŬ·¡½º·ÎºÎÅÍ ÆÄ»ýÇÑ CFlatScrollView Ŭ·¡½º¸¦ ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù.  CFSBWindow Ŭ·¡½º´Â CScrollWindowImpl Ŭ·¡½ºÀÇ Á¦2ÅÛÇø´ Àμö·Î ÁöÁ¤ÇÕ´Ï´Ù.

 

// view.h

class CFlatScrollView : public CScrollWindowImpl<CFlatScrollView, CFSBWindow>

{

public:

    BOOL PreTranslateMessage(MSG* pMsg){

        return FALSE;

    }

 

private:

    // ½ºÅ©·Ñ »çÀÌÁî

    enum {SCROLL_CX = 640, SCROLL_CY = 480};

 

    // ¸Þ¼¼Áö ¸Ê

    typedef CScrollWindowImpl<CFlatScrollView, CFSBWindow> baseClass;

    BEGIN_MSG_MAP_EX(CFlatScrollView)

        MSG_WM_SIZE(OnSize)

        MSG_WM_CREATE(OnCreate)

        MSG_WM_DESTROY(OnDestroy)

        CHAIN_MSG_MAP(baseClass)

        CHAIN_MSG_MAP_ALT(baseClass, 1)

    END_MSG_MAP()

 

    void OnSize(UINT uType, CSize size){

        if(size.cx < SCROLL_CX)

            FlatSB_ShowScrollBar(SB_HORZ);

        if(size.cy < SCROLL_CY)

            FlatSB_ShowScrollBar(SB_VERT);

 

        SetMsgHandled(false);

    }

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

        LRESULT lRet = DefWindowProc();

 

        FlatSB_Initialize();

 

        SetScrollSize(SCROLL_CX, SCROLL_CY);

        SetScrollLine(10, 10);

        SetScrollPage(100, 100);

 

        SetMsgHandled(false);

 

        return lRet;

    }

 

    void OnDestroy(){

        FlatSB_Uninitialize();

    }

 

    void DoPaint(CDCHandle dc){

        // ½ºÅ©·Ñ À©µµ¿ìÀÇ Áß¾Ó¿¡ ij¸¯ÅÍ ¶óÀÎÀ» ¹¦È­

        CSize size;

        GetScrollSize(size);

        CRect rect(0, 0, size.cx, size.cy);

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

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

    }

};

                      


CFSBWindow Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­´Â atlscrl.h Çì´õÀÇ ¾Õ¿¡ atlctrls.h Çì´õ¸¦ ÀÎŬ·çµå ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. CFlatScrollView Ŭ·¡½º³»¿¡¼­´Â WM_CREATE ¸Þ¼¼Áö Çڵ鷯¿Í  WM_DESTROY ¸Þ¼¼Áö Çڵ鷯·Î °¢°¢ Ç÷§ Åø¹ÙÀÇ ÃʱâÈ­¿Í  Á¾·á 󸮸¦ ½Ç½ÃÇϰí ÀÖ½À´Ï´Ù.

µ¡ºÙ¿© ÀÌ´ë·Î´Â À©µµ¿ì¸¦ ½ºÅ©·Ñ »çÀÌÁ´Ù Å©°Ô ÇÏ°í ³ª¼­ ´Ù½Ã µÇµ¹·ÈÀ» °æ¿ì ½ºÅ©·Ñ ¹Ù°¡ ¾Èº¸ÀÌ°Ô µÇ¾î ¹ö¸³´Ï´Ù.  ±×·±µ¥ À̹ø ¿¹¿¡¼­´Â WM_SIZE ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇØ Å¬¶óÀÌ¾ðÆ® ¿µ¿ªÀÌ ½ºÅ©·Ñ »çÀÌÁ´Ù ÀÛÀº °æ¿ì¿¡ ½ºÅ©·Ñ ¹Ù¸¦ °¡½ÃÈ­Çϰí ÀÖ½À´Ï´Ù.  WTL7.5.4291±×¸®°í Ãß°¡µÈ SCRL_DISABLENOSCROLLÈ®Àå ½ºÅ¸ÀÏÀ» SetScrollExtendedStyle()·Î ¼³Á¤ÇÏ´Â °ÍÀ¸·Î  WM_SIZE ¸Þ¼¼Áö Çڵ鷯¸¦ ÁغñÇÒ Çʿ䰡 ¾ø¾îÁ³½À´Ï´Ù.