在MFC程式中使用對話框時首先在資源模版裡建立對話框資源,然後DoModal()或者CReate顯示出模式對話框或者非模式對話框,這樣建立出的對話框移植性差,從一個工程移動到另一個工程比較麻煩。
在MFC中還有另一種建立對話框的方法:
1 在記憶體中建立對話框資源模版DLGTEMPLATE結構體。
2 使用InitModalIndirect API函數即可建立模式對話框,非模式對話框使用CreateDialog API函數建立。
代碼如下:
// 建立記憶體對話框資源模版類,H檔案
#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;
DLGTEMPLATE* CreateTemplate(DWORD dwStyle,CRect& rect,CString strCaption,DWORD dwStyleEx=0);
};
// CPP檔案
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
// caption
wcscpy((WCHAR*)pTemp,strCaption);
pTemp += strCaption.GetLength()+1;
// font
return pDlgTemp;
// 例子
class CMyDlg: public CDialog
CMyDlg();
~CMyDlg();
BOOL CreateModeDlg(CString strCaption,CRect rect,BOOL bMode=TRUE,CWnd* pParent=NULL);
CDlgTemplate m_dlgTemp;
CEdit m_ctrlEdit;
HICON m_hIcon;
enum { IDICON=1 };
virtual BOOL OnInitDialog();
virtual void OnOK();
virtual void DoDataExchange(CDataExchange* pDX);
CMyDlg::CMyDlg()
m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_APPLICATION);
CMyDlg::~CMyDlg()
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); // 設定小圖示
// 建立編輯框
CRect rect(0,0,50,20);
if (!m_ctrlEdit.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,rect,this,2))
return FALSE;
return TRUE;
void CMyDlg::OnOK()
CDialog::OnOK();
useage
模式
CMyDlg dlg;
CString result;
dlg.CreateModeDlg(_T("123"),CRect(0,0,100,100),this);
if (IDOK==dlg.DoModal())
非模式
if(dlg.CreateModeDlg(_T("123"),CRect(0,0,100,100),FALSE,this))
dlg.ShowWindow(SW_SHOW);