다이알로그 생성 방법 및 차이
다이얼로그 추가하고 해당 클래스 생성.
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();
}
'SW > MFC' 카테고리의 다른 글
[MFC] 단축키 설정. (0) | 2021.10.25 |
---|---|
구조체 memset 시 에러 발생 (0) | 2021.05.06 |
비 정적 멤버 호출하는 방법. (this 사용) (0) | 2021.03.29 |
DLL 포함 exe 배포 vs2019 (0) | 2021.03.23 |
RS-232 Serial Test 프로그램 시리얼 테스트 그래프 UART (9) | 2014.02.05 |