라인에딧 값을 가져와서 검은 원을 그리는 코드를 그리며 공부해 보았다.
전체 코드
using namespace std;
void CProDrawCircleDlg::OnBnClickedButton1()
{
CClientDC dc(this);
// 라인에딧 값 가져오기 = 원의 반지름 가져오기
CString mText;
mEdit.GetWindowText(mText);
int r = _wtoi(mText.GetBuffer()); // 반지름
mText.ReleaseBuffer();
cout << r << endl; // 출력 확인용
// 다이얼로그의 클라이언트 영역의 크기와 위치를 얻기
CRect rect;
GetClientRect(&rect);
// 원의 중심을 다이얼로그의 중앙으로 설정
int centerX = rect.Width() / 2;
int centerY = rect.Height() / 2;
int radius = r;
// 화면 칠하기
dc.FillSolidRect(&rect, RGB(255, 255, 255));
// 원의 테두리 두께를 설정
int penWidth = 5;
// 검은 원 그리기
CBrush blackBrush(RGB(0, 0, 0));
CBrush* oldBrush = dc.SelectObject(&blackBrush);
dc.Ellipse(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
dc.SelectObject(oldBrush);
//// 노란색 테두리 그리기
//CPen yellowPen(PS_SOLID, penWidth, RGB(255, 255, 0));
//CPen* oldPen = dc.SelectObject(&yellowPen);
//dc.Ellipse(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
//dc.SelectObject(oldPen);
}
왼쪽 도구상자에서 버튼, 에딧 컨트롤, 스태틱 텍스트를 가져와서 다이얼로그 하단에 넣는다.
버튼을 더블클릭 해서 클릭 이벤트 함수 생성한다.
출력 확인을 위해 헤더에 아래와 같이 코드를 넣는다.
#ifdef _DEBUG
#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")
#endif
#include <iostream>
코드 설명
using namespace std;
cout 출력에 사용되는 std를 축약하기 위해 함수 위에 넣었다.
CClientDC dc(this);
CClientDC dc(this);
함수 내에 그림을 그리는 CClientDC 클래스를 생성한다. 이 클래스는 주로 다이얼로그나 윈도우의 클라이언트 영역에 그림을 그리는데 사용된다. 이 클래스의 객체는 해당 윈도우의 클라이언트 영역에 직접 그림을 그리기 위 그래픽 디바이스 컨텍스트를 제공한다.
this: 현재 클래스(대개는 CDialog 파생 클래스)의 포인터이다. 현재 다이얼로그의 클라이언트 영역에 그림을 그리기 위해 사용된다.
라인에딧의 함수를 생성해 준다. 쉬운 방법으로 라인에딧 우클릭 - 클래스 마법사 - 멤버 변수에 들어간다.
라인에딧의 ID를 확인하고 더블클릭 혹은 변수 추가를 해서 변수를 추가해 준다.
생성된 변수는 헤더 맨 마지막에 추가된 모습을 확인할 수 있다.
라인에딧 값 가져오기
// 라인에딧 값 가져오기 = 원의 반지름 가져오기
CString mText;
mEdit.GetWindowText(mText);
int r = _wtoi(mText.GetBuffer()); // 반지름
mText.ReleaseBuffer();
cout << r << endl; // 출력 확인용
라인에딧에 쓴 값을 가져오기 위해 Cstring 변수를 선언해 준 후
GetWindowText 메서드를 사용하여 값을 가져온다.
그리고 _wtoi를 사용하여 int형으로변환해 준다.
참고 링크
http://www.tipssoft.com/bulletin/board.php?bo_table=story&wr_id=3496
// 다이얼로그의 클라이언트 영역의 크기와 위치를 얻기
CRect rect;
GetClientRect(&rect);
다이얼로그의 클라이언트 영역의 크기와 위치를 얻기 위해 rect 객채를 생성한 후
GetClientRect 함수를 사용한다. 이 함수는 다이얼로그의 클라이언트 영역의 크기와 위치를 CRect 객체로 반환한다.
// 원의 중심을 다이얼로그의 중앙으로 설정
int centerX = rect.Width() / 2;
int centerY = rect.Height() / 2;
int radius = r;
원의 중심을 다이얼로그의 중앙으로 설정한다.
// 화면 칠하기
dc.FillSolidRect(&rect, RGB(255, 255, 255));
화면을 하얗게 칠하기 위해 FillSolidRect함수를 사용한다.
이 함수는 지정된 색상으로 지정된 영역을 채워준다.
// 검은 원 그리기
CBrush blackBrush(RGB(0, 0, 0));
CBrush* oldBrush = dc.SelectObject(&blackBrush);
dc.Ellipse(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
dc.SelectObject(oldBrush);
검은 원 그리기
- CBrush: GDI 브러시 오브젝트를 나타내는 MFC 클래스이다. 여기에서는 검은색 브러시를 생성한다. RGB(0, 0, 0)은 검은색을 나타낸다.
- SelectObject: CDC 클래스의 멤버 함수로, 그리기 도구(펜, 브러시 등)를 선택한다. 기존에 사용되던 브러시를 oldBrush에 저장하고, 새로운 브러시를 blackBrush로 선택한다.
- Ellipse: 원 또는 타원을 그리는 CDC 클래스의 멤버 함수이다. 주어진 좌표를 사용하여 원을 그린다.
- SelectObject: 그리기 도구를 원래대로 복구한다. oldBrush에 저장된 원래의 브러시로 돌아온다.
이클립스 함수
BOOL Ellipse(
[in] HDC hdc, // 디바이스 컨텍스트에 대한 핸들
[in] int left, // 경계 사각형의 왼쪽 위 모서리에 있는 논리 좌표의 x 좌표
[in] int top, // 경계 사각형의 왼쪽 위 모서리에 있는 논리 좌표의 y 좌표
[in] int right, // 경계 사각형의 오른쪽 아래 모서리에 있는 논리 좌표의 x 좌표입니다.
[in] int bottom // 경계 사각형의 오른쪽 아래 모서리에 있는 논리 좌표의 y 좌표입니다.
);
그리고 이 프로젝트를 실행하면
입력값 반지름에 따라 다르게 원이 생성되는 모습을 볼 수 있다.
'개발공부 > C++' 카테고리의 다른 글
[C++] 쓰레드 생성, 이미지에서 픽셀 갯수 세기 (0) | 2023.09.20 |
---|---|
[C++] 멀티 쓰레드, 프로세스, 쓰레드 이해하기, C++ 예제 (0) | 2023.09.20 |
[C++] <chrono> 헤더 사용하여 함수 실행시간 측정 (0) | 2023.09.19 |
[C++] 여러 조건 변경하기, Cpen 색 변경, define (0) | 2023.09.19 |
[C++] MFC 다른 윈도우로 포인트 복제하기 (1) | 2023.09.18 |