소연의_개발일지
article thumbnail

공부 영상 출처: 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

블로그에 따로 정리해 두었다.

 

[C++] MFC 콘솔창 띄우기, 특정 변수의 값 콘솔창 출력

콘솔창 띄우기 디버그 헤더 파일에 #pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console") 을 작성해 주면 된다. 이렇게 작성해 주자 #ifdef _DEBUG #define new DEBUG_NEW #pragma comment(linker, "/entry:WinMainCRTStar

giveme-happyending.tistory.com

 

이렇게 작성하게 되면 콘솔창에 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를 누르면 하나씩 증가하는 모습을 볼 수 있다.

 

 

 

 

 

 

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!