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.0167 sec