티스토리 뷰

[예제 결과]

mfc를 사용한 첫번째 예제입니다.

오늘은 아래 그림처럼 마우스와 키보드의 컨트롤 키를 사용해 사각형과 원을 그리고

사각형과 원의 색상 또한 변경시켜 그리는 방법에 대해 설명드리겠습니다.

[예제 설명 및 코드]

MFC에서 기본적으로 제공하는 함수인 LBUTTONDOWNLBUTTONUP을 사용하였습니다.

LBUTTONDOWN을 사용하면 마우스의 왼쪽버튼이 눌러졌을때

사용자가 원하는 이벤트가 일어나게 만들 수 있습니다.

또한, LBUTTONUP은 마우스의 왼쪽 버튼을 누른 후 버튼이 띄어졌을때

사용하자 원하는 이벤트가 일어나게 만들 수 있습니다.

 

저는 왼쪽 마우스 버튼 누르고 드래그 후 마우스 버튼이 업되면 사각형이 그려지게 만들고,

컨트롤 키를 누른상태에서 왼쪽 마우스 버튼을 누르고 드래그 후 버튼이 업되면 이 그려지게 만들었습니다.

 

 

 

우선 LBUTTONDOWN과 LBUTTONUP을 사용할 것이기 때문에 아래 그림과 같이

MFC가 제공하는 다양한 함수를 사용할 수 있는 클래스 마법사를 들어가줍니다.

방법은 프로젝트 -> 클래스 마법사에 들어가주시면됩니다.

 

 

 

클래스 마법사 창이 열리면 클래스 이름이 Dlg로 되어있는지 확인하셔야 합니다.

가끔 클래스 이름이 App로 되어있을 수 있습니다. 저는 CMFCExam01Dlg를 선택해주었고,

메시지창에 들어가 WM_LBUTTONDOWNWM_LBUTTONUP을 오른쪽에 추가시켜 줍니다~!

오른쪽에 추가시키는 방법은 더블클릭을 해주시면 오른쪽에 추가가됩니다.

오른쪽에 OnLButtonDown과 OnLButtonUp이 추가되었는지 확인하시고 확인버튼으로 창을 닫아줍니다.

 

 

 

그러면 아래와 같이 DOWN과 UP 함수가 만들어지는데

OnOnLButtonDown() 함수 안의 코드는

마우스의 왼쪽버튼이 눌러졌을때 이벤트를 발생시켜주는 것이고

OnLButtonUp() 함수 안의 코드는

마우스의 왼쪽버튼이 업되었을때 이벤트를 발생시켜주는 것입니다.

함수가 추가된걸 확인하셨으면

1
2
3
4
5
6
7
8
9
10
11
12
13
void CMFCExam01Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
 
    CDialogEx::OnLButtonDown(nFlags, point);
}
 
 
void CMFCExam01Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
    
    CDialogEx::OnLButtonUp(nFlags, point);
}
 
cs

 

 

다음으로 헤더 파일(제 기준으로 MFCExam01Dlg.h)에 들어가

CPoint 변수인 rect_start_posprivate 형식으로 만들어줍니다. 

rect_start_pos 변수는 마우스가 클릭되었을때

그 좌표를 저장해줄 C포인트 변수입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CMFCExam01Dlg : public CDialogEx
{
private:
    CPoint rect_start_pos;
 
// 생성입니다.
public:
    CMFCExam01Dlg(CWnd* pParent = nullptr);    // 표준 생성자입니다.
 
// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_MFCEXAM01_DIALOG };
#endif
 
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.
cs

 

 

 

마지막으로

DOWN과 UP함수 안에 아래 코드를 추가해 주시면 됩니다~!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void CMFCExam01Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    rect_start_pos = point;
    CDialogEx::OnLButtonDown(nFlags, point);
}
 
 
void CMFCExam01Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
    CClientDC dc(this); //DC생성
    CPen my_pen(PS_SOLID, 5, RGB(00255)); // 굵기가 5인 팬을 생성한다.
    dc.SelectObject(&my_pen); //  생성한 팬을 DC에 연결한다.
    SelectObject(dc, GetStockObject(NULL_BRUSH)); // 안이 투명한 도형을 그려주기 위해 NULL브러쉬를 만든다.
 
    if (nFlags & MK_CONTROL) // 컨트롤키가 눌려졌을때 
    {
        dc.Ellipse(rect_start_pos.x, rect_start_pos.y, point.x, point.y); // 원을 그려준다.
    }
 
    else { // 컨트롤키가 눌려지지 않았을때
        dc.Rectangle(rect_start_pos.x, rect_start_pos.y, point.x, point.y); // 사각형을 그려준다.
    }
    CDialogEx::OnLButtonUp(nFlags, point);
}
cs

위의 코드는 OnLButtonDown 함수에서 마우스 왼쪽 버튼이 눌려졌을 때 점(point)를 rect_start_pos변수에 넣어줍니다.

마우스가 눌려졌을 때 위치를 기억하는 역할을 합니다.

 

OnLButtonUp 함수에서 코드를 보시면

CPen my_pen(PS_SOLID, 5, RGB(0, 0, 255)); 

두께가 5인 파란색 CPen을 만들고 그 팬을 DC에 연결시해준다는 코드입니다.

RGB 값을 변경해 색상을 사용자가 바꿀 수 있고, 5대신 다른 숫자를 넣어서 굵기 또한 바꾸실 수 있습니다.

 

dc.SelectObject(&my_pen); 을 사용해 생성한 팬을 DC에 연결해줍니다.

 

그다음 테두리만 있는 투명한 도형을 그려주기 위해 GetStoctObject를  NULL_BRUSH를 써줍니다.

 

마지막으로 컨트롤 가 눌렸을 때는 원을 그리는 코드를 추가시켜줍니다.

조건문을 사용합니다.

if문의 (nFlags & MK_CONTROL)가 참이 되려면 키보드의 컨트롤키와 마우스의 왼쪽 버튼이 둘다 눌렸을 때

참이됩니다.

참이 된다면 dc.Ellipse를 사용해 이전에 OnLButtonDown에서 기억해놓았던 좌표인

rect_start_pos를 시작점으로 하고

마우스가 업되었을때 점을 point.x point.y를 마지막 점으로해 원을 그려주는 코드를 추가시켜줍니다.

 

else안의 코드는 Ellipse대신 rectangle을 사용해 사각형이 그려지게 만들어주었습니다.

 

결과적으로.

MK_CONTROL(키보드의 컨트롤 키)이 눌리면 Ellipse(원)을 그려주고

MK_CONTROL이 눌리지 않았다면 Rectangle(사각형)이 그려지게 만들었습니다.

 

rect_start_pos.x와 rect_start_pos.y는 사각형의 왼쪽 위의 점(마우스가 눌렸을 때)을 말하고

point.x와 point.y는 사각형의 왼쪽 아래 점(마우스 버튼이 띄어졌을 때)을 말합니다.

 

 

 

실행시켜 주시면 사각형과 원을 그릴 수 있는 대화 상자가 실행될 것입니다

이상 MFC에서 사각형과 원을 그리는 방법에 대해 설명해 드렸습니다~:)