U E D R , A S I H C RSS

5인용C++스터디/에디트박스와콤보박스

  • 발표에 꼭 들어가야 할 것들
    • 에디트박스는 어떻게 만드나?
    • 에디트박스의 내용을 어떻게 얻어오나?
    • 콤보박스에는 어떤 종류가 있나?
    • 콤보박스는 어떻게 만드나?
    • 콤보박스에 어떻게 아이템을 추가하나?
    • 콤보박스의 내용을 어떻게 얻어오나?
    • 다이얼로그 박스에서 만들고 사용하는 방법을 발표하면 안됨!
  • 발표에 들어가면 좋은 것들
    • 리스트박스에 대하여...

1. 에디트


에디트 컨트롤은 문자열을 보여주며 편집할 수 있도록 해주는 컨트롤이다. 주로 사용자에게 문자열을 입력받을 때 사용된다.
에디트 컨트롤은 CEdit 클래스로 표현된다. 멤버함수는 다음과 같다.

멤버함수 / 설명
CEdit / 생성자
Clear / 선택영역을 지운다.
Copy / 선택영역을 클립보드로 복사한다.
Create / 에디트를 만든다.
Cut / 선택영역을 잘라낸다.
Paste / 클립보드의 텍스트를 붙여넣는다.
Undo / 최후 편집 동작을 취소한다.

이 멤버함수들 중에서 Create 함수를 사용하면 대화상자 템플리트에 에디트를 배치하지 않고도 실중에 에디트 컨트롤을 생성할 수 있다.
CreateEdit라는 프로젝트를 만들어보자. 폼뷰가 아닌 일반 뷰에 에디트를 배치하려면 뷰가 생성될 때 (WM_CREATE) OnCreate에서 에디트를 생성시키면 된다. 우선 뷰의 헤더파일을 열어 CEdit형 포인터를 선언한다.


~cpp 
class CCreateEditView : public CView
{
protected:
	CCreateEditView();
	DECLARE_DYNCREATE(CCreateEditView)

//Attributes
public:
	CCreateEditDoc* GetDocument();
	CEdit *m_pEdit;

그리고 뷰의 WM_CREATE 메시지 핸들러인 OnCreate를 작성하고 이 핸들러에서 에디트를 생성한다.


~cpp 
#define IDC_MYEDIT 1000
int CCreateEditView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if(CView::OnCreate(lpCreateStruct) == -1)
	return -1;

	m_pEdit = new CEdit;
	m_pEdit -> Create(WS_CHILD | WS_VISIBLE | WS_BORDER,
		CRect(10, 10, 300, 35), this, IDC_MYEDIT);

	return 0;
}

m_Edit가 CEdit의 포인터로 선언되었으므로 일단 new 연산자로 CEdit객체를 만든다. 그리고 이 객체의 Create 멤버함수를 호출하여 에디트를 생성한다. Create 함수의 원형은 다음과 같다.


~cpp 
BOOL Create(DWORD dwstyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

첫 번째 인수로 에디트의 스타일을 주되 에디트는 메인 윈도우가 될 수 없으므로 WS_CHILD 스타일을 주어야 하고 생성하자마자 보여야 하므로 WS_VISIBLE 스타일을 주어야 한다. 또한 에디트는 디폴트로 경계선을 가지지 않으므로 WS_BORDER 스타일을 주어야 보이게 된다. 두 번째 인수로 에디트가 차지할 사각영역을 주고 세 번째 인수로 에디트의 부모 윈도우의 포인터를 준다. 마지막 인수인 nID는 에디트 컨트롤의 ID이되 통지 메시지를 처리하지 않을 경우는 ID를 주지 않아도 상관없다.
예제에서는 (10, 10, 300, 35) 사각 영역에 에디트를 생성하였으며 통지 메시지를 사용할 것이므로 IDC_MYEDIT라는 매크로 상수를 1000으로 정의하여 ID로 주었다. 여기서 1000이라는 ID는 임의로 준 것이다.

new 연산자로 에디트 객체를 만들었으므로 프로그램이 종료될 때 이 객체를 파괴해 주어야 한다. WM_DESTROY 메시지의 핸들러에 다음 코드를 작성하면 된다.


~cpp 
void CCreateEditView::OnDestroy()
{
	CView::OnDestroy();
	
	delete m_pEdit;
}

이렇게 Create 함수로 만든 에디트의 통지 메시지는 어떻게 처리해야 할까. 클래스 위저드가 메시지 핸들러를 만들 때 해주는 세가지 동작을 프로그래머가 직접 해줘야 한다. 우선 메시지 맵에서 메시지와 메시지 핸들러를 연결시켜 준다. ON_EN_CHANGE 매크로에 의해 IDC_MYEDIT 에디트가 EN_CHANGE 메시지를 보내올 때 OnChangeEdit1 함수가 호출된다.



~cpp 
BEGIN_MESSAGE_MAP(CCreateEditView, CView)
	//{{AFX_MSG_MAP((CCreateEditView)
.
.
.
.
.
	//Standard printing commands
	ON_EN_CHANGE(IDC_MYEDIT, OnChangeEdit1)
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
.
.
.

두 번째로 헤더파일에 메시지 핸들러의 함수의 원형을 선언한다.

~cpp 

//Generated message map functions
protected:
	//{{AFX_MSG(CCreateEditView)
	.
	.
	//}}AFX_MSG
	afx_msg void OnChangeEdit1();
	DECLARE_MESSAGE_MAP()
};

세 번째로 메시지 핸들러 함수 OnChangeEdit1 함수를 작성한다. 함수의 본체 코드는 물론이고 함수명까지 직접 입력해 주어야 한다. 이 함수는 에디트 컨트롤의 문자열을 읽어 들이는 함수이다.


~cpp 

void CCreateEditView::OnChangeEdit1()
{
	CString str;
	m_pEdit->GetWindowText(str);
	AfxGetMainWnd()->SetWindowText(str);
}

예제에서 에디트의 EN_CHANGE 통지 메시지를 사용해 보았다. 통지 메시지란 컨트롤에 어떤 변화가 발생했을 때 부모 윈도우에게 자신의 변화를 알리기 위해 보내는 메시지를 말한다.
에디트의 통지 메시지는 다음과 같다.

메시지 / 설명
EN_CHANGE / 에디트의 문자열이 변경되었다.
EN_ERRSPACE / 메모리가 부족하다.
EN_HSCROLL / 사용자가 수평스크롤 바를 클릭하였다.
EN_VSCROLL / 사용자가 수직스크롤 바를 클릭하였다.
EN_KILLFOCUS/ 포커스를 잃었다.
EN_SETFOCUT / 포커스를 얻었다.
EN_MAXTEXT / 지정한 문자열 길이를 초과하였다.
EN_UPDATE / 문자열이 변경되기 직전이다.



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:18
Processing time 0.0310 sec