2009. 1. 18. 23:59

1>d:\vc2005\mfcexam\modaless\modaless\modalessdlg.h(34) : error C2143: 구문 오류 : ';'이(가) '*' 앞에 없습니다.
1>d:\vc2005\mfcexam\modaless\modaless\modalessdlg.h(34) : error C4430: 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다.
1>d:\vc2005\mfcexam\modaless\modaless\modalessdlg.h(34) : error C4430: 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다.



이러한 에러가 발생하였다.
이것은 서로 다른 클래스가 서로를 참조하고 있을때 발생한다.
따라서 이런경우 해결책은 '전방참조'라고 하는 방법을 사용한다.

어느 한쪽의 클래스 선언문 위에 다른 클래스의 이름을 적어준다.


// ModalessDlg.h : 헤더 파일
//

#pragma once
#include "childdlg.h"

class CChildDlg; // 전방참조

// CModalessDlg 대화 상자
class CModalessDlg : public CDialog
{
// 생성입니다.
public:
 CModalessDlg(CWnd* pParent = NULL); // 표준 생성자입니다.

// 대화 상자 데이터입니다.
 enum { IDD = IDD_MODALESS_DIALOG };

 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.


// 구현입니다.
protected:
 HICON m_hIcon;

 // 생성된 메시지 맵 함수
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 DECLARE_MESSAGE_MAP()
public:
 CChildDlg *m_pDlg;
public:
 afx_msg void OnBnClickedShowDialog();
};

Posted by +깡통+
부모창의 클래스 선언부에서 아래와 같이 포인트 변수를 추가해야한다.
public:
 CChildDlg *m_pDlg;

어떠한 버튼을 클릭하면 모달리스 창을 띄우는데..
주의할것은 NULL 체크를 하지 않으면 새로운 창이 여러개 생긴다는 것이다.


void CModalessDlg::OnBnClickedShowDialog()
{
 // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 if(m_pDlg != NULL)
  m_pDlg->SetFocus();
 else {
  m_pDlg = new CChildDlg;
  m_pDlg->Create(IDD_CHILD_DIALOG);
  m_pDlg->ShowWindow(SW_SHOW);
 }
}

이렇게 하면.. 생성은 된다.
하지만 모달리스는 힙에 생성되기 때문에 메모리에서 소멸을 시켜주지 않으면 메모리 누수가 발생한다.
따라서 아래의 코드가 필수적이다.

void CChildDlg::OnBnClickedExit()
{
 // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 DestroyWindow();
}

이렇게하면 모달리스로 생성된 자식창은 한번은 닫기지만 두번째 생성은 불가능하다.
이미 부모창에서 생성시킨 포인터 변수를 초기화 못했기 때문이다.
그럼 또 아래와 같은 코드가 필요하다.

void CChildDlg::PostNcDestroy()
{
 // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
 CDialog::PostNcDestroy();
 
 CModalessDlg *pMainWnd = (CModalessDlg *)AfxGetMainWnd();
 pMainWnd->m_pDlg = NULL;
 delete this; 
}


부모창을 호출해서 m_pDlg 를 초기화 하고.  자신을 delete 시켜준다.
만약 CModalessDlg 를 참조하기 위해 부모헤더 참조하였다면 에러가 발생할수 있다.
그러면 '전방참조' 라는 글을 참조하기 바란다.
Posted by +깡통+
어느덧 비주얼 베이직을 접한지 10년이 흘렀다.
만 10년인데..  강산은 아직 그대로인듯 ^^ ㅋㅋ

10년전에 나는 10년의 계획을 세웠고..
그 계획에 따라 지난 10년을 나름 알차게 보냈다.

앞으로 다가올 10년에는 어떤 일들이 일어날까? 훗..
비주얼 베이직 5.0 시절부터 6.0 까지 그리고 지금은 비베닷넷 까지 발전했다.
나는 6.0까지만 공부했다. 그 이상을 필요로 하지 않았기 때문이고 아직 6.0 기술로 밥먹고 사는데 문제없다.
하지만 이제는 변해야 한다. 언제까지나 6.0 에 안주해서도 안주 할 수도 없다.
IT 업계 그리고 프로그래머는 끊임없이 공부하고 연마해야 한다.
게을러 지는순간 도태되고 말것이다.

많이 늦었지만 작년 말부터 MFC를 줄기차게 공부하고 있다.
남들은 닷넷이니 C# 이니 하지만..
아직 개발범위에서 MFC는 막대한 비중을 차지하고 있다.
적어도 향후 10년은 끄떡없다.

뭐 -_- 주저리 주저리 떠벌이기만 하는군.
이렇게 내 생각을 막 적어두는 곳이 블로그 아닌가? ^^ 하하하하.

앞으로의 10년에 나는...
하드웨어와 소프트웨어를 넘나드는 중간 통역자? 수준의 엔지니어가 되고 싶다.
예컨데 두 분야를 동시네 넘나드는 인물은 아직 못봤다.
하드웨어 전문가는 분명 소프트웨어에 약하고
소프트웨어 전문가는 분명 하드웨어에 약하더라.

그런 입장에서 나 같은놈은 서로의 의견을 전달해주는 통역자가 될 수 있으리라 본다.

주절주절 -_-;;  계속 공부해야겠다.
킁!
Posted by +깡통+