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;
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);
}
MFC不使用对话框资源模版创建对话框的更多相关文章
- VS2010/MFC对话框三:创建对话框类和添加控件变量
创建对话框类和添加控件变量 前两讲中讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 例程Addition是 ...
- VS2010/MFC对话框一:创建对话框模板和修改对话框属性
创建对话框主要分两大步: 第一,创建对话框资源,主要包括创建新的对话框模板.设置对话框属性和为对话框添加各种控件: 第二,生成对话框类,主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 创建 ...
- VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)
原文地址:http://www.jizhuomi.com/software/166.html 上一讲鸡啄米讲了属性页对话框和相关的两个类CPropertyPage类和CPropertySheet类,对 ...
- VS2010/MFC对话框二:为对话框添加控件)
为对话框添加控件 创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件. 上一讲中创建了一个名 ...
- MFC编程入门之十二(对话框:非模态对话框的创建及显示)
上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 非模态对话框显示后,程序其他窗口仍然能正常运行,可以响应用户输入,还可以相互切换.上一讲中创建的Tip模态对话框 ...
- MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)
本节开始为大家讲解偏向应用的知识--创建对话框. 对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,360安全卫士的主界面其实就是对话框,知识它做了很多美工方面的工作,将其大大美 ...
- 【转】VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)
原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下, ...
- VS2010/MFC对话框:非模态对话框的创建及显示
非模态对话框的创建及显示 上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切 ...
- VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)
上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...
随机推荐
- 四核网络机顶盒芯片局势分析(开放市场):rk3128将会成为四核主流
开放市场:不包含小米.乐视等大品牌闭环生态系统的市场. 今年四核网络播放器以全志的a31s独领风骚.英菲克以绝对优势率先各大白牌品牌公司.只是随着时间的推移,全志的a31s不适应市场主流.因为芯片没有 ...
- JS年月日三级联动下拉框日期选择代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- java思考题
1.仔细阅读示例: EnumTest.java,运行它,分析运行结果? 你能得到什么结论?你掌握了枚举类型的基本用法了吗? public class EnumTest { public static ...
- Android 学习开发笔记《Service 与 Thread 的区别 》
很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...
- PHP请求第三方接口的函数
<?php public function HttpGet($url){ $curl = curl_init (); curl_setopt ( $curl, CURLOPT_URL, $url ...
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3054 Solved: 1162[Submit][S ...
- C语言(2)--数据类型
C语言中提供多种不同的数据类型,用以存放不同的数据. 1.常见的基本类型有:int-->整型 float-->浮点型 double-->双精度浮点型 char-->字符型 NO ...
- 细说SSO单点登录(转)
什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...
- android 大小写转换
private void toUpperCase(byte[] data, int start, int len) { int end = start + len; int dist = 'A' - ...
- kinect for windows - DepthBasics-D2D详解之三
这篇文章我们将总结一下,之前两篇文章中提到的Kinect SDK的函数接. 函数接口: NuiGetSensorCount: 获取连接的Kinect设备个数 原型:_Check_return_ HRE ...