转自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; |