不使用对话框资源模版创建对话框

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

public:
 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
 *pTemp++=0;

 // caption
 wcscpy((WCHAR*)pTemp,strCaption);
 pTemp += strCaption.GetLength()+1;

 // font

 return pDlgTemp;
}

// 例子


class CMyDlg: public CDialog
{
public:
 CMyDlg();
 ~CMyDlg();

public:
 BOOL CreateModeDlg(CString strCaption,CRect rect,BOOL bMode=TRUE,CWnd* pParent=NULL);

private:
 CDlgTemplate m_dlgTemp;
 CEdit m_ctrlEdit;

private:
 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())
{

}

非模式
CMyDlg dlg;
CString result;
if(dlg.CreateModeDlg(_T("123"),CRect(0,0,100,100),FALSE,this))
{
 dlg.ShowWindow(SW_SHOW);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC对话框创建和显示可以通过以下步骤实现:首先,在Visual Studio中创建一个MFC应用程序,然后在资源视图中添加一个对话框资源。接下来,在类向导中添加一个对话框类,并将其关联到对话框资源。最后,在应用程序的初始化函数中创建对话框类的实例,并调用DoModal函数显示对话框。 ### 回答2: MFC(Microsoft Foundation Classes)是为了简化Windows应用程序的开发而提供的一种C++类库。对话框则是MFC中一种常用的用户界面元素,用于显示和接收用户的输入。 MFC对话框创建和显示通常需要以下步骤: 1. 在Visual Studio中创建一个新的MFC应用程序项目。 2. 在资源视图中打开资源文件夹,找到对话框文件夹,并双击打开对话框资源编辑器。 3. 在对话框资源编辑器中设计和布局你的对话框,可以添加按钮、文本框、复选框等控件,并设置其属性和事件处理程序。 4. 回到资源视图,双击IDD_DIALOG1资源,将对话框类关联到对话框资源上。 5. 在应用程序的代码中创建对话框对象,并通过DoModal()函数显示对话框,如下所示: ``` CMyDialog dlg; dlg.DoModal(); ``` 6. 通过DoModal()函数,对话框将以模态对话框的形式显示在屏幕上,此时用户无法与其他窗口进行交互,只能与对话框进行交互。 7. 用户与对话框进行交互,例如输入文本、点击按钮等操作。 8. 当用户关闭对话框或执行其他关闭对话框的操作时,对话框将自动销毁,并返回到应用程序的代码继续执行。 总之,通过使用MFC框架,使用对话框资源编辑器设计对话框布局,创建对话框对象并通过DoModal()函数显示对话框,可以方便地创建和显示MFC对话框。 ### 回答3: MFC对话框创建和显示是指在Microsoft Foundation Classes (MFC)中创建和显示对话框界面的过程。 首先,我们需要在MFC应用程序中添加一个对话框资源对话框资源是一个可视化的窗口模板,您可以使用资源编辑器来创建和设计它。在资源编辑器中,您可以添加控件,定义布局和设置属性等。保存并关闭资源编辑器后,对话框资源将被添加到您的项目中。 接下来,您需要在代码中创建对话框类的实例。您可以通过在代码中调用CDialog类的派生类的构造函数来创建对话框对象。这个派生类是由资源编辑器自动生成的,它包含了与对话框相关的方法和属性。 一旦您创建对话框对象,您可以使用DoModal()方法来显示对话框。这个方法会将控制权从父窗口转移到对话框,并且会阻塞当前线程,直到对话框关闭。在DoModal()方法返回之后,您可以根据用户的操作结果来执行相应的逻辑。 另一种显示对话框的方法是使用Create()方法。通过调用该方法,您可以将对话框作为模态或非模态的方式显示。非模态对话框允许用户在对话框和其他窗口之间切换,而模态对话框则阻塞了父窗口的输入。 通过在对话框类中添加处理响应用户操作的函数,您可以在对话框中添加交互式功能。您可以在这些函数中处理按钮点击、文本框输入、列表选择等用户操作,并根据需要执行相应的操作。 总之,MFC对话框创建和显示需要先添加对话框资源,然后在代码中创建对话框类的实例,并使用DoModal()或Create()方法来显示对话框。此外,您还可以通过添加处理功能的函数来实现与用户的交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值