Transcript 8. 그림 그리기
8장. 그림 그리기
8. 그림 그리기
8.1 점찍는 프로그램 만들기
마우스를 클릭할 때 마다 점이 찍히도록 만들어 본다.
8. 그림 그리기
실습 24
1.
새로 MFC 응용프로그램 프로젝트를 생성한다. (이름 : Dot)
2.
응용프로그램 종류를 [대화 상자 기반]으로,
[유니코드 라이브러리 사용]을 체크 해제한다.
3.
화면에 있는 컨트롤들을 삭제하여 깨끗하게 한다.
8. 그림 그리기
4. 아래와 버튼 2개를 만든다.
IDC_BUTTON1
IDC_BUTTON2
8. 그림 그리기
5. 클래스 마법사를 실행하고 메시지에서 WM_LBUTTONDOWN에
대해 처리기 추가 를 하고 코드편집 을 누른다.
8. 그림 그리기
6. 다음 코드를 입력한다.
void CDotDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CClientDC dc(this);
마우스클릭 위치에 점을 찍는다.
dc.SetPixel(point.x, point.y, RGB(0,0,255));
}
CDialogEx::OnLButtonDown(nFlags, point);
점색
8. 그림 그리기
7.
지우기 버튼을 더블 클릭하고 아래의 코드를 추가한다.
void CDotDlg::OnBnClickedButton1()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
InvalidateRect(NULL, TRUE);
UpdateWindow();
윈도우를 지우고 갱신한다.
}
8.
종료 버튼을 더블클릭하고 OnOK(); 를 입력한다.
연습문제 1
*
아래와 같이 마우스를 움직이면 점이 찍히도록 한다.
( 힌트 : 클래스마법사 -> 메시지 -> WM_MOUSEMOVE ->
처리기 추가 -> 코드편집 -> SetPixel 코드 입력
8. 그림 그리기
8.2 간단한 그림판 만들기
마우스를 누르고 움직여 그림을 그릴 수 있도록 만들어 본다.
8. 그림 그리기
실습 25
1.
새로 MFC 응용프로그램 프로젝트를 생성한다. (이름 : Line)
2.
응용프로그램 종류를 [대화 상자 기반]으로,
[유니코드 라이브러리 사용]을 체크 해제한다.
3.
화면에 있는 컨트롤들을 삭제하여 깨끗하게 한다.
8. 그림 그리기
4. 아래와 같이 에디터 상자 1개와 버튼 1개를 만든다.
IDC_BUTTON1
IDC_BUTTON2
8. 그림 그리기
* 아래와 같이 미리 변수를 정한다.
•
마우스 좌측버튼 관련 변수 : flag
(bool)
누를 때 -> 1
누르지 않을 때 -> 0
•
마우스 x 좌표 위치 변수 : nSX
(int)
•
마우스 y 좌표 위치 변수 : nSY
(int)
•
초기값
flag = 0
선 색상 = 청색
8. 그림 그리기
5. 클래스 마법사를 실행하고 멤버 변수 탭에서 사용자 지정 추가 를
눌러 변수를 3개 만들고 확인을 누른다.
주의!
주의!
nSX
주의!
nSY
flag
8. 그림 그리기
6. 메시지 의 WM_LBUTTONDOWN 를 클릭하고 처리기 추가 를 한
후 코드 편집 을 누른다.
8. 그림 그리기
7. 아래와 같이 코드를 추가한다.
마우스 좌측버튼을 누를 때
void CLineDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
nSX = point.x;
nSY = point.y;
flag = 1;
}
X좌표값을 변수 nSX에 입력
Y좌표값을 변수 nSY에 입력
좌측 마우스버튼이 눌려진 상태를 1로 한다.
CDialogEx::OnLButtonDown(nFlags, point);
8. 그림 그리기
8. 마찬가지로 메시지 의 WM_LBUTTONUP 을 클릭하고 처리기 추가
를 한 후 코드 편집 을 누른다.
8. 그림 그리기
9. 아래와 같이 코드를 추가한다.
마우스 좌측버튼을 누르지 않을 때
void CLineDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
flag = 0;
}
좌측 마우스버튼을 누르지 않은 상태를 0으로 한다.
CDialogEx::OnLButtonUp(nFlags, point);
8. 그림 그리기
10. 메시지 의 WM_MOUSEMOVE 를 클릭하고 처리기 추가 를 한 후
코드 편집 을 누른다.
8. 그림 그리기
11. 아래와 같이 코드를 추가한다.
마우스를 움직일 때
void CLineDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CClientDC dc(this);
CPen pEn;
pEn.CreatePen(PS_SOLID, 3, RGB(0,0,255));
dc.SelectObject(&pEn);
펜 생성
펜 색을 파란색으로한다.
마우스 좌측 버튼이 눌려진 경우만 아래 실행
if (flag == 1)
{
마우스 좌측 버튼이 눌려진 위치로 이동
dc.MoveTo(nSX, nSY);
dc.LineTo(point.x, point.y);
새로 이동한 곳까지 선을 긋는다.
nSX = point.x;
nSY = point.y;
새로 이동한 위치의 좌표를 변수에 넣는다.
}
}
CDialogEx::OnMouseMove(nFlags, point);
8. 그림 그리기
CreatePen(, , ) 함수
Pen Style
PS_SOLID
PS_DASH
PS_DOT
PS_NULL
Pen 굵기
Pen 색
실선
──────
긴 파선. 펜의 폭이 1일때만 유효
─────
짧은 파선. 펜의 폭이 1일때만 유효 -----------투명
8. 그림 그리기
12. OnInitDialog() 를 찾아 아래의 코드를 추가 한다.
BOOL CScrolDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
flag = 0;
}
마우스버튼 초기값(누르지 않은 상태)
return TRUE; //포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
8. 그림 그리기
13. 지우기 버튼을 더블 클릭하고 아래와 같이 코드를 추가한다.
void CLineDlg::OnBnClickedButton1()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
InvalidateRect(NULL, TRUE);
UpdateWindow();
}
다이얼로그 화면 무효화
다이얼로그 화면 다시 그린다.
8. 그림 그리기
14. 종료 버튼을 더블 클릭하고 아래 코드를 추가한다.
void CComboDlg::OnClickedButton2()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
OnOK();
다이얼로그 상자 종료
}
15. 실행 후 결과를 확인해 본다.
연습문제 2
* 아래와 같이 선 색을 선택할 수 있도록 한다.
힌트 :
멤버변수 -> 사용자지정 추가
에서 nRed, nGreen, nBlue
추가
OnInitDialog 에 아래 추가
nRed = 0;
nGreen = 0;
nBlue = 255;
nRed = 255;
nGreen = 0;
nBlue = 0;
nRed = 255;
nGreen = 0;
nBlue = 0;
pEn.CreatePen(PS_SOLID, 3, RGB(nRed, nGreen, nBlue));
변경
nRed = 255;
nGreen = 0;
nBlue = 0;
연습문제 3
* 아래와 같이 선 넓이도 선택할 수 있도록 한다.
힌트 :
사용자 지정변수 nWid
초기값 : nWid = 1;
pEn.CreatePen(PS_SOLID, nWid, RGB(nRed, nGreen, nBlue));
변경
nWid = 3;
nWid = 10;
추가