상세 컨텐츠

본문 제목

[MFC] Custom Control 사용 관련

프로그래밍 관련/MFC

by AlrepondTech 2016. 11. 30. 12:46

본문

반응형

 

 

=================================

=================================

=================================

 

 

 

 

출처: http://laitdei.tistory.com/entry/MFC-CustomControl-%EC%97%B0%EC%8A%B5

 

 

원문 참조
http://www.codeproject.com/KB/miscctrl/customcontrol.aspx


MFC를 공부한지 꽤 되었지만 역시 모르는 것이 더 많다.
위 링크 참조하여 MFC 의 Custom_Control 을 공부해보자.
사용해 보니 꽤 편리했다.

 

 

 

우선 Custom Control 을 사용해 보면 다음과 같이 나온다.

 

우측의 속성 중 "Class" 에 집중하자. 이 곳에 사용할 윈도우의 ClassName을 적어야 한다.

단, 단순 클래스이름이 아닌 RegisterClass 함수로 등록한 이름임을 명심하자. 그리고 MFC 기반의 CWnd 를 상속 받은 윈도우여 한다.

 

 

 

 

 

이제 실제로 Custom Control 를 사용하기 위한 클래스를 만들어 보자.

예제는 위 링크에 있는 CBitmapView 코드이다.

클래스를 만들고,

 

 

헤더에 몇 가지 정의 추가하고,

BitmapView.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
#include "afxwin.h"
 
#define BITMAPVIEWER_CLASSNAME  _T("MFCBitmapViewCtrl")
 
class CBitmapView :
    public CWnd
{
public:
    CBitmapView(void);
    ~CBitmapView(void);
 
    BOOL        SetBitmap(UINT nIDResource);
 
    DECLARE_MESSAGE_MAP()
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    afx_msg void OnPaint();
 
protected:
    BOOL        RegisterWindowClass();
    CBitmap     m_Bitmap;
 
};

 

 

반응형

 

 

728x90

 

 

CPP 파일에서 세부 구현 추가

BitmapView.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "StdAfx.h"
#include "BitmapView.h"
 
 
 
CBitmapView::CBitmapView(void)
{
    RegisterWindowClass();
}
 
CBitmapView::~CBitmapView(void)
{
}
 
BOOL    CBitmapView::RegisterWindowClass()
{
    WNDCLASS    wndcls;
    HINSTANCE   hInst = AfxGetInstanceHandle();
 
    if ( !(::GetClassInfo(hInst, BITMAPVIEWER_CLASSNAME, &wndcls)) )
    {
        wndcls.style            = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
        wndcls.lpfnWndProc      = ::DefWindowProc;
        wndcls.cbClsExtra       = wndcls.cbWndExtra = 0;
        wndcls.hInstance        = hInst;
        wndcls.hIcon            = NULL;
        wndcls.hCursor          = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
        wndcls.hbrBackground    = (HBRUSH) (COLOR_3DFACE + 1);
        wndcls.lpszMenuName     = NULL;
        wndcls.lpszClassName    = BITMAPVIEWER_CLASSNAME;
 
        if (!AfxRegisterClass(&wndcls))
        {
            AfxThrowResourceException();
            return FALSE;
        }
    }
    return TRUE;
}
 
BEGIN_MESSAGE_MAP(CBitmapView, CWnd)
    ON_WM_ERASEBKGND()
    ON_WM_PAINT()  
END_MESSAGE_MAP()
 
BOOL CBitmapView::OnEraseBkgnd(CDC* pDC)
{
    // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
    if (m_Bitmap.GetSafeHandle() != NULL)
        return TRUE;
 
 
    return CWnd::OnEraseBkgnd(pDC);
}
 
void CBitmapView::OnPaint()
{
    if (m_Bitmap.GetSafeHandle() != NULL)
    {
        CPaintDC dc(this);
 
        CDC MemDC;
        if ( !MemDC.CreateCompatibleDC(&dc) )
            return;
 
        CRect rt;
        GetClientRect(rt);
 
        BITMAP  bm;
        m_Bitmap.GetBitmap(&bm);
 
        CBitmap*    pOldBitmap = (CBitmap*) MemDC.SelectObject(&m_Bitmap);
        dc.StretchBlt(0, 0, rt.Width(), rt.Height(), &MemDC,
            0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
        MemDC.SelectObject(pOldBitmap);
    }
 
}
 
 
BOOL    CBitmapView::SetBitmap(UINT nIDResource)
{
    return m_Bitmap.LoadBitmap(nIDResource);
}

 

 

 

이제 준비가 된 클래스를 사용하여 Custom Control 을 만들어보자.

우선 사용할 헤더파일에선 기본 센스 두 가지 해주고

1
2
3
#include "BitmapView.h"
...
CBitmapView           m_View;

 

CPP 파일에서 명시적으로 DDX 연결해주는 것을 잊지 말자.

1
DDX_Control(pDX, IDC_CUSTOM1, m_View);

 

 

그림: B부분을 레지스트리 클래스네임 등록한 이름을 확인해보고 A부분을 누루면 다이얼로그 클래스에 추가 변수를 지정하는 창이 뜬다.

 

그리고 "변수형식"에 만들었던 클래스이름을 넣어주고, "변수이름"에 자신이 넣을 변수이름명(m_View)을 넣어주면 된다.

 

그럼 자신이컨트롤클래스를 등록한 다이얼로그 클래스에 자동으로 

 

헤더 부분에 ->

 CBitmapView           m_View;

 

소스부분에 ->

1
DDX_Control(pDX, IDC_CUSTOM1, m_View);

 

이 코드들이 자동으로 생성 될 것 이다.

 

 

 

 

마지막으로 아무 비트맵이나 생성해서

 

결과 확인

1
m_View.SetBitmap(IDB_BITMAP1);

 

 

 

 

=================================

=================================

=================================

 

 

반응형


관련글 더보기

댓글 영역