MFC不使用资源文件创建对话框


转自MFC不使用对话框资源模版创建对话框

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
32
33
34
35
36
37
38
39
#pragma once
#define DLG_TEMPLATE_BUFFER_MAX_LENGT 1024

class CDlgTemplate
{<!-- -->
public:
 CDlgTemplate(int nBufferLength=DLG_TEMPLATE_BUFFER_MAX_LENGT);
 ~CDlgTemplate();

private:
 WORD* m_pBuffer;

public:
 DLGTEMPLATE* CreateTemplate(DWORD dwStyle,CRect& rect,CString strCaption,DWORD dwStyleEx=0);
};

class CMyDlg: public CDialogEx
{<!-- -->
enum {<!-- --> IDICON=1,IDTREE=2,IDBTNOK=3,IDBTNCANCEL=4 };  
public:
 CMyDlg();
 ~CMyDlg();

public:
 BOOL CreateModeDlg(CString strCaption=_T("对话框"),CRect rect=CRect(0,0,180,300),BOOL bMode=TRUE,CWnd* pParent=NULL);
 
private:
 DECLARE_MESSAGE_MAP()
 virtual BOOL OnInitDialog();
 virtual void DoDataExchange(CDataExchange* pDX);
 afx_msg void OnButtonOk();
 afx_msg void OnButtonCancel();
 private:
 HICON  m_hIcon;
 CDlgTemplate m_dlgTemp;
 CTreeCtrl m_tree;
 CBUTTON m_ok;
 CBUTTON m_cancel;
};
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
CDlgTemplate::CDlgTemplate(int nBufferLength)
{<!-- -->
 m_pBuffer=new WORD[nBufferLength];
 if ((!m_pBuffer)||(DLG_TEMPLATE_BUFFER_MAX_LENGT>nBufferLength))
 {<!-- -->
  exit(0);
 }
}

CDlgTemplate::~CDlgTemplate()
{<!-- -->
 if (m_pBuffer)
 {<!-- -->
  delete m_pBuffer;
  m_pBuffer=NULL;
 }
}


DLGTEMPLATE* CDlgTemplate::CreateTemplate(DWORD dwStyle,CRect& rect,
             CString strCaption,DWORD dwStyleEx)
{<!-- -->
 WORD* pTemp=m_pBuffer;
 DLGTEMPLATE* pDlgTemp=(DLGTEMPLATE*)pTemp;

 // 对话框模版
 pDlgTemp->style = dwStyle;
 pDlgTemp->dwExtendedStyle = dwStyleEx;
 pDlgTemp->cdit = 0;

 pDlgTemp->cx=rect.Width();
 pDlgTemp->cy=rect.Height();
 pDlgTemp->x=(short)rect.left;
 pDlgTemp->y=(short)rect.top;
 pTemp=(WORD*)(pDlgTemp+1);

 // 菜单
 *pTemp++=0;
 // class
 *pTemp++=0;
 // caption
 CStringW wstrCaption = CT2CW(strCaption);
 wcscpy((WCHAR*)pTemp,wstrCaption);
 pTemp += strCaption.GetLength()+1;
 return pDlgTemp;
}

CMyDlg::CMyDlg()
{<!-- -->
 m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_APPLICATION);
 //可以在构造里调用,也可以用类实例调用
 CreateModelDlg();
}

CMyDlg::~CMyDlg()
{<!-- -->
}

BEGIN_MESSAGE_MAP(CSendDlg,CDialogEx)
    ON_WM_CREATE()
    ON_BN_CLICKED(IDBTNOK,OnButtonOK)
   ON_BN_CLICKED(IDBTNCANCEL,OnButtonCancel)
END_MESSAGE_MAP()
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{<!-- -->
}

BOOL CMyDlg::CreateModeDlg(CString strCaption,CRect rect,BOOL bMode,CWnd* pParent)
{<!-- -->
 BOOL bResult=FALSE;
 DLGTEMPLATE* pTemp = NULL;

 pTemp=m_dlgTemp.CreateTemplate(WS_POPUPWINDOW|DS_MODALFRAME|WS_CAPTION,rect,strCaption);
 if (bMode)//创建模态对话框
 {<!-- -->
  bResult=InitModalIndirect(pTemp, pParent);
 }
 else//创建非模态对话框
 {<!-- -->
  bResult=CreateIndirect(pTemp, pParent);
 }

 return bResult;
}

BOOL CMyDlg::OnInitDialog()
{<!-- -->
 CDialog::OnInitDialog();

 if (m_hIcon)
 {<!-- -->
  SetIcon(m_hIcon, TRUE);   // 设置大图标
  SetIcon(m_hIcon, FALSE);  // 设置小图标
 }

 // 创建控件
 CFont *font = GetFont();
 CRect rect;
 GetClientRect(&rect);
 if(!m_tree.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(rect.left+20,rect.top+10,rect.right-20,rect.bottom-50),this,IDTREE))
 {<!-- -->
  return FALSE;
 }
m_tree.ModifyStyle(0,TVS_CHECKBOXES);//树结构开启选择框
if(!m_ok.Create(_T("确定",WS_CHILD|WS_VISIBLE,CRect(rext.left+30,rext.bottom-35,rect.left+100,rect.bottom-10),this,IDBTNOK))
{<!-- -->
    return FALSE;
}
if(!m_cancel.Create(_T("取消"),WS_CHILD|WS_VISIBLE,CRect(rect.right-100,rect.bottom-35,rect.right-30,rext.bottom-10),this,IDBTNCANCEL))
{<!-- -->
    return FALSE;
}
if(font)
{<!-- -->
    m_ok.setFont(font);
    m_cancel.setFont(font);
}
 return TRUE;
}

void CMyDlg::OnButtonOk()
{<!-- -->
    CDialogEx::OnOK();
}
void CMyDlg::OnButtonCancel()
{<!-- -->
    CDialogEx::OnCancel();
}

使用:

1
2
3
CMyDlg dlg;
if(dlg.DoModal()==IDCANCEL)
    return;