天天看點

MFC不使用對話框資源模版建立對話框

在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);

繼續閱讀