공부 영상 출처: https://youtu.be/Rwu9BI6Jizs?list=PLlIX4lkC1JdMx-vfK8I-J3-L-GL7TbMf9
영상에 있는 소스코드를 다운받아 프로젝트를 현재 깃허브 프로젝트 하단에 넣었다.
모달리스 다이얼로그 추가하기
클래스 마법사 단축키
ctrl + shift + X
클래스 마법사 단축키 [ctrl + shift + X] 혹은
[프로젝트] → [클래스 마법사] 를 클릭하여 클래스 마법사로 들어간다.
[클래스 추가] - [MFC 클래스]를 눌러 클래스를 추가해 준다.
클래스는 다이얼로그 형태로 띄울 것이니 CDialogEx로 선택,
클래스 이름은 CDlgImage로 작성해 주었다. [확인]을 눌러 클래스를 생성한다.
리소스 뷰에 IDD_DLGIMAGE로 생성된 항목이 존재함을 확인할 수 있다.
모달방식으로 실행한 다이얼로그는 제어권을 독점하고 있어 다른 창이 클릭되지 않는다.
헤더파일은 ctrl + K + O 로 헤더부분으로 이동하여 헤더파일에 추가해 준다.
이미지 변수를 생성해준다.
*(asterisk)의 위치는 클래스에 붙이나 띄우나 상관이 없다.
생성한 변수는 initDialog(초기화 되는 부분)에 추가해 준다.
F12로 바로 이동한다.
아래 코드를 초기화 부분에 추가하여 작성해 준다.
// TODO: 여기에 추가 초기화 작업을 추가합니다.
m_pDlgImage = new CDlgImage;
m_pDlgImage->Create(IDD_DLGIMAGE, this);
m_pDlgImage->ShowWindow(SW_SHOW);
그리고 코드를 실행하면 창 두개가 독립적으로 움직이게 할 수 있다.
버튼 누르면 창 뜨게 하기
버튼을 누르면 타는 부분에 이전에 작성한 코드를 주석처리한 후
새로 작성한 변수 m_pDlgImage 변수를 창에 뜨게 하는 코드로 작성해 준다.
m_pDlgImage->ShowWindow(SW_SHOW);
여기서 메모리 릭이 발생하는데, m_pDlgImage를 위에서 생성하고 지워주지 않았기 때문에 발생한다.
Ctrl + Shift + X 를 통해 클래스 마법사에 들어가서, [WM_DESTORY]를 찾아 처리기를 추가해 준다.
그리고 생성된 OnDestroy() 메서드드에서 생성되었던 m_pDlgImage 삭제를 위해
delete m_pDlgImage;
를 작성해 준다.
// 메모리 릭을 막기 위해 생성된 m_pDlgImage을 삭제해 준다.
void CgPrjDlg::OnDestroy()
{
CDialogEx::OnDestroy();
delete m_pDlgImage;
}
IDD_DLGIMAGE 다이얼로그 창에서 버튼을 하나 생성해 주고
ID도 IDC_BTN_UP_PARENT 로 바꿔준 후 캡션을 Parent 로 바꿔줬다.
버튼을 더블클릭해서 클릭시 발생 이벤트 함수로 이동한다.
위에서 m_pDlgImage 를 생성했을 때 this로 부모를 넘겨줬기 때문에
기존의 다이얼로그를 새 다이얼로그의 부모로 가져올 수 있다.
먼저 DlgImage.cpp 파일에서 CWnd* mpParent; 로
부모의 변수를 먼저 선언을 해 주고
this 주소를 m_pParent 로 사용할 수 있도록 한다.
이제 Parent 버튼을 클릭했을 때 타는 함수에서 이를 사용할 것이다.
그 전에, gPrjDlg.h 파일에서 callFuc(int n); 함수를 선언해 주고
이 callFunc에서 데이터를 콘솔창에 찍기 위해 디버그 헤더 파일에 아래와 같이 작성해 준다.
#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")
https://giveme-happyending.tistory.com/211
블로그에 따로 정리해 두었다.
이렇게 작성하게 되면 콘솔창에 n이 출력된다.
#include <iostream>
void CgPrjDlg::callFunc(int n)
{
// int nData = n;
std::cout << n << std::endl; //endl은 줄바꿈
}
DlgImage.cpp 함수로 와서
이렇게 작성하면 100에 1씩 더한 숫자가 콘솔창에 보여지게 된다.
n은 100으로 초기화하고 버튼을 누를 때마다 1씩 증가하게 된다.
#include "gPrjDlg.h"
void CDlgImage::OnBnClickedBtnUpParent()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
static int n = 100;
CgPrjDlg *pDlg = (CgPrjDlg*)m_pParent;
pDlg->callFunc(n++); // 호출한다.
}
이렇게 Parent를 누르면 하나씩 증가하는 모습을 볼 수 있다.
'개발공부 > C++' 카테고리의 다른 글
[C++] MFC 다른 윈도우로 포인트 복제하기 (1) | 2023.09.18 |
---|---|
[C++] MFC 듀얼이미지 다이얼로그 (0) | 2023.09.18 |
[C++] MFC Bitmap Image로 버튼 만들기, 클릭시 이미지 전환 (1) | 2023.09.17 |
[C++] MFC CImage 이미지 생성, 저장, 로드, 움직이는 사각형 만들기 (0) | 2023.09.17 |
[C++] MFC 버튼 생성, 에딧컨트롤 생성, 이벤트 연결, 계산기 만들기 (1) | 2023.09.16 |