MFC不使用资源文件创建对话框

本文介绍如何在MFC中不使用传统的资源文件,而是通过编程方式来创建和管理对话框。这种方法适用于没有资源编辑器或者需要动态生成对话框的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值