먼저 동적 할당을 받는 방법은 여러가지 방법이 있겠지만
가장 간단한 방법으로 컨트롤을 상속을 받아 클래스를 생성하여
그 클래스를 가지고 객체를 생성을 시키는 방법을 이용해 생성해 볼려고 합니다.
그 이유가 동적 객체에 각 이벤트를 이용하기 위해서는 그 이벤트를 미리
정의를 해 놔야 되는데, 그러기 위해서는 미리 클래스에 그 이벤트에 대해서
정의를 해 놓으면 되기 때문에 이런 식으로 동적 객체 생성을 할려고 합니다.
일단 CButton 컨트롤를 생성해 보기 위해서 CButton 컨트롤을 상속 받은 클래스를
만들어 보겠습니다.
먼저 솔루션 탐색기를 선택 후 헤더파일 이라고 적힌 곳에서 마우스 오른쪽 버튼을 누른 후
추가 => 클래스 순서대로 누릅니다.
그럼 위 그림처럼 하나의 다이얼로그 창이 뜨게 됩니다. 그 중에서 MFC 클래스를 선택 후
추가를 누릅니다.
선택을 누르면 위 그림 처럼 또 다른 다이얼로그 창이 뜨게 되는데,
여기에서 클래스 이름에서 원하는 이름을 적고 기본클래스에서 CButton 클래스를 선택을 합니다.
그 뒤에 마침을 누릅니다.
그럼 이렇게 솔루션 탐색기에서 새로운 헤더파일과 cpp 파일이 생길 것입니다.
그럼 CButton 클래스를 상속받은 클래스가 생성된 것입니다.
여기에서
이제 메세지 정의를 하기 위해서 클래스 뷰를 선택 한뒤 Mybutton을 클릭 후 속성창으로 가면 번개 표시가 나오고
그옆에 메세지 아이콘이 보일 것입니다.
그 아이콘을 선택 후 원하는 메세지를 선택하면 클래스에 그 메세지를 사용할 수 있고 그리고 재정의 할 수 있게
됩니다.
이런식으로 새로운 클래스에서 필요한 메세지를 재정의를 시킵니다.
그 뒤에 메인 다이얼로그 창에서 버튼을 동적 생성 시킬 것이기 때문에,
메인 다이얼로그 창의 cpp 파일로 갑니다.
거기에서 OnInitDialog() 함수에서
동적 객체 생성을 하면 됩니다.
OnInitDialog()함수에서 하는 이유가 이 다이얼로그가 생성 되자마자 바로 이 버튼을 나오게 하기 위해서
여기에서 생성을 하도록 하였습니다.
BOOL CTEST1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
Mybutton *button = new Mybutton; // 이건 멤버변수
CRect rect;
rect.SetRect(200,200, 250, 230);
button->Create(_T("q"), WS_VISIBLE | WS_CHILD, rect, this, 1234);
button->ShowWindow(SW_SHOW);
return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
이렇게 생성을 시켰습니다.
그럼 이제 이 버튼을 생성을 시켰기 때문에 소멸도 시켜야 되는데,
소멸을 시키기 위해서는
객체의 생성이 이루어 지는 메인 다이얼로그 창 클래스에 CArray 탬플릿 변수를 생성을 합니다.
class CTEST1Dlg : public CDialog
{
// 생성입니다.
public:
CTEST1Dlg(CWnd* pParent = NULL); // 표준 생성자입니다.
// 대화 상자 데이터입니다.
enum { IDD = IDD_TEST1_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
// 구현입니다.
protected:
HICON m_hIcon;
// 생성된 메시지 맵 함수
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnDestroy();
afx_msg void OnClose();
CArray
이런식으로 생성을 한 뒤에
OnInitDialog() 함수에 밑의 소스 처럼 탬플릿 변수에 생성한 객체를 추가를 시킵니다.
BOOL CTEST1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
Mybutton *button = new Mybutton; // 이건 멤버변수
button_delete.Add(button);
CRect rect;
rect.SetRect(200,200, 250, 230);
button->Create(_T("q"), WS_VISIBLE | WS_CHILD, rect, this, 1234);
button->ShowWindow(SW_SHOW);
return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
그리고 OnDestroy() 함수에 밑의 메모리 해제를 시키는 함수를 추가 시키면 됩니다.
참, OnDestroy()함수는 아까와 같은 방법으로 필요한 클래스를 선택 후 메세지 아이콘 누른 후 생성하면 됩니다.
void CTEST1Dlg::OnDestroy()
{
CDialog::OnDestroy();
for(int i = 0; i < button_delete.GetSize(); i++)
{
delete button_delete[i];
}
button_delete.RemoveAll();
}
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=818623&ref=818592&page=17#Contents818623
'API / MFC > Tip / Information' 카테고리의 다른 글
FindFirstFile 함수를 이용한 파일 찾기 (0) | 2010.04.14 |
---|---|
메인 다이얼로그 핸들 값 얻기 (0) | 2010.03.24 |
지정된 폴더의 파일들의 파일명 얻기 (0) | 2010.03.23 |
라이브러리(.lib) 링크 하는 방법 (0) | 2010.03.11 |
afx_msg이란? (0) | 2010.02.25 |