SW/MFC

다이알로그(클래스) 생성(Create, DoModal) / 상호 데이터 전달 / 부모 자식

또난 2021. 3. 27. 15:20

다이알로그 생성 방법 및  차이

  다이얼로그 추가하고 해당 클래스 생성.

 

 1. DoModal 방식

  - 생성방법 : 해당 다이얼로그 클래스 include 하고 생성후 Domodal() 호출.

CSetCalDlg  Dlg;  // 다이알 로그에 pubic 설정 변수 추가후. 실행전 데이터 복사.
    memcpy(&Dlg.setParam, &pMainFrame->m_setDev, sizeof(Dlg.setParam));
    int ret = Dlg.DoModal();
    
    if (IDOK == ret) {  // 다이알로그 ok 버튼시 데이터 복사. 
       memcpy(&pMainFrame->m_setDev, &Dlg.setParam, sizeof(Dlg.setParam));
       d_msgl("Dmm %d Can %d Jig %d", pMainFrame->m_setDev.dmmUsbNum, pMainFrame->m_setDev.CanPort, pMainFrame->m_setDev.JigPort );
    }
    else if (IDCANCEL == ret) {
        
    }
    else {
        
    }
    

// 해당 다아알로그 ok 이벤트 처리..
void CSetCalDlg::OnBnClickedOk()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CString str;	
	setParam.JigPort = GetDlgItemInt(IDC_JIGPORT_EDIT);	
	setParam.CanPort = GetDlgItemInt(IDC_CANPORT_EDIT);	
	setParam.dmmUsbNum = GetDlgItemInt(IDC_DMM1_EDIT);
		
	GetDlgItemText(IDC_EDIT_SUNT, str);
	setParam.suntRes = atof(str);  // 문자열을 float 으로	
	CDialog::OnOK();
}

 - 다이알로그 창 실행하면, 메인창으로 제어 불가이므로 메인창에 각 세팅값 설정하는 용도로 사용 적당.

 

 

 

 2. Create 방식 

  - 생성 방법 : 전역 포인터변수 설정후 OnInitDialog 에서 생성.

#include "ChartDialog.h"
ChartDialog *pChartDlg;

BOOL CDisChgTesterDlg::OnInitDialog()
{
  CDialogEx::OnInitDialog();
    
  pChartDlg = new ChartDialog(this);	// this 는 부모클래스 전달받기 위해.
  pChartDlg->Create(IDD_CHART_DIALOG);        
  pChartDlg->ShowWindow(SW_SHOW);   // 실행.   
  pChartDlg->DestroyWindow();     // 종료.
  pChartDlg = NULL;
}

  -창 실행되면 메인창과 함께 제어 가능. 여러 상호 제어 하기 적당...그래프 출력.

 

 

  - 메인 다이알로그 종료시 삭제 해야 함.

 

//PostNcDestroy() 가상함수 추가후
void CDisChgTesterDlg::PostNcDestroy()  // 메인에서 처리
{
	if (pChartDlg)
	{
		pChartDlg->DestroyWindow();
		delete pChartDlg;
		pChartDlg = NULL;
	}
	CDialogEx::PostNcDestroy();
}

void ChartDialog::PostNcDestroy()  //해당다이알로그에서 처리.
{
	delete this;
	ChartDialog::PostNcDestroy();
}

 

다이알로그 사이 데이터 전달...공유

Create 방식

DischgTeserDlg.cpp (메인) 수정.

/////  DisChgTesterDlg.cpp: 구현 파일  ///////

#include "ChartDialog.h"	//자식 헤더추가
ChartDialog *pChartDlg;		// 자식 전역 변수 추가

BOOL CDisChgTesterDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();	

	// 자식 생성.. this로 부모 클래스 전달 받음.
	pChartDlg = new ChartDialog(this);	
	pChartDlg->Create(IDD_CHART_DIALOG);	
	//...
    
 }
 ////////////////////////////////////
 
 ////// ChartDialog.cpp: 구현 파일   ///////
  
#include "DisChgTesterDlg.h"
CDisChgTesterDlg* pTesterDlg;

ChartDialog::ChartDialog(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_CHART_DIALOG, pParent)
{
	pTesterDlg = (CDisChgTesterDlg*)pParent;  // 부모 클래스 받음.
}

void ChartDialog::OnBnClickedChtBtnT1()
{
	static int cnt = 0;
	CString gettemp, gettemp2, temp;    
	temp.Format(_T("%d"), cnt++);
	pTesterDlg->m_EditCsvName2.SetWindowTextA(temp);	// 1. 전역변수로 접근.
	
    // 2. 지역 변수로 접근
    CDisChgTesterDlg* pDlg = (CDisChgTesterDlg*)AfxGetMainWnd();	
	pDlg->m_EditCsvName2.GetWindowTextA(gettemp);    
	((CDisChgTesterDlg*)GetParent())->m_EditCsvName2.GetWindowTextA(gettemp2);
	d_msg("get pDlg->m_EditCsvName2: %s %s\n",gettemp, gettemp2);
}



 
///////////////////////////////
 
 // 부모에서 자식으로 데이터 전달 방법
 // send 메세지 전달
CString strTimer;
static long msgHead[2] = { 0 };
msgHead[0]++;
GetDlgItem(IDC_STATIC_CON)->SetWindowText(GetTimeStamp(3));		
::SendMessageA(pChartDlg->GetSafeHwnd(), WM_USER_CHART_SEND_MSG, (WPARAM)msgHead, NULL);
// 자식창 열려 있을 경우만 전달
if(pChartDlg != NULL && pChartDlg->IsWindowVisible() == true) 	
   pChartDlg->UpdateChartInfo(GetTimeStamp(3));	// public 타입 바로 접근
   
   
void ChartDialog::UpdateChartInfo(CString data)  // 자식 public 함수
{	
	d_msg("UpdateChartInfo ==> %s\n", data);
	rcvData = data;
	//PostMessageA(WM_USER_CAN_RCV_ALL_MSG, (WPARAM)msgHead, (LPARAM)msgData);
	GetDlgItem(IDC_STATIC_CHART_INFO)->SetWindowText(data);	
	SetChartInfo();
}