티스토리 뷰


CDialog를 상속받은 CParentDlg가 있을 때 CParentDlg를 상속받은 CChildDlg를 만들어보자~

예제도 있으니 다운 받아도 되고 안받아도 되고..

vs2008에서 컴파일했음.


생각같아선 그냥

class CChildDlg : public CParentDlg
{
   ...
};

해주면 될 것 같은데 이게 끝이 아니다.

우선 부모가될 Parent 다이얼로그에서는 MFC Wizard가 만든 기본 생성자 외에
CParentDlg::CParentDlg(UINT nIDTemplate, CWnd* pParent) 를 추가해야한다.
생성자 내용은

CParentDlg::CParentDlg(UINT nIDTemplate, CWnd* pParent)
    : CDialog(nIDTemplate, pParent)
{

}
이렇게 해준다. 자식이 부모 생성자를 호출 해 줄 때 자신의 IDD(다이얼로그 정보)를 넘겨서 무사히 다이얼로그에 그리기가 되도록 해주기 위한 것이다. 호출 받은 nIDTemplate를 바로 CDialog에 보내준다.
부모는 이쯤 하면 됐고..

이제 자식에선 해줄 것이 많다.
우선 CChildDlg 다이얼로그를 하나 만들고 마법사로 만들면 바로 CParentDlg를 상속받을 수 없기 때문에 우선은 CDialog를 상속받도록 해서 만든다.
그 후 부분 부분 바꿔준다. 뭐 일단 간단히 할려면 CDialog를 모조리 CParentDlg로 치환해주면 되는데.. 바꿔야할 부분을 하나씩 보도록 하자.

1. class CChildDlg : public CParentDlg
너무 당연한 것이다. CParentDlg를 상속 받도록 해줘야겠지.

2. IMPLEMENT_DYNAMIC(CChildDlg, CParentDlg)
이부분은 잘은 모르겠지만 그냥 CRuntimeClass라는 것에 자신의 부모가 CParentDlg라고 알리는 역할이라 한다.

3. CChildDlg::CChildDlg(CWnd* pParent /*=NULL*/)
 : CParentDlg(CChildDlg::IDD, pParent)
{
 
}
생성자에서 CParentDlg를 호출해준다. 자신의 IDD와 pParent를 넘겨주도록 하자.(pParent가 뭔진 잘 모르겠다.)

4. BEGIN_MESSAGE_MAP(CChildDlg, CParentDlg)
메세지 맵이다. 오른쪽에 적은 클래스가 무엇인고 하면..
만약 메세지 맵에 명시되지 않은 메세지가 있을 경우 오른쪽에 적힌 클래스의 메세지를 따라간다는 뜻이다.
예제에서 CParentDlg에는 RBUTTONDOWN 메세지가 있고 CChildDlg에서는 해당 메세지가 없는데, CChildDlg에서 마우스 오른쪽버튼을 클릭할 경우 특별히 명시되지 않았기 때문에 Messege_map에서 정의한 대로 CParentDlg의 메세지를 가져와서 쓴다.

이렇게 크게 네부분 바꿔주면 되겠다~
맨처음에 그냥 1번만 해주면 잘 상속받을거라 쉽게 생각한게 내 오산이었다..
메세지 맵을 상속받지 않더라. 그래서 원래 메세지는 상속이 안되나 -_-? 생각했었는데.. 4번처럼 하니까 메세지 상속이 되더라.
어라 근데.. 자식 다이얼로그에 그려준 컨트롤들이 보이질 않는거다.. 아니.. 부모 다이얼로그의 컨트롤을 따라가는 것이 아닌가?
우째 이런일이? 그래서 시도한 것이 3번이다. CChildDlg::IDD를 상위로 넘겨줘야 자신의 컨트롤을 표시할 수 있다!
2번은.. 걍 써주자.. =_=

그럼 오늘도 수고~

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함