CDialog 를 Create() 할때 다이얼로그 아이디를 lpszTemplateName 로 변환할때.
MFC&ActiveX 2007. 12. 17. 00:32 |CDialog를 서브클래싱 해서 다른 컨트롤에 적용할려고 할때 보통 Create를 오버라이드 해서 사용하게 되는데 이때 보면 Create의 원형은 아래와 같습니다.
BOOL CGDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
{
return CDialog::Create(lpszTemplateName, pParentWnd);
}
하지만 여기서 보면 Dialog 니까. Dialog의 아이디를 넣으면 되겠지 하지만 이건 int 형을 LPCTSTR형으로 바꿀수 없다는 에러만 발생하게 됩니다. (솔직히 TemplateName라는게 어떤건지 잘 모르겠습니다.
하지만 우리가 알고 있는 Dialog의 아이디 값을 LPCTSTR형으로 바꾸어 주는 함수를 사용하면 됩니다.
보통 다른 컨트롤에서 생성하기 때문에 Create를 하나더 만듭니다.
왜냐하면 굳이 아이디 값을 노출하거나 더 적어줄 필요가 없으니 아래와 같이 함수를 만들면 될듯합니다.
BOOL CGDialog::Create(CWnd* pParentWnd)
{
return Create(MAKEINTRESOURCE(IDD_GDIALOG), pParentWnd);
}
여기서 보는바와 같이 MAKEINTRESOURCE 라는 디파인 문을 사용하면 LPCTSTR형태로 변환해 주면 가능합니다.
위의 함수를 다른 컨트롤 쪽에서 아래와 같이 사용하면 해당 컨트롤에 추가해서 사용할 수 있습니다.
m_Dialog.Create(this);
m_Dialog.ShowWindow(SW_SHOW);
m_Dialog.MoveWindow(CRect(200, 200, 400, 400));
[팁]
다이얼로그의 스타일이 3가지가 있는데요. Overlapped, PopUp, Child 형태가 있습니다.
Overlapped, PopUp 형태로 하게 되면 컨트롤에 추가 되지만 컨트롤 안에 종속되지는 않네요. 밖으로 이동이 가능하게 되는데요 꼭, 모달 다이얼로그와 비슷한 형태인듯 합니다.
그리고 Child 형태로 하게 되면 컨트롤 내부에서만 동작을 하게 되네요.
이때 타이틀바가 나오거나 안나오거나 상관 없이 동작하게 됩니다.