MFC
컨트롤 윈도우와 대화상자
윤주승
2025. 4. 18. 16:31
힘들게 GDI를 배운 이유
- 윈도우 프로그래밍의 대부분은 컨트롤 윈도우를 사용해 GUI를 개발하는 것
- 이미 만들어진 컨트롤 윈도우를 활용하는 것이 일반적이나 필요하다면 커스텀 컨트롤을 새로 제작
- 기존 컨트롤 윈도우를 기반으로 확장하는 것도 가능
- 서브 클래스
- 파생 클래스 제작 (예 : CEditEx) Edit <- 입력
버튼을 하나 만들고 그 버튼에 이벤트를 줄 것이다. 먼저 헤더파일에 사각형을 만들고, 호버의 기본값을 초기화하였다.
CRect m_btn = CRect(100, 100, 220, 150);
BOOL m_bHover = FALSE;
그리고 메뉴에서 TEST버튼을 하나 만들었다. 그리고 그 버튼에서 View파일에 이벤트 처리기 하나를 만들었다.
void CVirtualButtonView::OnTestTest()
{
// TODO: 여기에 명령 처리기 코드를 추가합니다.
AfxMessageBox(_T("TEST"));
}
그리고 이제 Paint함수에서 변화를 줄것이다. 우선 사각형에 마우스가 들어갔는지 확인을 먼저 해주고, 들어갔다면 호버를 줘서 사각형의 색상을 변화시킨다.
void CVirtualButtonView::OnMouseMove(UINT nFlags, CPoint point)
{
// 네모안으로 들어왔는지
if (m_btn.PtInRect(point)) {
m_bHover = TRUE;
}
else
m_bHover = FALSE;
RedrawWindow();
CView::OnMouseMove(nFlags, point);
}
OnMouseMove함수는 PtInRect함수를 통해 마우스가 영역에 들어왔는지 확인만 하고,
void CVirtualButtonView::OnPaint()
{
CPaintDC dc(this);
if (m_bHover) {
dc.SetTextColor(RGB(255, 255, 255));
dc.FillSolidRect(&m_btn, RGB(192, 0, 0));
}
else {
dc.SetTextColor(RGB(192, 192, 192));
dc.FillSolidRect(&m_btn, RGB(192, 192, 192));
}
dc.DrawText(_T("Test Btn"), &m_btn, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
}
들어왔다면 if문이 실행되어 글자색과 사각형의 색상이 바뀐다. 그리고 사각형을 클릭했을땐 OnLBUttonUp함수를 실행한다.
void CVirtualButtonView::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_btn.PtInRect(point)) {
this->PostMessage(WM_COMMAND, ID_TEST_TEST);
}
CView::OnLButtonUp(nFlags, point);
}
WM_COMMAND는 앞서 이벤트처리기를 추가해놓았고, ID값이 ID_TEST_TEST를 실행한다. OnTestTest() 함수가 TEST를 출력하기때문에 사각형을 클릭하면 TEST가 출력된다.
그리고 글자를 입력받기 위해서 CEdit 클래스를 사용한다. CEdit 클래스는 부모 자식 관계를 알아야 하는데,
Edit 컨트롤은 거의다 Child 이다. View클래스에 넣을것이므로 View클래스가 부모가 된다.
CEdit m_wndName;
int CVirtualButtonView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
m_wndName.Create(
ES_LEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
CRect(10, 10, 100, 40), this, 1);
return 0;
}
이런 네모칸이 만들어진다.
void CVirtualButtonView::OnTestTest()
{
CString tmp;
m_wndName.GetWindowText(tmp);
AfxMessageBox(tmp);
}
CString을 사용해 내가 입력한 문자열을 GetWindowText를 통해 복사하여 tmp에 저장한 뒤, 그 값을 출력 할 수도 있다.