1. 程式人生 > >MFC動態建立dialog,純程式碼建立dialog

MFC動態建立dialog,純程式碼建立dialog

參考:https://www.cnblogs.com/lidabo/p/3447007.html

大概思路:新增一個類,作為對話方塊模板

DlgTemplate.h

#pragma once

#include "afx.h"

#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);
};

DlgTemplate.cpp

#include "DlgTemplate.h"

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

自己的對話方塊

myDlg.h

#pragma once
#include <afxdialogex.h>
#include "DlgTemplate.h"

class myDlg : public CDialog
{
public:
	myDlg();
	~myDlg();
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);
};

myDlg.cpp

#include "myDlg.h"
#include "commonlog.h"
#include "DlgTemplate.h"


myDlg::myDlg()
{
	m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_APPLICATION);
}
myDlg::~myDlg()
{
}
void myDlg::DoDataExchange(CDataExchange* pDX)
{
}

BOOL myDlg::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 myDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	if (m_hIcon)
	{
		SetIcon(m_hIcon, TRUE);   // 設定大圖示
		SetIcon(m_hIcon, FALSE);  // 設定小圖示
	}

	return TRUE;
}


void myDlg::OnOK()
{
	CDialog::OnOK();
}

呼叫模態對話方塊:

	myDlg am;

	am.CreateModeDlg(_T("ttt"), CRect(0, 0, 100, 100), TRUE, this);

	am.DoModal();

DoModal()有返回值,可以處理一下

對用非模態對話方塊

就是bMode改為false

顯示就是am.ShowWindow(SW_SHOW);