자동
         
H O W S P A C E
최근게시물  |  마음가는대로  |  클럽
빈터
즐사이트
참고자료
일정관리
가계부
프로젝트
   
  [일반 > ] [mfc]자식 dialog에서 부모 dialog변수 및 함수 참조
  글쓴이 : 빈터     날짜 : 09-07-16 10:28     조회 : 29258    
  트랙백 주소 : http://www.howspace.kr/gbs/bbs/tb.php/gr2_10_data/176

먼저 자식 Dialog의 cpp파일에 부모 클래스의 헤더파일을 include 해줍니다.

#include "ParentDlg.h"

 

!아..저 같은 경우는 바보같은 실수를 해서 헤더파일에 부모 헤더를 include했었습니다..

그럼 오류 날수 있으니 주의해주세요...(부모에서 자식 Dialog 헤더를 include하면 중복이 되며 구문 에러가 납니다..

당연한 이유입니다.. 한번 헤더를 인쿨루드 하고 다시 상대헤더에서 또 헤더를 인클루드 하고...-_-;)

 

그다음 함수든 변수든 실행해주면 땡입니다

변수의 경우는

((CParentDlg *)GetParent())->m_flag = TRUE;

 

함수의 경우는

((CParentDlg *)GetParent())->TempFunction(filename); //TempFunction이란 함수에 filename 파라메터를 넣어 호출한것입니다.

[출처] 대화상자(Dialog)에서 부모 Dialog의 함수 및 변수 조작|작성자 메모리얼

 

질문자 인사 감사합니다~ 많은도움되었어요~~~

1. 대화상자가 뜨기 전에 값을 넘겨줘야합니다..
즉,
CTestDlg mDlg;
mDlg.DoModal();
 
이렇게 하면 그냥 대화상자가 떠버리는데..
 
 
CTestDlg mDlg;
mDlg.m_iValue = 5;
mDlg.m_lValue = 481231273;
mDlg.m_strValue = "Test";
mDlg.DoModal();
 
이런 방식으로 대화상자 클래스 멤버 변수에 값을 세팅한 후
대화상자를 띠우면 됩니다..
 
2. 받는 것도 마찬가지죠..
OK 버튼을 눌렀을때..
 
void CTestDlg::OnOK()
{
m_iValue = 15;
m_lValue = 4231273;
m_strValue = "Test End";

 CDialog::OnOK();
}
이렇게 값을 주고..
 
 
대화상자 띠운 곳에서 받으면 됩니다..
 
if( IDOK == mDlg.DoModal() ){
i = mDlg.m_iValue;
l = mDlg.m_lValue;
str = mDlg.m_strValue;
}
 
이렇게..

 


빈터   09-10-28 17:08
우선, 어떻게 프로그래밍을 하려구 하는지...

 

만약, 메인창과 모달창 간의 값전달이

- 메인창 -> 모달창 값 전달 : 모달창 뜰때만 전달

- 모달창 -> 메인창 값 전달 : 모달창이 종료될때만 전달

와 같다면 앞선 답변처럼 하면 될 것 같습니다.

 

그렇지 않고 수시로 전달되길 원한다면, 아래와 같은 방법은 어떨런지....

 

메인창 : CMainDlg

모달창 : CModalDlg

 

1. CMainDlg의 멤버변수로 CModalDlg를 가지고 있음

CModalDlg에 함수 추가하여 호출(예를 들면, void ProcessMsg(CString strMsg))

 

2. CModalDlg의 멤버변수에 CMainDlg의 포인터를 가지고 있음

(솔직히 저는 이런 방식보다는 CMainDlg의 핸들에 메시지를 보내는 방식을 사용하지만, 그건 설명이 조금 복잡한 것 같아서...)

CMainDlg에 함수 추가하여 호출

 

이해되시나요?

 

이때 주의할 점은 CMainDlg 헤더 파일과 CModalDlg 헤더파일에서 상호 참조하지 않게 해주어야 하거든요.

 

코드 예

 

// CMainDlg  헤더 파일 시작

...

#include "ModalDlg.h"

 

CModalDlg m_ChildDlg; // CModalDlg 헤더파일 포함

 

void ProcessMsg(CString strMsg);

...

// CMainDlg 헤더 파일 끝

 

// CModalDlg 헤더 파일 시작

...

class CMainDlg;

 

CMainDlg *m_pParentDlg;

 

void ProcessMsg(CString strMsg);

 

// CModalDlg 헤더 파일 끝

 

// CMainDlg 소스 파일 시작

 

m_ChildDlg.m_pParentDlg = this;

m_ChildDlg.DoModal();

 

// CModalDlg에 메시지 보내기

m_ChildDlg.ProcessMsg("test");

 

// CModalDlg에서 온 메시지 처리

void ProcessMsg(CString strMsg)

{

// 처리 코드

}

// CMainDlg 소스 파일 끝

 

// CModalDlg 소스 파일 시작

#include "MainDlg.h" // CMainDlg 헤더파일 포함

 

// CMainDlg에 메시지 보내기

if (m_pParentDlg) // m_pParentDlg 초기화 해줘야 해요...포인터이기에...

{

m_pParentDlg->ProcessMsg("test");

}

 

// CMainDlg에서 온 메시지 처리

void ProcessMsg(CString strMsg)

{

// 처리 코드

}

// CModalDlg 소스 파일 끝

 

이젠 이해가 되시는지...????
   

Copyright ⓒ howspace.co.kr. All rights reserved.

Warning: Unknown: write failed: Disk quota exceeded (122) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (../data/session) in Unknown on line 0