[문제]
부모 다이얼로그(mainDlg) 1개, 자식 다이얼로그(Dialog1) 1개가 있다.
부모에서 모달리스 버튼을 누르면 자식 다이얼로그가 나타난다.
모달리스는 포커스가 자식 다이얼로그에 나타났다 해도 부모다이얼로그에 다시 나타날 수 있다.
즉, 포커스가 상호 작용할 수 있다. 자식 다이얼로그에는 종료버튼이 있다.
1. 부모 다이얼로그 모달리스 버튼을 누른다.
나타나는 현상은 모달리스가 나타난다.
2. 모달리스가 있는 상태에서 또 클릭을 한다.(모달리스는 클릭을 많이해도 하나만 나타난다.)
그리고 나서 종료 버튼을 누른다. -> 모달리스창이 사라진다.
사라지고나서 다시 모달리스는 누르면 모달리스가 뜬다.
3. 모달리스 창을본다. 모달리스창에 슬라이더 컨트롤 3개가 있다.
슬라이더 컨트롤은 초기값으로 중앙센터 값을 가지고 있다.
최소값은0 이고 최대값은 255이다.
1개 슬라이더는 R
1개 슬라이더는 G
1개 슬라이더는 B 를 나타낸다.
-> 자식 다이얼로그에서 슬라이더 바를 조정하니 부모다이얼로그 배경색이 조작이 된다.
[진행순서]
1. MFC 애플리케이션: 대화 상자 기반으로 생성
2. IDD_MY0122_2_DIALOG(부모다이얼로그), 0122_2Dlg.cpp, 0122_2Dlg.h 열기
3. 부모 다이얼로그에서 다 지우고 버튼(BUTTON1) 하나 생성

4. 자식 다이얼로그(IDD_DIALOG1) 생성

5. 자식 다이얼로그에서 버튼(BUTTON2) 생성

6. 자식다이얼로그에서 우클릭-> 클래스 추가(CDialog1)

7. 부모 다이얼로그 h로 간다.
// 구현입니다.
protected:
HICON m_hIcon;
// 생성된 메시지 맵 함수
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CDialog1* Dialog1 = NULL; // 포인트 변수 선언
};
CDialog1에서 에러가 발생될텐데 class를 선언하지 않았기 때문이다.
맨위에 class CDialog1;을 선언해주면 된다

8. 부모 다이얼로그로 넘어간다
모달리스 버튼을 클릭하여 OnBnClickedButton1() 함수를 불러온다.

#include "Dialog1.h"
void CMy01222Dlg::OnBnClickedButton1()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
if (Dialog1 == NULL) {
Dialog1 = new CDialog1(); // 객체가 생성되는 코드
Dialog1->Create(IDD_DIALOG1, this);
Dialog1->ShowWindow(SW_SHOW);
}
}

MessageBox(MB_OK); // 버튼이 작동되는지 확인차 메세지박스 생성
#include "Dialog1.h"
void CMy01222Dlg::OnBnClickedButton1()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
MessageBox(MB_OK);
if (Dialog1 == NULL) {
Dialog1 = new CDialog1(); // 객체가 생성되는 코드
Dialog1->Create(IDD_DIALOG1, this);
Dialog1->ShowWindow(SW_SHOW);
}
}

// 다음으로 해야될 것, 예약 : 생성된 모달리스 위치 설정
9. 자식 다이얼로그로 가서 종료버튼 함수 생성

void CDialog1::OnBnClickedButton2() // 종료버튼
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
MessageBox(L"1", MB_OK); // 메세지 확인을 위해 작성
DestroyWindow(); // 모달리스에서는 DestroyWindow() 함수를 이용하여 창을 파괴시킨다.
}

10. 자식 다이얼로그 상에서 우클릭->클래스마법사->가상함수 PostNcDestroy 생성을 한다.

void CDialog1::PostNcDestroy()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
MessageBox(L"2", MB_OK);
CDialogEx::PostNcDestroy();
}

11. 부모다이얼로그 클래스를 자식 다이얼로그에서 사용하려면 this 구문
0122_2Dlg.cpp로 가서 this 입력

12. Dialog.cpp로 넘어가서
멤버 변수를 만들었고 pParent로 받으면 된다.
내 변수안에 들어있는 pParent를 스고 싶다면 this를 사용한다.

pParent 변수를 선언을 하기 위해서 헤더파일로 간다.

Cmy012222Dlg가 에러가 뜨면 맨위 class로 선언을 해주면 된다.

자식다이얼로그로 돌아가서 보면 아래와 같이 에러가뜬다

아래와 같이코드를 작성 해주면 된다.
// CDialog1 대화 상자
IMPLEMENT_DYNAMIC(CDialog1, CDialogEx)
CDialog1::CDialog1(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_DIALOG1, pParent)
{
Dialog1.cpp에서 아래와 같이 에러가 뜬다.

클래스안에서 남의 클래스를 사용할 때는 include를 걸어줘야한다.

에러가 사라졌다.

delete this; // 현재 객체가 사라진다.
void CDialog1::PostNcDestroy()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
MessageBox(L"2", MB_OK);
pParent->Dialog1 = NULL;
delete this;
CDialogEx::PostNcDestroy();
}
종료 버튼을 누르면 1이뜨고 다음 2가 뜨고 종료가 되고 다시 반복할 수 있다.

13. 자식 다이얼로그창에서 우클릭->클래스 마법사 시작(메세지->WM_CLOSE 생성)

void CDialog1::OnClose()
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CDialogEx::OnClose();
MessageBox(L"3", MB_OK);
DestroyWindow(); // onClose 보다 DestoyWindow가 먼저 들어가야한다.
}
x를 눌러주면 3이 출력된다. 그리고 2가 출력되고 종료된다.
![]() | ![]() |
14. 부모 다이얼로그에서 버튼 하나를 더 만들어준다.
void CMy01222Dlg::OnBnClickedButton2()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
SetBackgroundColor(RGB(0, 0, 0));
// 버튼2를 클릭하면 화면이 검은색으로 변한다.
}
15. 자식다이얼로그로 가서 Slider control을 생성한다.
Slider control을 우클릭-> 메세지-> WM_HSCROLL -> OnHScroll 처리기추가
pParent는 부모 다이얼로그 윈도우를 뜻하므로 SetBackgroundColor를 쓰면 된다.
void CDialog1::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
pParent->SetBackgroundColor(RGB(0, 0, 150));
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
![]() | ![]() |
16. 자식 다이얼로그에서 우클릭-> 클래스 마법사 시작-> 가상함수(OnInitDialog 함수추가)
BOOL CDialog1::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
((CSliderCtrl*)GetDlgItem(IDC_SLIDER1))->SetRange(0, 255, true);
((CSliderCtrl*)GetDlgItem(IDC_SLIDER1))->SetPos(128);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CDialog1::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
if (nSBCode == SB_ENDSCROLL) {
return;
}
//switch() 구문 써도 되고 안써도 되고
pParent->SetBackgroundColor(RGB(nPos, 0, 0));
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

'Education > Edu | .net' 카테고리의 다른 글
# 16) [C/C++] 알고리즘1 (0) | 2021.01.26 |
---|---|
# 15) [C/C++] 퀵 정렬(quick sort) 알고리즘 (0) | 2021.01.25 |
# 14.1) [MFC] 시작하기6 (0) | 2021.01.22 |
# 13) [MFC] 다이얼로그 간 데이터 교환, 통신 (0) | 2021.01.22 |
# 12.2) [C/C++] c++ 연산자 재정의 (0) | 2021.01.20 |