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

简介: 在MFC程序中使用对话框时首先在资源模版里创建对话框资源,然后DoModal()或者CReate显示出模式对话框或者非模式对话框,这样创建出的对话框移植性差,从一个工程移动到另一个工程比较麻烦。     在MFC中还有另一种创建对话框的方法:1 在内存中建立对话框资源模版DLGTEMPLATE结构体。
在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);
}

目录
相关文章
|
机器学习/深度学习 数据可视化 PyTorch
【PyTorch】TensorBoard基本使用
【PyTorch】TensorBoard基本使用
815 0
|
6月前
|
前端开发 网络架构
如何在React Router中传递参数?
如何在React Router中传递参数?
253 57
|
9月前
|
人工智能 API 数据库
Qwen-Agent功能调用实践探索
本文详细解析了Qwen-Agent的核心功能——功能调用,涵盖其定义、工作流程、重要性和实际应用,通过实例展示了如何在Qwen-Agent中利用此功能与外部工具和API互动,扩展AI应用范围。
|
11月前
|
SQL 存储 关系型数据库
MySQL能否查询某张表的操作记录
MySQL能否查询某张表的操作记录
1817 1
|
11月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
147 0
|
存储 开发框架 前端开发
基于SqlSugar的开发框架循序渐进介绍(9)-- 结合Winform控件实现字段的权限控制
基于SqlSugar的开发框架循序渐进介绍(9)-- 结合Winform控件实现字段的权限控制
|
编译器 定位技术 C++
查看Visual Studio软件_MSC_VER值(MSVC编译器版本)的方法
查看Visual Studio软件_MSC_VER值(MSVC编译器版本)的方法
519 1
|
缓存 算法 编译器
【C/C++ 泡沫精选面试题01】提高c++性能,你用过哪些方式去提升?
【C/C++ 泡沫精选面试题01】提高c++性能,你用过哪些方式去提升?
265 1
|
消息中间件 Java Maven
springboot整合rocketmq,快速上手消息队列
这里提前下载好rocketmq的源码并运行,个人比较推荐去github直接clone代码,然后idea导入并运行,好处就是可以学习源码,并且支持debug调试,github地址如下,因为官方有教程,这里就直接跳过安装。
10881 1
|
编解码 缓存 移动开发
一文读懂云渲染“串流”全链路时延及优化策略
这是一个让云游戏完美起步的时代。
2218 0
一文读懂云渲染“串流”全链路时延及优化策略