轉自MFC不使用對話框資源模版建立對話框
#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;
};
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();
}
使用:
CMyDlg dlg;
if(dlg.DoModal()==IDCANCEL)
return;