Visual C++/CButton on CView

CButton with CView, MFC

Soul-Learner 2013. 6. 25. 13:36

CDialog기반이 아닌 CView 기반의 화면에 CButton 출력하기


CWnd 에 CButton을 출력하려고 했으나 실패하고 CView 위에 버튼을 출력하는데 성공했다


테스트 조건

 - CWnd나 CDialog가 아닌 CView를 사용한다

 - CButton변수는 지역변수가 아닌 멤버변수이어야 한다 (지역변수일 경우 실패)


TestView.h

class CTestView : public CView

{

protected: // serialization에서만 만들어집니다.

CWndOpenView();

DECLARE_DYNCREATE(CWndOpenView)


// 특성입니다.

public:

CWndOpenDoc* GetDocument() const;

CButton myButton1, myButton2, myButton3, myButton4;


TestView.cpp

void CTestView::OnInitialUpdate()

{

CView::OnInitialUpdate();


// Create a push button.

myButton1.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 

CRect(10,10,100,30), this, 1);

myButton1.ShowWindow(SW_SHOWNORMAL);


// Create a radio button.

myButton2.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 

CRect(10,40,100,70), this, 2);

myButton2.ShowWindow(SW_SHOWNORMAL);


// Create an auto 3-state button.

myButton3.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_AUTO3STATE, 

CRect(10,70,100,100), this, 3);

myButton3.ShowWindow(SW_SHOWNORMAL);


// Create an auto check box.

myButton4.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 

CRect(10,100,100,130), this, 4);

myButton4.ShowWindow(SW_SHOWNORMAL);


// TODO: Add your specialized code here and/or call the base class

}



CView 위에 나타난 버튼을 클릭했을 때 발생하는 이벤트를 처리하기 위해서는 CButton 클래스의 메시지 핸들러인 OnBnClicked() 함수를 사용해야 하므로 CButton 클래스를 기반으로 하위 클래스를 생성하고 OnBnClicked() 함수를 오버라이드해 주면 된다.


CView 상에서 클릭 이벤트를 처리하기 위한 CButton 하위 클래스(MyButton.cpp)

// MyButton.cpp : implementation file

#include "stdafx.h"

#include "WndOpen.h"

#include "MyButton.h"


// MyButton


IMPLEMENT_DYNAMIC(MyButton, CButton)


MyButton::MyButton()

{

#ifndef _WIN32_WCE

EnableActiveAccessibility();

#endif


}


MyButton::~MyButton()

{

}


BEGIN_MESSAGE_MAP(MyButton, CButton)

ON_CONTROL_REFLECT(BN_CLICKED, &MyButton::OnBnClicked)

END_MESSAGE_MAP()


// MyButton message handlers

void MyButton::OnBnClicked()

{

// TODO: Add your control notification handler code here

AfxMessageBox(_T("Button Clicked"));

}



위에서 새로 생성한 MyButton 클래스를 사용하여 버튼 이벤트를 처리하려면 위의 Test.h 헤더 파일은 다음과 같이 변수형만 변경해주면 된다

TestView.h

class CTestView : public CView

{

protected: // serialization에서만 만들어집니다.

CWndOpenView();

DECLARE_DYNCREATE(CWndOpenView)


// 특성입니다.

public:

CWndOpenDoc* GetDocument() const;

MyButton myButton1, myButton2, myButton3, myButton4;