天天看點

MFC不使用資源檔案建立對話框

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